Como validar estado usuario antes de acceder a BD Access

Comunidad nuevamente, sigo trabajando y aprendiendo... Podrían ayudarme con algo nuevo que necesito generar. En mi BD tengo una tabla donde registro a los usuarios con sus claves respectivas, ademas un campo donde le indico si la cuenta esta "ACTIVA, BLOQUEADA o TEMPORAL", esta ultima le tengo una fecha hasta donde puede acceder a la BD.

Pues bien tengo un código que me valida al usuario y contraseña, si corresponde me abre formulario asignado y me crea registro en otra tabla donde llevo el control de ingreso, de no ser validado al tercer intento se cierra. Este es mi código:

Private Sub validaUsuario()
    Dim IdUsuario As Integer
        If InStr(Me.TxtUsuario, "'") = 0 And InStr(Me.TxtUsuario, "'") = 0 Then
        If DCount("*", "Tabla_Usuarios", "[Usuario] = '" & Me.TxtUsuario & "' AND [pass] = '" & Me.TxtContrasena & "'") Then
            IdUsuario = DLookup("[Id_Usuario]", "Tabla_Usuarios", "[Usuario]= '" & Me.TxtUsuario & "' AND [pass] = '" & Me.TxtContrasena & "'")
        MsgBox "USUARIO ENCONTRADO", vbInformation, "Avíso"
    DoCmd. RunSQL "insert into Tabla_RegistroUsuarios(usuario, fecha, horaentrada)values(TxtUsuario, date(), time())"
    DoCmd.OpenForm "PORTADA_ACCESO", , , , , , IdUsuario
    DoCmd.Close acForm, "LOGIN"
    Else
        Contador = Contador + 1
    MsgBox "Usuario o contraseña no corresponde " & Me.[TxtUsuario], vbOKOnly + vbInformation, "Aviso, llevas " & Me.Contador & " intento(s)"
    DoCmd.CancelEvent
    TxtContrasena.Value = ""
    TxtContrasena.SetFocus
        If Contador = 3 Then
        MsgBox "Usuario no validado, aplicación se cerrara", vbOKOnly + vbCritical, "USUARIO INVALIDADO..."
        DoCmd.Quit
        End If
    End If
End If
End Sub

Lo que necesito es que al momento de validar al usuario y su contraseña, también me valide que la cuenta esta "ACTIVA". De estar "BLOQUEADA" me arroje un mensaje y cancele el evento. De estar en "TEMPORAL"  valide la fecha asignada con la del sistema y si es mayor prosiga con el acceso, pero que le avise cuantos días le quedan antes que se bloquee al llegar a la misma fecha del sistema. Y por ultimo que al tercer intento de ingresar el usuario con datos que no corresponden y antes que se cierre el formulario me permita cambiar el estado del usuario a "BLOQUEADO" en la tabla Usuarios.

2 Respuestas

Respuesta
2

Por ejemplo, si tengo las tabla Usuarios, donde he dejado a la vista la contraseña, aunque deberías ponerle la máscara de entrada.

Cuando abro el formulario de Login, aunque por comodidad le he puesto también Usuarios y escribo al amigo Adrián

Y pulso el botón validar aunque no sería necesario el botón, me abre sin problemas el formulario

Si hubiera escrito al amigo Juan

Pero mientras dure la "validez" se repite lo de arriba. Cuando la validez llega a cero te pone un mensaje, actualiza lo de Temporal a bloqueado y lo manda a la mier... se cierra.

y en el caso del caradura de Pepe, que no ha querido renovar la suscripción

Acepta y se cierra la aplicación hasta que reúna la pasta para pagar.

El código es

Private Sub Comando15_Click()
If Nz(DCount("usuario", "usuarios", "contraseña = forms!usuario!contraseña and usuario=forms!usuario!usuario and cuenta=""Activa""")) >= 1 Then
    DoCmd.SetWarnings False
    DoCmd.RunSQL "insert into registro(usuario,fecha,hora)values(Usuario,date(),time())"
    DoCmd.OpenForm "Clientes"
ElseIf Nz(DCount("usuario", "usuarios", "contraseña = forms!usuario!contraseña and usuario=forms!usuario!usuario and cuenta=""Bloqueada""")) >= 1 Then
MsgBox "Tu cuenta está bloqueada", vbOKOnly, "Adios"
Application.Quit
ElseIf Nz(DCount("usuario", "usuarios", "contraseña = forms!usuario!contraseña and usuario=forms!usuario!usuario and cuenta=""Temporal""")) >= 1 Then
    Dim d
    d = DLookup("fechavalidez", "usuarios", "usuario='" & Me.Usuario & "'") - Date
    If d > 7 Then
    DoCmd.RunSQL "insert into registro(usuario,fecha,hora)values(Usuario,date(),time())"
    DoCmd.OpenForm "Clientes"
    ElseIf d <= 7 Then
    MsgBox "Piénsalo, te quedan " & d & " días", vbOKOnly, "El que avisa no es traidor"
        DoCmd.RunSQL "insert into registro(usuario,fecha,hora)values(Usuario,date(),time())"
    DoCmd.OpenForm "Clientes"
    ElseIf d = 0 Then
    MsgBox "Se acabó", vbOKOnly + vbInformation, "Renueva la suscripción"
    DoCmd.RunSQL "update usuarios set cuenta=""Bloqueada"" where usuario='" & Me.Usuario & "'"
    DoCmd.Quit
    End If
Else
    Contador = Contador + 1
    MsgBox "No eres " & Me.[Usuario], vbOKOnly, "Aviso, llevas " & Me.Contador & " intento(s)"
    DoCmd.CancelEvent
        If Contador = 3 Then
        MsgBox "Como he comprobado que no eres quien dices me cierro", vbOKOnly + vbCritical, "Otra vez será"
        DoCmd.Quit
        End If
End If
End Sub

¡Gracias! Julián... lo implemente funciona impeque también... solo quiero ver como agrego el campo fechabloqueo a esta línea.

DoCmd.RunSQL "update usuarios set cuenta=""Bloqueada"" where usuario='" & Me.Usuario & "'"

Antes de nada, en el primer If estás duplicando la misma condición

If InStr(Me.TxtUsuario, "'") = 0 And InStr(Me.TxtUsuario, "'") = 0 Then

Por otro lado, en la instrucción que citas puedes concatenar hasta 99 condiciones AND ó OR, por ejemplo

docmd.runsql"Update..............usuario & "' and Fechabloqueo >Date +....and Ciudad=""Londres"" and Nombre=""Juan"""

ó

docmd.runsql"update..........where fechabloqueo between [fechainicial] and [fechafinal] OR cuenta=""Bloqueada"" and estado=""Cuarentena"""

¡Gracias! Julián... lo pondré en practica y gracias por la explicación, esto me ayuda para otros comando que estoy tratando de ejecutar...

Gracias por tu tiempo y conocimientos... un saludo...

Respuesta
2

Otra forma de hacer lo mismo, pero con otra organización del código:

Private Sub validaUsuario()
  Dim IdUsuario As Integer
  Dim elEstado As String
  Dim laFecha As Date
  If InStr(Me.TxtUsuario, "'") = 0 And InStr(Me.TxtUsuario, "'") = 0 Then
    If DCount("*", "Tabla_Usuarios", "[Usuario] = '" & Me.TxtUsuario & "' AND [pass] = '" & Me.TxtContrasena & "'") Then
       IdUsuario = DLookup("[Id_Usuario]", "Tabla_Usuarios", "[Usuario]= '" & Me.TxtUsuario & "' AND [pass] = '" & Me.TxtContrasena & "'")
       elEstado = DLookup("[Estado]", "Tabla_Usuarios", "[Id_Usuario]=" & IdUsuario)
       Select Case elEstado
          Case "ACTIVA"  'Si la cuenta está activa, permites el acceso
             MsgBox "USUARIO ENCONTRADO", vbInformation, "Avíso"
             CurrentDb. Execute "insert into Tabla_RegistroUsuarios(usuario, fecha, horaentrada)values(TxtUsuario, date(), time())"
             DoCmd.OpenForm "PORTADA_ACCESO", , , , , , IdUsuario
             DoCmd.Close acForm, "LOGIN"
          Case "BLOQUEADA"  'Si la cuenta está bloqueada, deniegas el acceso
             MsgBox "USUARIO BLOQUEADO", vbInformation, "Avíso"
          Case "TEMPORAL"   'Si la cuenta tiene acceso temporal...
             laFecha = DLookup("[Fecha_Caducidad]", "Tabla_Usuarios", "[Id_Usuario]=" & IdUsuario)
             If laFecha >= Date Then   '...si la fecha de caducidad es superior a la del sistema, accedes e informas de los días que quedan
                MsgBox "USUARIO ENCONTRADO LE QUEDAN " & Abs(DateDiff("d", laFecha, Date)) & " DIAS DE ACCESO", vbInformation, "Avíso"
                CurrentDb. Execute "insert into Tabla_RegistroUsuarios(usuario, fecha, horaentrada)values(TxtUsuario, date(), time())"
                DoCmd.OpenForm "PORTADA_ACCESO", , , , , , IdUsuario
                DoCmd.Close acForm, "LOGIN"
             Else                      '....si no, deniegas el acceso
                 MsgBox "USUARIO BLOQUEADO", vbInformation, "Avíso"
             End If
       End Select
    Else
       Contador = Contador + 1
       MsgBox "Usuario o contraseña no corresponde " & Me.[TxtUsuario], vbOKOnly + vbInformation, "Aviso, llevas " & Me.Contador & " intento(s)"
       DoCmd.CancelEvent
       TxtContrasena.Value = ""
       TxtContrasena.SetFocus
       If Contador = 3 Then
         MsgBox "Usuario no validado, aplicación se cerrara", vbOKOnly + vbCritical, "USUARIO INVALIDADO..."
         'Como falló 3 veces la contraseña, bloqueas al usuario:
         CurrentDb.Execute "UPDATE Tabla_RegistroUsuarios SET Estado='BLOQUEADO' WHERE [Usuario]= '" & Me.TxtUsuario & "'"
         DoCmd.Quit
       End If
    End If
  End If
End Sub

He supuesto que los campos en la tabla tabla_RegistroUsuarios se llaman "Estado" y "Fecha_Caducidad", y si no me equivoqué (ya que no lo puedo probar) al escribir el código, debería hacer todo lo que pides, incluido el bloqueo del usuario al fallar 3 veces la contraseña.

Gracias Sveinbjorn El Rojo, por la respuesta funciona a la perfección... solo una pregunta más, a esta línea

CurrentDb.Execute "UPDATE Tabla_RegistroUsuarios SET Estado='BLOQUEADO' WHERE [Usuario]= '" & Me.TxtUsuario & "'"

Como le puedo agregar el campo FechaBloqueo, es para validar el día que se genero el bloqueo

Pues así:

CurrentDb.Execute "UPDATE Tabla_RegistroUsuarios SET Estado='BLOQUEADO',FechaBloqueo=#" & Date & "# WHERE [Usuario]= '" & Me.TxtUsuario & "'"

o así:

CurrentDb.Execute "UPDATE Tabla_RegistroUsuarios SET Estado='BLOQUEADO',FechaBloqueo=Date WHERE [Usuario]= '" & Me.TxtUsuario & "'"

¡Gracias! Sveinbjorn El Rojo, funciona la primera línea a la perfección... agradeciendo su tiempo y conocimientos...

Muchas gracias...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas