viernes, 1 de junio de 2018

Access Pasos Botones de Formularios (Código)

1.- Crear un formulario en Opción Automática, Ligado a una Tabla.
2.- Cambiar a Vista Diseño, desactivar la opción propiedades del formulario  -opción formato, SELECTORES de REGISTRO y BOTONES DE NAVEGACIÓN, Activar (no) e Insertar Los Botones Correspondientes
3.-Crear los Botones Paso a paso
a) Insertar Botón, Cancelar el asistente, propiedades del botón, opción TODAS, poner Nombre cmd_nuevo, Poner Título Nuevo, Opción Eventos, Selleccionar AL HACER CLIC,  procedimiento, ingresar o clikear en los puntos ... y agregar el código correspondiente a cada botón.
b) Se crea una macro en la opción Menú Insertar módulo. más adelante indicare el códigpo para la macro

 CÓDIGO PARA BOTONES
Option Compare Database

Private Sub cmd_Anterior_Click()
Me.Recordset.MovePrevious
    If Me.Recordset.BOF Then
        Me.Recordset.MoveNext
        MsgBox "Ya Estas en el Primer Registro"
    End If
End Sub

Private Sub cmd_Final_Click()
Me.Recordset.MoveLast
End Sub

Private Sub cmd_Guardar_Click()
DoCmd.RunCommand acCmdSaveRecord
    Call HabilitarBotones
    Me.cmd_Guardar.Enabled = False
End Sub

Private Sub cmd_inicio_Click()
Me.Recordset.MoveFirst
End Sub

Private Sub cmd_Nuevo_Click()
DoCmd.GoToRecord , , acNewRec
    Call DeshabilitarBotones
    Me.cmd_Guardar.Enabled = False
    Me.Cod.SetFocus
End Sub

Private Sub cmd_Siguiente_Click()
Me.Recordset.MoveNext
    If Me.Recordset.EOF Then
        Me.Recordset.MovePrevious
        MsgBox "Ya Estas en el Último Registro"
    End If
End Sub

Private Sub Form_Load()
Me.cmd_Guardar.Enabled = False
End Sub

CÓDIGO PARA MACRO
Option Compare Database

Sub DeshabilitarBotones()
With Form_Agregar_Productos
    .cmd_inicio.Enabled = False
    .cmd_Siguiente.Enabled = False
    .cmd_Anterior.Enabled = False
    .cmd_Final.Enabled = False
    .cmd_Nuevo.Enabled = False
    .cmd_Guardar.Enabled = False
End With
End Sub
Sub HabilitarBotones()
With Form_Agregar_Productos
    .cmd_inicio.Enabled = True
    .cmd_Siguiente.Enabled = True
    .cmd_Anterior.Enabled = True
    .cmd_Final.Enabled = True
    .cmd_Nuevo.Enabled = True
    .cmd_Guardar.Enabled = True
End With
End Sub

Access Formulario de Login en (VI) Login v.1.4

En el capítulo de hoy, lo que vamos a hacer, es mejorar un poco dicho sistema. Agregando una tabla donde establecer el número máximo de intentos fallidos, así aunque se compile la aplicación, nosotros podremos cambiar los intentos ya que dicho numero, no estará en el código de la aplicación.
Recordemos que una aplicación entregada en formato compilado (*.mde o *.accde ) no se le puede modificar el código.

Paso 1

Empecemos pues por crear una tabla en vista diseño.








  • ID_Opcion (Numérico, Byte, PrimaryKey)
  • ErrMaxLogin (Numérico, Byte)
Aunque parezca una exageración crear una tabla para este campo, esta misma tabla la utilizaremos para guardar las opciones que iremos agregando poco a poco a nuestra aplicación.
Podríamos agregar un campo del tipo SI/NO para definir si se va a llevar control de los inicios de sesión fallidos, o otro campo de tipo SI/NO para definir si se bloqueará el usuario o no al llegar al límite establecido. Pero en este ejemplo, no lo mostraremos… Dejemos algo para vuestra imaginación.

Paso 2

Sigamos pues con el siguiente paso, la creación de una función para devolver el número máximo de intentos fallidos que dispone el usuario para iniciar una sesión en la aplicación. Abrimos el módulo estandar bas_Seguridad_Sesion y copiamos la siguiente función:


Purpose   : Devuelve el número máximo de intentos fallidos de iniciar
'             sesión en la aplicación.
'-------------------------------------------------------------------------
'
Public Function Get_ErrMaxLogin() As Byte
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
    strSQL = "SELECT dbo_Opciones.ID_Opcion, " & _
                    "dbo_Opciones.ErrMaxLogin " & _
                "FROM dbo_Opciones " & _
                "WHERE (((dbo_Opciones.ID_Opcion) = 1));"
                
    Set dbs = CurrentDb()
    Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
    
    With rst
    
        ' Devolvemos 0 por que no hay registros
        If .RecordCount = 0 Then Get_ErrMaxLogin = 0
        
        ' Devolvemos el número máximo de intentos
        Get_ErrMaxLogin = !ErrMaxLogin
    
    End With
    
    ' Cerramos el recordset
    rst.Close
    ' Borramos los objetos
    Set rst = Nothing
    Set dbs = Nothing
End Function

Paso 3

Ahora, deberíamos borrar del módulo del formulario, la línea de la cabecera del módulo que contiene la constante bytErrLoginMax
Donde antes teníamos esto:

Option Compare Database
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
' Constante que almacena el número máximo de intentos fallidos
Private Const bytErrLoginMax As Byte = 3
Ahora lo dejaremos así:
Option Compare Database
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
Esto es así por que lo que antes lo controlaba una constante, ahora lo controla un registro en la tabla dbo_Opciones.

Paso 4

Ahora nos toca modificar el procedimiento Comprueba_Intentos

' Procedure : Comprueba_Intentos
' Purpose   : Comprueba los intentos de inicio de sesión fallidos y actúa
'             en consecuencia.
'-------------------------------------------------------------------------
'
Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
                                intUsuario As Integer)
    If bytErrLogin = bytErrLoginMax Then
        ' Mostramos el mensaje "Se ha superado el número máximo de intentos
        ' de inicio de sesión"
        MsgBox "Se ha superado el número máximo de intentos de " & _
                "inicio de sesión." & _
                vbCrLf & vbCrLf & _
                "Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
                vbCrLf & vbCrLf & _
                "El usuario ha sido bloqueado.", _
                vbExclamation, "Inicio de sesión"
            
        ' Bloqueamos al usuario
        Call Block_Usuario(intUsuario)
            
        ' Hacemos log del bloqueo del usuario
        Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
        
        With Me
        
            ' Actualizamos el combobox cbo_Usuario
            .cbo_Usuario.Requery
                
            ' Borramos la contraseña
            .txt_Password = ""
                
            ' Ocultamos la etiqueta
            .lbl_Mensaje.Visible = False
      
        End With
      
    End If
            
End Sub

 Cambiando en la línea 12 la constante bytErrLoginMax por la función Get_ErrMaxLogin quedando el código de la siguiente manera…
Procedure : Comprueba_Intentos
' Purpose   : Comprueba los intentos de inicio de sesión fallidos y actúa
'             en consecuencia.
'-------------------------------------------------------------------------
'
Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
                                intUsuario As Integer)
    If bytErrLogin = Get_ErrMaxLogin Then
        ' Mostramos el mensaje "Se ha superado el número máximo de intentos
        ' de inicio de sesión"
        MsgBox "Se ha superado el número máximo de intentos de " & _
                "inicio de sesión." & _
                vbCrLf & vbCrLf & _
                "Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
                vbCrLf & vbCrLf & _
                "El usuario ha sido bloqueado.", _
                vbExclamation, "Inicio de sesión"
            
        ' Bloqueamos al usuario
        Call Block_Usuario(intUsuario)
            
        ' Hacemos log del bloqueo del usuario
        Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
        
        With Me
        
            ' Actualizamos el combobox cbo_Usuario
            .cbo_Usuario.Requery
                
            ' Borramos la contraseña
            .txt_Password = ""
                
            ' Ocultamos la etiqueta
            .lbl_Mensaje.Visible = False
      
        End With
      
    End If
            
End Sub
 Con esta modificación, podríamos mediante un formulario para las opciones, modificar en cualquier momento el número máximo de intentos fallidos de iniciar sesión en la aplicación. O cambiar otros parámetros para otras opciones claro está.