Incompatibilidad de variables en un evento

Hola apreciadísimo experto.
El formulario de autentificación me sigue dando quebraderos de cabeza. He intentado que cada usuario tenga 3 intentos de acceso por sesión y que se compruebe si el usuario tiene el acceso bloqueado y si es así se cierre la aplicación. Pero no se que he hecho mal para que no funcione. El código que utilizo es el siguiente:
Private Sub Aceptar_Click()
Dim Permiso As Integer
Dim rst As Recordset
Set Permiso = CurrentDb.OpenRecordset("Select Password From Usuarios where Password = '" & Forms![frmAutentificar]![Password].Value & "'")
'Set rst = CurrentDb.OpenRecordset("Select Bloqueado From Usuarios where NombreUsuario = '" & Forms![frmAutentificar]![NombreUsuario].Value & "'")
If rst!Bloqueado = True Then
Me.NombreUsuario.Value = ""
Me.Password.Value = ""
Me.NombreUsuario.SetFocus
MsgBox "Usuario no autorizado o con password bloqueada", vbCritical, " ¡ ATENCIÓN !  Acceso denegado                        "
DoCmd.Close acForm, "frmAutentificar"
End If
'Permiso = DLookup("[Usuarios].[Password]", "[Usuarios]", "[Password] Like '" & Forms![frmAutentificar]![Password].Value & "*'")
If Intentos >= 3 Then
    MsgBox "Usuario no autorizado o con password bloqueada", vbCritical, " ¡ ATENCIÓN !  Acceso denegado                        "
    DoCmd.Close acForm, "frmAutentificar"
End If
If Permiso = Forms![frmAutentificar]![Password].Value Then
    Intentos = 0
    DoCmd.Close acForm, "frmAutentificar"
    DoCmd.OpenForm "PANEL DE CONTROL"
    Else
    Intentos = Intentos + 1
    If Intentos = 1 Then
    'MsgBox " " & Intentos & "º intento de Permiso fallido, le quedan dos más ", 48, " ¡ ATENCIÓN ! Clave de acceso incorrecta "
    MsgBox "Primer intento de acceso fallido, le quedan dos más ", 48, "      ¡ ATENCIÓN !  Clave de acceso incorrecta          "
    Password.SetFocus
    Me.Password.Value = ""
    Exit Sub
    ElseIf Intentos = 2 Then
    MsgBox "Segundo intento de acceso fallido, le queda otro intento       ", 48, "      ¡ ATENCIÓN !  Clave de acceso incorrecta               "
    Password.SetFocus
    Me.Password.Value = ""
    Exit Sub
    ElseIf Intentos >= 3 Then
    MsgBox "Tercer intento de acceso fallido, no le quedán más intentos ", 48, "      ¡ ATENCIÓN !  Clave de acceso incorrecta               "
    MsgBox "Usuario no autorizado o con password bloqueada", vbCritical, " ¡ ATENCIÓN !  Acceso denegado                        "
    DoCmd.Close acForm, "frmAutentificar"
    Exit Sub
    End If
    End If
End Sub
Y el caso es que la primera parte del código:
Dim rst As Recordset
'Set rst = CurrentDb.OpenRecordset("Select Bloqueado From Usuarios where NombreUsuario = '" & Forms![frmAutentificar]![NombreUsuario].Value & "'")
If rst!Bloqueado = True Then
Me.NombreUsuario.Value = ""
Me.Password.Value = ""
Me.NombreUsuario.SetFocus
MsgBox "Usuario no autorizado o con password bloqueada", vbCritical, " ¡ ATENCIÓN !  Acceso denegado                        "
End If
Así como el restante código, cuando lo separo y lo pongo en eventos diferentes, si que todo funciona, pero necesito que todo esté dentro del evento Aceptar_Click(), ya que cuando un usuario agote sus tres intentos quiero que el campo Bloqueado de la tabla Usuarios se almacene como TRUE.
También he pensado, que para evitar que cualquier usuario espabilado pueda burlar mi seguridad (cambiando de nombre tras el primer intento fallido), guardar el número de intentos en un campo de la tabla "Usuarios", pero no se como hacerlo.

1 respuesta

Respuesta
1
Por orden:
1 .- La variable 'Permiso' la tienes definida como integer y abres un recordset sobre ella.
2 .- No abres 'rst' porque la línea está comentada y después la utilizas.
Te envío un código que podría hacer lo que buscas. Habrá cosas que no entiendas pero está intentando evitar que se entre utilizando usuarios y claves extraños que podrían hacer saltar las consultas. Por ejemplo el usuario (' and '1'='1) con la misma clave puede llegar a engañar a un control que no lo evite.
Private Sub Aceptar_Click()
    Dim rst As Recordset
    Dim txtSql As String
    Dim snOk As Boolean
    Dim snBloqueado As Boolean
    txtSql = "select * from Usuarios where " & _
             "NombreUsuario = '" & Forms![frmAutentificar]![NombreUsuario].Value & "' and " & _
             "Password = '" & Forms![frmAutentificar]![Password].Value & "'"
    On Error Resume Next
    Set rst = currentdb().OpenRecordset(txtSql)
    If Err <> 0 Then
        ' OJO han introducido un Usuario y/o Password con caracteres raros.
        ' Posiblemente el usuario y/o clave tengan una comilla
        snOk = False
      Else
        snOk = Not rst.EOF ' Ha encontrado algún registro (cuidado, puede haber trampa)
    End If
    On Error GoTo 0
    If snOk Then ' Volvemos a comprobar que sea el usuario/password (no hay trampa)
        rst.MoveFirst
        snOk = (rst!NombreUsuario = Forms![frmAutentificar]![NombreUsuario].Value) And _
               (rst!NombreUsuario = Forms![frmAutentificar]![NombreUsuario].Value)
        snBloqueado = rst!bloqueado
    End If
    rst.Close ' Ya hemos leido todo lo necesario
    ' Si el usuario es correcto y está bloqueado...
    If snOk And snBloqueado Then
        MsgBox "Usuario no autorizado o con password bloqueada", vbCritical, " ¡ ATENCIÓN !  Acceso denegado                        "
        DoCmd.Close acForm, "frmAutentificar"
        Exit Sub
    End If
    ' Ya sabemos que no está bloqueado. Si puede pasar o no nos lo dice snOk
    If snOk Then
        intentos = 0    ' Ya entra y quitamos el contador de errores
        DoCmd.Close acForm, "frmAutentificar"
        DoCmd.OpenForm "PANEL DE CONTROL"
      Else
        intentos = intentos + 1 ' Un fallo más
        Select Case intentos
            Case 1: MsgBox "Primer intento de acceso fallido, le quedan dos más ", 48, "      ¡ ATENCIÓN !  Clave de acceso incorrecta          "
            Case 2: MsgBox "Segundo intento de acceso fallido, le queda otro intento       ", 48, "      ¡ ATENCIÓN !  Clave de acceso incorrecta               "
            Case Else:
                MsgBox "Tercer intento de acceso fallido, no le quedán más intentos ", 48, "      ¡ ATENCIÓN !  Clave de acceso incorrecta               "
                MsgBox "Usuario no autorizado o con password bloqueada", vbCritical, " ¡ ATENCIÓN !  Acceso denegado                        "
                DoCmd.Close acForm, "frmAutentificar"
                Exit Sub
        End Select
        ' Si no ha salido del proceso es porque lleva 1 o 2 intentos
        Password.SetFocus
        Me.Password.Value = ""
    End If
End Sub
Un detalle. Donde pone:
snOk = (rst!NombreUsuario = Forms![frmAutentificar]![NombreUsuario].Value) And _
               (rst!NombreUsuario = Forms![frmAutentificar]![NombreUsuario].Value)
Debería poner:
snOk = (rst!NombreUsuario = Forms![frmAutentificar]![NombreUsuario].Value) And _
       (rst!Password = Forms![frmAutentificar]![KeyPassword].Value)
Al copiar una línea en otra he puesto 2 veces el control del usuario en lugar de controlar usuario y password.
Muchas gracias de nuevo Santiago. Tienes razón hay algunas cosas del código que no entiendo, como por ejemplo "snOk = Not rst.EOF", pero lo probaré, seguro que resuelve mi problema.
¡Ah! Se me olvidaba puedes ayudarme con algo que seguramente debe de ser sencillo, pero que no consigo hacer funcionar.
Al perder el enfoque o al salir de un TexBox, se comprueba que reúne las condiciones adecuadas, pero si no es así, quiero que tras mostrar el correspondiente Msgbox, el foco retorne al TexBox en el que estaba.
He probado a hacerlo con: Me.TexBox. Setfocus, Me!TexBox. Setfocus y con TexBox. Setfocus, pero no funcionan ninguna de las tres y el foco se queda donde está (que es el siguiente TexBox)
Muchas gracias por enésima vez amigo Santiago.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas