Access - FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

 
Vista:
sin imagen de perfil
Val: 14
Ha disminuido su posición en 8 puestos en Access (en relación al último mes)
Gráfica de Access

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Paco (9 intervenciones) el 31/03/2020 19:41:52
Hola buenos días,

Estoy haciendo un formulario de entrada en Access con redireccionamiento según el perfil elegido: Consulta, Gestión, Administrador.

Os rogaría me echaran una mano para ver donde está el error.

He creado una tabla llamada Usuarios con los campos: ID_Usuario, Usuario, Contraseña, Activo, Nivel_Seguridad

De un comboBox elijo el perfil, pongo la contraseña y tras 2 segundos cierra el formulario Login y abre el principal segun el perfil elegido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Private Sub cmd_Login_Click()
 
Dim UserLevel As Integer
Dim strUsuario As String
Dim strContraseña As String
 
 
strUsuario = Nz(Me.cbo_Usuario, "") 'combo para elegir los usuarios
strContraseña = Nz(Me.txt_Password, "")
 
' Ocultamos la etiqueta de mensajes
Me.lbl_Etiqueta.Visible = False
 
If IsNull(Me.cbo_Usuario) Then
 
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("Elija un Usuario de la lista.")
        'Centramos el foco en el textbox
        Me.cbo_Usuario.SetFocus
        ' Cancelamos la ejecución del código
        Exit Sub
 
    ElseIf IsNull(Me.txt_Password) Then
 
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("Introduzca una contraseña.")
        ' Centramos el foco en el textbox de la contraseña
        Me.txt_Password.SetFocus
        ' Cancelamos la ejecución del código
        Exit Sub
    Else
 
        If (IsNull(DLookup("[Usuario]", "Usuarios", "[Usuario] ='" & Me.cbo_Usuario.Value & _
        "' And Contraseña = '" & Me.txt_Password.Value & "'"))) Then
            Call MensajeEtiqueta("Usuario y/o Contraseña incorrectos.")
        Else
            UserLevel = DLookup("Nivel_Seguridad", "Usuarios", "Usuario = '" & Me.cbo_Usuario.Value & "'")
 
            If UserLevel = 1 Then
                Call MensajeEtiqueta("Entrando en modo Consulta.")
                Me.TimerInterval = 2000
                DoCmd.OpenForm "Formulario1"
                DoCmd.Close acForm, Me.Name
 
 
            ElseIf UserLevel = 2 Then
                Call MensajeEtiqueta("Entrando en modo Gestion.")
                Me.TimerInterval = 2000
                DoCmd.OpenForm "Formulario2"
                DoCmd.Close acForm, Me.Name
 
            ElseIf UserLevel = 3 Then
                Call MensajeEtiqueta("Entrando en modo Administrador.")
                Me.TimerInterval = 2000
                DoCmd.OpenForm "Formulario3"
                DoCmd.Close acForm, Me.Name
 
            End If
    End If
End If
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Anonimo (3314 intervenciones) el 01/04/2020 01:45:04
Si al inicio se definen unas variables y se les asigna valor:

1
2
3
4
5
6
Dim strUsuario As String
Dim strContraseña As String
 
 
strUsuario = Nz(Me.cbo_Usuario, "") 'combo para elegir los usuarios
strContraseña = Nz(Me.txt_Password, "")

Porque no se utiliza aquí:

1
If IsNull(Me.cbo_Usuario) Then

De esta forma:

1
If strUsuario ="" Then

Lo plantearía de forma diferente (menos vueltas para llegar al mismo sitio)

No concatenaría evaluaciones, si se detecta error, se envía un mensaje y se sale ¿Qué ventaja tiene concatenar algo?

Lo mismo pero bajo otro prisma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Private Sub cmd_Login_Click()
 
Dim UserLevel As Integer, strUsuario As String, strContraseña As String
strUsuario = Nz(Me.cbo_Usuario, "") 'combo para elegir los usuarios
strContraseña = Nz(Me.txt_Password, "")
 
' Ocultamos la etiqueta de mensajes
Me.lbl_Etiqueta.Visible = False
 
If strUsuario = "" Then
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("Elija un Usuario de la lista.")
        'Centramos el foco en el textbox
        Me.cbo_Usuario.SetFocus
        ' Cancelamos la ejecución del código
        Exit Sub
        End If
 
If strContraseña = "" Then
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("Introduzca una contraseña.")
        ' Centramos el foco en el textbox de la contraseña
        Me.txt_Password.SetFocus
        ' Cancelamos la ejecución del código
        Exit Sub
        End If
If (IsNull(DLookup("[Usuario]", "Usuarios", "[Usuario] ='" & strUsuario & _
        "' And Contraseña = '" & strContraseña & "'"))) Then
            Call MensajeEtiqueta("Usuario y/o Contraseña incorrectos.")
' aqui se le mandaria a uno de los combos (usuario/contraseña) y se saldría para que lo vuelva a intentar
    End If
 
' si llegamos aquí, hemos pasado el filtro y tenemos usuario y contraseña validos: a por su nivel
UserLevel = DLookup("Nivel_Seguridad", "Usuarios", "Usuario = '" & strUsuario & "'")
 
' reutilizamos las variables strContraseña y strUsuario que en este punto ya no tienen utilidad
 
Select Case UserLevel
    Case 1
        strContraseña = "Entrando en modo Consulta."
        strUsuario = "Formulario1"
    Case 2
        strContraseña = "Entrando en modo Gestion."
        strUsuario = "Formulario2"
    Case 3
        strContraseña = "Entrando en modo Administrador."
        strUsuario = "Formulario3"
    End Select
 
    Call MensajeEtiqueta(strContraseña)
    Me.TimerInterval = 2000
    DoCmd.OpenForm strUsuario
    DoCmd.Close acForm, Me.Name
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 14
Ha disminuido su posición en 8 puestos en Access (en relación al último mes)
Gráfica de Access

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Paco (9 intervenciones) el 01/04/2020 18:48:33
He compilado el codigo que tan amablemente me has adjuntado y me sale el siguiente error: ERROR 94, uso no válido de Null.

1
2
' si llegamos aquí, hemos pasado el filtro y tenemos usuario y contraseña validos: a por su nivel
UserLevel = DLookup("Nivel_Seguridad", "Usuarios", "Usuario = '" & strUsuario & "'")

he metido un punto de interrupcion y el valor de UserLevel = 0

tengo dos tablas vinculadas: USUARIOS Y USUARIOS_NIVEL, la relacion esta entre ID_NIVEL (usuarios_nivel) y Nivel_Seguridad (usuarios)

alguna sugerencia? gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Anonimo (3314 intervenciones) el 02/04/2020 00:22:33
La función DLookup devuelve el dato de la tabla (o conjunto de datos) que cumpla las condiciones, no tengo datos reales, solo los expuestos y si devuelve un NULL es que no ha encontrado un dato que cumpla las condiciones.

No veo razón alguna para que el nivel de acceso este en una tabla aparte (que lo estuviese la contraseña ….)

Yo pondría el nivel como un atributo mas del usuario y la tabla usuarios_nivel la dejaría inoperante (al menos para esta funcionalidad).

Por cierto, si 'donde están los niveles' es en la tabla [Usuarios_Nivel] ¿Por qué se le busca (en el DLookup) en la tabla [Usuarios]?

Sin datos reales, es difícil seguir la pista de un método de programar que es desconocido.

Anoto:
El valor de UserLevel es cero porque es el valor que toma por defecto al definir su tipo y se le define como integer (= numérico, valor por defecto CERO y no admite NULOS) por eso salta el error, se debería verificar 'donde esta' lo que se busca y construir la función DLookup de forma adecuada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 14
Ha disminuido su posición en 8 puestos en Access (en relación al último mes)
Gráfica de Access

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Roberto (9 intervenciones) el 02/04/2020 10:39:15
Hola de nuevo,

Acabo de hacer las reformas que has sugerido pero sigue sin funcionarme y ya no entiendo porqué.
he revisado los tipos de datos y los campos que recogen los datos y parece que esta todo correcto.

Te rogaría le echaras un vistazo al adjunto, a ver donde he cometido el error.

gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Anonimo (3314 intervenciones) el 02/04/2020 15:00:33
No has hecho lo que he sugerido:

' aqui se le mandaria a uno de los combos (usuario/contraseña) y se saldría para que lo vuelva a intentar

Al faltar esa parte Access considera que no hay nada que hacer y continua el proceso (con cualquier combinación de usuario y contraseña) por lo que si 'no acertó ' dará error al intentar obtener el nivel de usuario.

Si se modifica así esa parte:

1
2
3
4
5
6
7
8
9
If (IsNull(DLookup("[Nombre_Usuario]", "Usuarios", "[Nombre_Usuario] ='" & strUsuario & _
        "' And Contrase?a = '" & strContrase?a & "'"))) Then
             Call MensajeEtiqueta("Usuario y/o Contrase?a incorrectos.")
            Me.cbo_Usuario = ""
            Me.cbo_Usuario.SetFocus
            Exit Sub
' aqui se le mandaria a uno de los combos (usuario/contrase?a)
'y se saldr?a para que lo vuelva a intentar.
    End If

Solo continuaría si existe un usuario y contraseña que cumplan -como binomio- las condiciones

Personalmente modificaría el origen de datos del combo usuarios, su actual origen de la fila es:

1
SELECT Usuarios.ID_Usuario, Usuarios.Nombre_Usuario, Usuarios.Contraseña, Usuarios.Nivel_Seguridad FROM Usuarios;

Propongo este:
EXIGE: cambiar en la pestaña formato del combo el numero de filas a una y borrar el cero en el apartado ancho de columnas

1
SELECT Nombre_Usuario FROM Usuarios WHERE activo <> 0

Asi se puede dejar fuera a quien se desee o se pueden crear mas usuarios y activarlos (con un click en la tabla) a voluntad


Asumiendo que se modifico el combo usuario (es peligroso que estén en el datos sensibles que no se utilizan) propongo esta alternativa (en limpio y sin comentarios):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private Sub cmd_Login_Click()
Dim UserLevel As Integer, strUsuario As String, strContraseña As String
strUsuario = Nz(Me.cbo_Usuario, "")
strContrase?a = Nz(Me.txt_Password, "")
Me.lbl_Mensaje.Visible = False
If strUsuario = "" Then MensajeEtiqueta ("Elija un Usuario de la lista."): Me.cbo_Usuario.SetFocus: Exit Sub
If strContraseña = "" Then Call MensajeEtiqueta("Introduzca una contraseña."): Me.txt_Password.SetFocus: Exit Sub
If DCount("*", "Usuarios", "[Nombre_Usuario] ='" & strUsuario & "' And Contraseña = '" & strContraseña & "'") = 0 Then
    Call MensajeEtiqueta("Usuario y/o Contraseña incorrectos.")
    Me.cbo_Usuario = ""
    Me.cbo_Usuario.SetFocus
    Exit Sub
    End If
UserLevel = DLookup("Nivel_Seguridad", "Usuarios", "Nombre_Usuario = '" & strUsuario & "'")
Select Case UserLevel
    Case 1
        strContraseña = "Entrando en modo Consulta."
        strUsuario = "Formulario1"
    Case 2
        strContrase?a = "Entrando en modo Gestion."
        strUsuario = "Formulario2"
    Case 3
        strContrase?a = "Entrando en modo Administrador."
        strUsuario = "Formulario3"
    End Select
MensajeEtiqueta (strContraseña)
    Me.TimerInterval = 2000
    DoCmd.OpenForm strUsuario
    DoCmd.Close acForm, Me.Name
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 14
Ha disminuido su posición en 8 puestos en Access (en relación al último mes)
Gráfica de Access

FORMULARIO CON LOGIN Y ACCESO SEGUN NIVEL

Publicado por Roberto (9 intervenciones) el 10/04/2020 09:52:09
muchas gracias por tu ayuda, ya lo tengo en funcionamiento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar