- Tabla: tabUsuarios
- Campo: IdUsuario
- Tipo de datos: Autonumeración
- Clave Principal
- Campo: NombreApellido
- Tipo de datos: Texto corto
- Requerido: Sí
- Campo: Usuario
- Tipo de datos: Texto corto
- Requerido: Sí
- Campo: Password
- Tipo de datos: Texto corto
- Máscara de entrada: Contraseña
- Requerido: Sí
- Tabla: tabFormularios
- Campo: IdFormulario
- Tipo de datos: Autonumeración
- Clave Principal
- Campo: FormularioNombre
- Tipo de datos: Texto corto
- Requerido: Sí
Agregamos todos los formularios
- Tabla: tabPermisos
- Campo: IdUsuario
- Tipo de datos: Número
- Requerido: Sí
- Campo: IdFormulario
- Tipo de datos: Número
- Requerido: Sí
Access nos pregunta si deseamos una clave principal, al cual le decimos que no
- Relaciones
- Módulo: ModLogin
Option Compare Database
Option Explicit
Public UserLog As String
Public Function searchUser(Usuario As TextBox, Password As TextBox) As Byte
Dim rst As DAO.Recordset, SQL As String
On Error GoTo ManipularError
If IsNull(Usuario) Or IsNull(Password) Then Exit Function
SQL = "SELECT Count(*) AS Total " _
& "FROM [tabUsuarios] " _
& "WHERE [Usuario] = '" & Replace(Usuario, "'", "''") & "' AND [Password] = '" & Replace(Password, "'", "''") & "'"
Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
searchUser = rst!Total
UserLog = Usuario
rst.Close: Set rst = Nothing
Exit Function
ManipularError:
If Not rst Is Nothing Then rst.Close: Set rst = Nothing
MsgBox Err.Description, vbCritical, "Atención"
End Function
Public Function searchUserName() As String
Dim rst As DAO.Recordset, SQL As String
On Error GoTo ManipularError
SQL = "SELECT NombreApellido " _
& "FROM [tabUsuarios] " _
& "WHERE [Usuario] = '" & UserLog & "'"
Debug.Print SQL
Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
searchUserName = rst!NombreApellido
rst.Close: Set rst = Nothing
Exit Function
ManipularError:
If Not rst Is Nothing Then rst.Close: Set rst = Nothing
MsgBox Err.Description, vbCritical, "Atención"
End Function
Public Function searchPermission(NameForm As String) As Boolean
Dim rst As DAO.Recordset, SQL As String
On Error GoTo ManipularError
SQL = "SELECT Count(*) AS Total " _
& "FROM (tabFormularios AS F INNER JOIN tabPermisos AS P ON F.IdFormulario = P.IdFormulario) INNER JOIN tabUsuarios AS U ON P.IdUsuario = U.IdUsuario " _
& "WHERE F.FormularioNombre = '" & NameForm & "' AND U.Usuario = '" & UserLog & "'"
Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
If rst!Total > 0 Then searchPermission = True
rst.Close: Set rst = Nothing
Exit Function
ManipularError:
If Not rst Is Nothing Then rst.Close: Set rst = Nothing
MsgBox Err.Description, vbCritical, "Atención"
End Function
Public Function validateForm(NameForm As String) As Boolean
If Not CurrentProject.AllForms(NameForm).IsLoaded Then validateForm = True
End Function
- Formulario: forLogin
- Propiedades Formulario
- Título: INICIO DE SESIÓN
- Emergente: Si
- Modal: Si
- Centrado automático: Si
- Estilo de los bordes: Diálogo
- Selectores de registros: No
- Botones de desplazamiento: No
- Barras de desplazamiento: Ninguna
- Cuadro de texto
- Etiqueta > Título: Usuario
- Cuadro de texto > Nombre: txtUsuario
- Cuadro de texto
- Etiqueta > Título: Contraseña
- Cuadro de texto > Nombre: txtPassword
- Botón de comando
- Nombre: btnEntrar
- Título: Entrar
- Al hacer clic: [Procedimiento de evento]
Private Sub btnEntrar_Click()
'Llamamos la función serachUser que se encuentra en el módulo ModLogin
If Not searchUser(txtUsuario, txtPassword) = 1 Then
MsgBox "Usuario o Contaseña Incorrecto", vbCritical, Me.Caption 'Me.Caption regresa el nombre del formulario
Else
Me.Visible = False
DoCmd.OpenForm "forInicio"
End If
End Sub
- Formulario: forInicio
- Propiedades Formulario
- Título: INICIO
- Emergente: Sí
- Modal: Sí
- Centrado automático: Sí
- Estilo de los bordes: Diálogo
- Selectores de registro: No
- Botones de desplazamiento: No
- Barras de desplazamiento: Ninguna
- Al abrir: [Procedimiento de evento]
Private Sub Form_Open(Cancel As Integer)
'No permite abrir forInicio sin ser validado el Login
'Función dentro del módulo ModLogin
Cancel = validateForm("forLogin")
End Sub
- Al cerrar: [Procedimiento de evento]
Private Sub Form_Close()
'Cerramos el formulario forLogin
'Ya que al logeanos, éste se encuentra oculto
DoCmd.Close acForm , "forLogin"
End Sub
- Botón de comando
- Nombre: btnCerrarSesion
- Título: Cerrar sesión
- Al hacer clic: [Procedimiento de evento]
Private Sub btnCerrarSesion_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "forLogin"
End Sub
- Botón de comando
- Nombre: btnUsuarios
- Título: Usuarios
- Botón de comando
- Nombre: btnReportes
- Título: Reportes
- Botón de comando
- Nombre: btnVentas
- Título: Ventas
- Botón de comando
- Nombre: btnInventario
- Título: Inventario
- Cuadro de texto
- Origen del control: =searchUserName()
- Estilo de los bordes: Transparente
- Activado: No
- Bloqueado: Si
- Formulario: forUsuarios y forUsuariosSub
- Pestaña Crear > Asistente para formularios
- Seleccionamos tabla tabUsuarios > Agregamos todos los campos
- Seleccionamos la tabla tabPermisos > Agregamos todos los campos
- Pulsamos Siguiente > Seleccionamos Formulario con subformulario
- Pulsamos Siguiente > Seleccionamos Hoja de datos
- Pulsamos Siguiente
- Pulsamos Siguiente > El asistente nos pide los títulos del formulario y subformulario
- Título formulario: forUsuarios
- Título subformulario: forUsuariosSub
- Pulsamos Finalizar

- Formulario: forUsuarios
- Propiedades Formulario
- Título: USUARIOS
- Emergente: Si
- Modal: Si
- Centrado automático: Si
- Estilo de bores: Diálogo
- Selectores de registro: No
- Barras de desplazamiento: Ninguna
- Propiedades de los cuadro de texto: NombreApellido, Usuario y Password
- Barras de desplazamiento: Ninguna
- Comportamiento de la tecla entrar: Predeterminado
- Formulario: forUsuariosSub
- Propiedades Formulario
- Vista predeterminada: Formularios continuos
- Botones de desplazamiento: No
- Barras de desplazamiento: solo vertical
- Eliminamos el campo de texto: IdUsuario
- Eliminamos la etiqueta del cuadro combinado IdFormulario
- Seleccionamos el campo de texto: IdFormulario
- Botón derecho del mouse > Cambiar a > Cuadro combinado
- Propiedades del campo
- Origen de la fila: tabFormularios
- Limitar a la lista: Sí
- Número de columnas: 2
- Ancho de columnas: 0cm;3cm
- Ancho: 7cm
- Alto: 0,556cm
- Superior: 0cm
- Izquierda: 0cm
- Propiedades Detalle
- Alto: 0,556cm
- Formulario: forReportes, forVentas, forInventario
- Propiedades Formulario
- Título: REPORTES y/o VENTAS y/o INVENTARIO
- Emergente: Sí
- Modal: Sí
- Centrado automático: Si
- Estilo de los bordes: Diálogo
- Selectores de registro: No
- Botones de desplazamiento: No
- Barras de desplazamiento: Ninguna
- Permiso al administrador
- Abrimos forUsuarios. Damos permiso al administrador para que tenga acceso a todos los módulos
- Configurar todos los formularios para que no se puedan abrir sin habernos longeado antes: forUsuarios, forUsuariosSub, forReportes, forVentas y forInventario
- Evento Al abrir: [Procedimiento de evento]
Private Sub Form_Open(Cancel As Integer)
'No permite abrir forInicio sin ser validado el Login
'Función dentro del móduloModLogin
Cancel = validateForm("forLogin")
End Sub
- Configurar los permisos de acceso a los módulos
- Vista Diseño forInicio
- Propiedades del botón Usuarios
- Al hacer clic: [Procedimiento de evento]
Private Sub btnUsuarios_Click()
'Función que evalua si el usuario tiene permiso al módulo
If searchPermission("forUsuarios") Then
'Si tiene permiso abre el módulo
DoCmd.OpenForm "forUsuarios"
'Caso contrario muestro mensaje
Else
MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
End If
End Sub
- Propiedades del botón Reportes
- Al hacer clic: [Procedimiento de evento]
Private Sub btnReportes_Click()
'Función que evalua si el usuario tiene permiso al módulo
If searchPermission("forReportes") Then
'Si tiene permiso abre el módulo
DoCmd.OpenForm "forReportes"
'Caso contrario muestro mensaje
Else
MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
End If
End Sub
- Propiedades del botón Ventas
- Al hacer clic: [Procedimiento de evento]
Private Sub btnVentas_Click()
'Función que evalua si el usuario tiene permiso al módulo
If searchPermission("forVentas") Then
'Si tiene permiso abre el módulo
DoCmd.OpenForm "forVentas"
'Caso contrario muestro mensaje
Else
MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
End If
End Sub
- Propiedades del botón Inventario
- Al hacer clic: [Procedimiento de evento]
Private Sub btnInventario_Click()
'Función que evalua si el usuario tiene permiso al módulo
If searchPermission("forInventario") Then
'Si tiene permiso abre el módulo
DoCmd.OpenForm "forInventario"
'Caso contrario muestro mensaje
Else
MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
End If
End Sub