viernes, 1 de junio de 2018

Access Complemento de Formulario con Código Parte Final

La solución, será la versión 1.1 del formulario de login. En esta versión, hemos introducido una mejora, una tabla donde gestionar los usuarios de la aplicación, y para que la cosa funcione, hemos de realizar unas cuantas modificaciones en el código VBA.

Paso 1

Empecemos por la parte de la tabla, crearemos una tabla en vista diseño.

  • ID_Usuario (Autonumérico)
  • Nombre (Texto, 50)
  • Apellidos (Texto, 100)
  • Usuario (Texto, 25)
  • Contraseña (Texto, 15)
  • Activo (Si/NO)

Paso 2

Ahora, debemos realizar una ligera modificación en nuestro formulario. Hemos de cambiar el cuadro de texto (textbox) “txt_Usuario” por un cuadro combinado (combobox) “cbo_Usuario” quedando de la siguiente forma.
[full_width]


[/full_width]
En modo diseño del formulario…
En el campo origen de la fila, de la pestaña “Datos” de las propiedades del combobox, agregamos la siguiente sentencia SQL.

Nota: Opcional-mente, la sentencia SQL la puedes generar manualmente, con el generador de consultas.
En la pestaña formato, editaremos las propiedades siguientes:
  • Número de columnas: 2
  • Ancho de columnas: 0cm; 6cm
Con ello, tenemos el nuevo diseño del formulario listo.

Paso 3

Ahora nos resta realizar los cambios oportunos en el código VBA. Para ello, empezaremos creando un módulo estándar, que guardaremos con el nombre “bas_Usuarios” y al que añadiremos el siguiente código.

Option Compare Database
Option Explicit
'---------------------------------------------------------------------
' Procedure : Get_Contraseña
' Author    : Witigo (Angel Campos Muñoz)
' Date      : 22/09/2014
' Purpose   : Obtiene la contraseña del usuario pasado como argumento.
'---------------------------------------------------------------------
'
Public Function Get_Contraseña(intUsuario As Integer) As String
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
    strSQL = "SELECT dbo_Usuarios.Contraseña " & _
                "FROM dbo_Usuarios " & _
                "WHERE ID_Usuario = " & intUsuario & ";"
    Set dbs = CurrentDb()
    Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
Dim strContraseña As String
    
    If rst.RecordCount <> 0 Then
        strContraseña = rst!Contraseña
    
    End If
    
    ' Devolvemos la contraseña
    Get_Contraseña = strContraseña
    
    ' Cerramos el recordset
    rst.Close
    
    ' Borramos los objetos
    Set rst = Nothing
    Set dbs = Nothing
End Function
Esta función, nos devuelve de la tabla “dbo_Usuarios”, la contraseña del usuario pasando como argumento “intUsuario” a la función.

Paso 4

Los cambios a realizar en el código del modulo de formulario, son los siguientes.
Creamos 2 funciones:
La función “Comprueba_Usuario”, que comprueba que el usuario del sistema, haya seleccionado un usuario del combobox, para iniciar sesión.

'---------------------------------------------------------------------
' Procedure : Comprueba_Usuario
' Author    : Witigo (Angel Campos Muñoz)
' Date      : 22/09/2014
' Purpose   : Controla si se ha seleccionado un usuario del combobox
'             cbo_Usuario
'---------------------------------------------------------------------
'
Private Function Comprueba_Usuario() As Boolean
    If IsNull(Me.cbo_Usuario.Value) = True Then
        ' Realizamos mensaje sonoro
        Beep
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("Debe seleccionar un usuario.")
        ' Centramos el foco en el textbox
        Me.cbo_Usuario.SetFocus
        ' Devolvemos FALSE por que no hay ningún usuario
        ' seleccinado en el combobox...
        Comprueba_Usuario = False
    Else
        ' Devolvemos TRUE por que SI hay un usuario
        ' seleccionado en el combobox...
        Comprueba_Usuario = True
    End If
End Function
Y la función “Comprueba_Contraseña”, que comprueba que el usuario hay introducido una contraseña.
'---------------------------------------------------------------------
' Procedure : Comprueba_Contraseña
' Author    : Witigo (Angel Campos Muñoz)
' Date      : 22/09/2014
' Purpose   : Controla si se ha introducido una contraseña en el
'             textbox txt_Password
'---------------------------------------------------------------------
'
Private Function Comprueba_Contraseña() As Boolean
Dim strContraseña As String
    strContraseña = Nz(Me.txt_Password, "")
    If strContraseña = "" Then
        ' Realizamos mensaje sonoro
        Beep
        ' 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
        ' Devolvemos FALSE, por que no se ha introducido ninguna
        ' contraseña en el textbox...
        Comprueba_Contraseña = False
    Else
        ' Devolvemos TRUE, por que hay una contraseña introducida,
        ' sea erronea o no...
        Comprueba_Contraseña = True
    End If
    
End Function

Paso 5

Y el código perteneciente al evento “click” del botón “cmd_Login” quedaría una vez modificado de la siguiente manera:

Private Sub cmd_Login_Click()
    ' Ocultamos la etiqueta
    If [lbl_Mensaje].Visible = True Then [lbl_Mensaje].Visible = False
    
    ' Comprobamos si se ha seleccionado usuario
    If Comprueba_Usuario = False Then Exit Sub
    ' Comprobamos si se ha introducido contraseña
    If Comprueba_Contraseña = False Then Exit Sub
    ' Comprobamos el valor introducido para el usuario y su contraseña
    If Me.txt_Password = Get_Contraseña(Me.cbo_Usuario) Then
        ' -----------------------------------------------------------
        ' Aquí podemos insertar el código que queremos que se
        ' ejecute cuando iniciemos la sesión...
        ' -----------------------------------------------------------
            
        ' Mostramos mensaje
        MsgBox "Sesión de usuario iniciada", _
                vbInformation, _
                "Inicio de Sesión"
                
        ' Cerramos el formulario
        DoCmd.Close acForm, Me.Name
            
    Else
            
        ' Mostramos mensaje en la etiqueta
        Call MensajeEtiqueta("La contraseña introducida es erronea.")
                
        ' Centramos el foco en el textbox
        Me.txt_Password.SetFocus
                
    End If
    
End Sub





No hay comentarios.:

Publicar un comentario