Login y password en access

Tengo una base de datos en la que tengo las tablas...

Personal : nombre, apellidos, dni, login y password, etc...

Acceso: con el tipo de acceso de los usuario(administrador y usuario)

Un formulario donde hago el ingreso llamado: Ingreso

Y otro formulario llamado: Partes de Hora año actual

Mi pregunta es ¿Cómo hago para que cuando un usuario ingrese su login y su password le dirija al único formulario donde tiene que meter sus horas?

Recordar que solo existe un ÚNICO formulario para todos los usuarios, la dificultad esta en como relaciono ese login y password al trabajador y no pueda escoger otro nombre de trabajador en ese formulario.

Adjunto unas fotos para que entendáis mejor.

<a></a>

En la ultima foto veis como puedo elegir al otro personal aun entrando con mi clave y password.

2 respuestas

Respuesta
1

Se me ocurre una posible solución.

Estoy suponiendo que el botón ingresar tiene asociado un procedimiento de evento.

Lo que haría yo es en ese evento llamar al formulario partehora pasando un parámetro de entrada con el nombre del usuario.

En el evento Form Open de partehora haz que el campo sea el valor del parámetro pasado, y que el campo sea de texto, no un desplegable.

Si no lo ves claro avísame y te lo detallo un poco más.

Va por delante que la solución propuesta es usando VBA, no aconsejo hacerlo de otra manera.

si claro, tengo que tener un evento en el botón si no no funciona, tengo este código que lo saque de internet y tuve que modificarlo con los nombre de las tablas, campos etc.....que se podría cambiar en este código???

Private Sub CmdEntrar_Click()
Dim auxContraseña As String
If Nz(Me.TxtLogin.Value, "") = "" Then
MsgBox "Seleccione un nombre de usuario de la lista para acceder", vbInformation, "ATENCIÓN"
Me.TxtLogin.SetFocus
ElseIf Nz(Me.TxtPassword.Value, "") = "" Then
MsgBox "Introduzca la contraseña del usuario seleccionado", vbInformation, "ATENCIÓN"
Me.TxtPassword.SetFocus
Else
If Nz(DLookup("Password", "PERSONAL", "IdRegistroNombre=" & Me![TxtLogin]), "") <> "" Then
auxContraseña = DLookup("Password", "PERSONAL", "IdRegistroNombre=" & Me![TxtLogin])
End If
If auxContraseña <> Me.TxtPassword.Value Then
If NumIntentos > 1 Then
NumIntentos = NumIntentos - 1
MsgBox "La contraseña introducida es incorrecta" & vbCrLf & _
"Le quedan " & NumIntentos & " intentos" & vbCrLf & vbCrLf & _
"Por favor, introduzca otra", vbExclamation, "INTRODUCCIÓN INCORRECTA"
Me.TxtPassword.Value = ""
Me.TxtPassword.SetFocus
Else
MsgBox "Ha superado el numero de intentos", vbCritical, "ADIÓS..."
DoCmd.Close acForm, Me.Name 'y cerramos el de acceso
End If
Else
If DLookup("Id_acceso", "PERSONAL", "IdRegistroNombre=" & Me![TxtLogin]) = 1 Then
MsgBox "Has entrado como Administrador", vbInformation, "BIENVENIDO ADMINISTRADOR"
Call Admin
Else
MsgBox "Has entrado como usuario", vbInformation, "BIENVENIDO USUARIO"
Call Usar
End If
'DoCmd.OpenForm stDocName, , , stLinkCriteria 'Abrimos el formulario correspondiente
DoCmd.Close acForm, Me.Name 'y cerramos el de acceso
End If
End If
End Sub

Perdona por no contestarte antes. Tuve un tema personal que atender.

La verdad es que la función es de todo menos corta. Seguramente será muy segura, pero no entro.

Yo lo simplificaría con un diálogo como el que tenías con dos campos de texto, o un desplegable y un campo de texto (usuario y password) y con dos botones (aceptar y cancelar).

Guarda los datos de login de cada usuario en una tabla de usuarios. Creo que te vale con (yo lo hago siempre así):

Sub BotonAceptar_Click

Dim sqlConsulta as String, registro as Recordset

sqlConsulta = "SELECT password FROM tabla_usuarios WHERE nombre_usuario = '" & usuario & "'"

set registro = currentdb.openrecordset(sqlconsulta)

if registro.fields("password") = me.password then

'correcto

Docmd. Open ac_form,"FormularioDestino",,,, usuario 'este ultimo parámetro es el último de la orden, voy de memoria y no se cuantas comas tiene que haber

else

'incorrecto

Endif

Registro. Close

End Sub

En el FormularioDestino, en la acción Open deberías tratarlo como:

If not isnull(me.openargs) then

'acciones para recuperar el usuario y plantear la información

Endif

Pruébalo así a ver si te va bien

Nota: no te aconsejo que cometas el error de asociar un recordset (tabla o consulta) a un formulario, suele dar problemas, y cuando la cantidad de registros crece se hace muy lento (te hablo de más de 100.000 registros). No ocurre lo mismo si haces un form en blanco, con controles como variables sin estar ligados a ningún campo y lo gestionas tú. Es un poco más complicado de gestionar, pero también te da más libertad.

Ya me dirás como te va.

ufff me salen muchos errores, intento modificarlo todo pero de aquí no paso, mira

Then tiene que estar en la misma linea que if

me sale un color amarillo en la linea del if, no se que hacerle ya :(

Vale

Perdona por ser tan impreciso. Intentaré explicarme mejor.

Veamos. Cuando Access ejecuta un sub o un function, si todo va bien y no hay errores se ejecuta y ya está, no pasa nada más.

Cuando eso no ocurre, es decir, cuando hay algún fallo en el programa como tienes tú ahora, aparece la pantalla de edición de VBA y se marca una línea en amarillo. Lo que te está diciendo Access es que en esa línea hay un error, y te da la oportunidad de resolver ese error. Estás en modo de depuración.

Lo que tienes que hacer ahora es resolver el error.

¿Y cuál es el error?. Te explico el código linea a linea:

La linea del Dim está clara: declaración de dos variables:

SqlConsulta es una cadena

Registro es un Recordset, es decir, el resultado de una consulta metido en una variable

La siguiente linea asigna un valor a sqlConsulta. Lo que hacemos es componer una consulta como si estuviera hecha con el diseñador de consultas, en lenguaje SQL. SQL tiene una sintaxis bastante sencilla, lo que le estamos diciendo es:

Selecciona el valor del campo TxtPassword de la tabla Personal en el registro en que el nombre de empleado sea TxtLogin

La siguiente linea le dice a Access: te paso esta consulta en sql, devuélveme el resultado de la misma en la variable registro.

A continuación decimos:

Si el campo Password del resultado de la consulta es igual al contenido del control password. Ojo no tiene que ir entre comillas, no es lo mismo me. Txtpassword que el contenido del control txtpassword. Entonces

Abre el formulario Partes de Hora año actual (CONSEJO: NO USES ESPACIOS, JUEGA CON MAYÚSCULAS Y MINÚSCULAS Y _, Y NO PONGAS Ñ NI NADA CON ACENTOS)

Pulsa el botón parar, el 11 empezando por la izquierda. Corrige lo que te comento arriba (los consejos no, son consejos), cierra la ventana de VBA, cierra y guarda el formulario y ejecutalo de nuevo.

Y no te desesperes, todos hemos aprendido.

no me sale, he estado mirando este código, dime que te parece....

If IsNull(DFirst("IdRegistroNombre", "PERSONAL", "TxtLogin='" & Nz(TxtLogin, "") & "'")) = True Then
MsgBox "Usuario no registrado"
ElseIf Nz(TxtPassword, "") <> DFirst("TxtPassword", "PERSONAL", "TxtLogin='" & Nz(TxtLogin, "") & "'") Then
Else
DoCmd.OpenForm "Partes de Hora año actual"
End If

No desesperes, yo he depurado miles de lineas de código hasta aprender a escribirlo con pocos errores. No pasa nada. Nadie nace sabiendo.

Veamos: un poco de información, las funciones como DFirst se llaman funciones de dominio agregado. Yo no soy muy partidario de usarlas, ya que suelen ser un poco liosas y siempre hay alternativas. Con los años me he habituado a usar consultas sql, que es lo más útil y preciso.

Te recomiendo también que no abandones un código al primer fallo, te vas a hacer un lío impresionante, y no vas a aprender bien. Lo mejor es tener un código y pelearte con él hasta que lo entiendas. Creo que el código que te pasé es más claro, limpio y corto que el primero que enviaste, y voy a seguir aconsejándote ese código. El motivo es simple: si te acostumbras a programar mediante consultas sql podrás hacer crecer mejor tus aplicaciones, porque habrá momentos en los que tendrás que usarlas sí o sí, por ejemplo para poblar un formulario, o para borrar o modificar un registro.

Las funciones de dominio agregado pueden ser útiles en algunas circunstancias, pero no siempre.

Vamos a ver, vamos a replantearlo desde el principio para aclararnos. Un cuadro de diálogo de login es de lo más sencillo que hay:

Lo que quieres, corrígeme si me equivoco, es que cada vez que un usuario acceda a la aplicación mediante la pantalla de login, se abra la pantalla de partes para ese usuario, que le muestre sólo sus datos y que le saque un mensaje emergente con un diálogo si tiene tareas pendientes.

Vuelvo sobre el código que te dí:

Sub BotonAceptar_Click
Dim sqlConsulta as String, registro as Recordset
sqlConsulta = "SELECT password " & _

"FROM tabla_usuarios " & _

"WHERE nombre_usuario = '" & usuario & "'"
set registro = currentdb.openrecordset(sqlconsulta)
if registro.fields("password") = me.password then
'correcto
Docmd. Open ac_form,"FormularioDestino",,,, usuario

else
'incorrecto
Endif
Registro. Close
End Sub

Cosas que tienes que mirar en tu formulario:

- ¿Cómo se llama el botón de aceptar?. En el ejemplo que te doy se llama BotonAceptar.

- ¿Cómo se llama la tabla en la que guardas los usuarios?. Yo la llamo tabla_usuarios

- ¿Cómo se llama el campo del nombre de usuario en tu tabla?. Yo lo llamo nombre_usuario

- ¿Cómo se llama tu campo de las contraseñas?. Yo lo llamo password

Descárgate este ejemplo y pruébalo. Cuando lo entiendas y te funcione seguiremos para abrir el formulario siguiente, ¿ok?

https://dl.dropboxusercontent.com/u/18742583/todoexpertos/ejemplo_login.mdb

Si es exactamente lo que quiero, que cada trabajador ingrese su id y pass, y le lleve directamente a un formulario donde tenga que introducir sus horarios.

Te puedes creer que lo he probado exactamente igual que el tuyo, (cambiando los nombres de los campos) y nada....

te dejo la base de datos y si puedes me haces el favor de mirarla 1 seg a ver que es lo que tengo mal en el código??

las tablas que solo se usan son" PERSONAL" y "CONTROL DE COSTES AÑO ACTUAL", y los formularios son... "ingreso" para el user y pass, y "partes de hora año actua"l para el formulario que tiene que rellenar los trabajadores.

<a>https://www.dropbox.com/s/aaxq0b011l42v9i/final%20casi%20listo.rar</a>

espero terminar esto antes del lunes :ES, gracias por todo el trabajo que estas teniendo conmigo jaja

Ya está claro.

Te lo escribo porque no vale la pena reenviarte el archivo, además, si lo escribes se te quedará mejor para otra vez que si te lo paso.

Abre el form Ingreso en modo diseño

Antes del private sub inserta una linea en blanco y pones:

Option compare database

Option explicit

Son manías, pero ayuda. El primer comando ayuda a Access a buscar los datos, el segundo fuerza al usuario a definir cada variable que use. A veces es engorroso pero en programas grandes ayuda mucho.

Cambia la orden:

sqlConsulta = "SELECT password FROM PERSONAL WHERE Login = '" & Me.Nombre_Empleado & "'"

por

sqlConsulta = "SELECT password FROM PERSONAL WHERE Nombre_Empleado = '" & Me.Nombre_Empleado & "'"

Es decir, lo que queremos decir con esto es:

Selecciona el campo password de la tabla personal en la que en el nombre de campo Login día el contenido del campo Nombre_Empleado

Prueba a ver y si no te paso una copia

ajaja mira mira y meate de risa xDD

<a></a>

Por dios dime que a ti se te funciona, porque no lo entiendo porque no va....

Ok

Cuando tenga un rato te reenvío el archivo corregido y pruebas a ver si te va

Está claro.

Me pasa por programar de memoria.

Bájate este archivo, es una copia del que tú me pasaste, a ver si te va:

<a>https://dl.dropboxusercontent.com/u/18742583/todoexpertos/final%20casi%20listo.mdb</a>

vale, gracias por mandarme la base de datos, ya arregle mi problema con algo más de código que necesitaba de otra base de datos de un amigo, muchas gracias por tu tiempo y por haberme ayudado tanto :P, visual no es tan fácil como pensaba jajaj, de todas formas muchas gracias.

Respuesta

Quizá a esta alturas ya encontraron la solución, yo nuevo en este foro, pero se que a otros les servirá.

Yo lo resuelvo de la siguiente manera:

Private Sub Ingresar_Click()

Dim sql As String, registro As Recordset
usuario = Me.Texto2
clave = Me.Texto4
sql = "SELECT idusuario from usuarios where usuario='" & usuario & "' and idusuario='" & clave & "'"
Set registro = CurrentDb.OpenRecordset(sql)
If registro.RecordCount > 0 Then
DoCmd.OpenForm "formulario_principal"
Else
MsgBox ("Datos no coinciden")
End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas