Beruflich Dokumente
Kultur Dokumente
INTRODUCCIÓN
Este ejemplo está basado en dos ejemplos que podréis
encontrar en la web: Formulario Chivato y Contraseña.
Dado que consideraba complicado para la explicación hacer modificaciones en los ejemplos
anteriores voy a desarrollar este ejemplo empezando desde cero. Así, si habéis seguido los
ejemplos anteriores, este probablemente servirá para “afianzar conocimientos”, y si no los
habéis seguido pues no tendréis que ir “saltando de ejemplo en ejemplo” para poder seguirlo.
La metodología que se explica aquí es sólo una de las varias posibles. Lo comento porque es
posible que, por la Red, encontréis otros sistemas. Pues sí: hay otros sistemas.
1 La BD de ejemplo os la podéis bajar aquí. El password el mismo nombre de usuario que se elija, en minúsculas.
1
Visítame en http://bit.ly/NckAccess
Debemos tener en cuenta que los valores predeterminados
para los campos [Administrador] e [Invitado] serán los que
nos salen por defecto (es decir, un cero). El valor
predeterminado para el campo [Operador] será True (o
también podemos escribir -1), porque se da por supuesto
que cuando creemos un nuevo usuario este tendrá, por
defecto, este estatus de operador. Evidentemente, si
quisiéramos que los nuevos usuarios tuvieran sólo permisos
de invitado, deberíamos asignar a este último campo el
valor predeterminado True.
También debemos tener en cuenta que al campo [Pass] podemos ponerle, como máscara de
entrada, la máscara “Contraseña”, para que no se puedan ver los caracteres cuando se
introduce la contraseña.
Para mayor seguridad podemos fijar el atributo de esta tabla como “Oculto” 2.
Para poder hacer las pruebas pertinentes en este ejemplo vamos a crearnos una tabla
cualquiera, que llamaremos TDatos, que tendrá simplemente la siguiente estructura.
Rellenamos esta tabla con algunos valores inventados. Por ejemplo, yo me he inventado lo
siguiente:
2 En el panel de exploración o ventana de Base de datos, hacemos click derecho sobre la tabla → Propiedades de la tabla → Marcamos
el check de “Oculto”.
2
Visítame en http://bit.ly/NckAccess
Como vemos, lo que tenemos que hacer es:
Sigamos.
Una vez creado, en la cabecera del formulario, insertamos un botón de comando. Le ponemos
de nombre cmdCerrar y, en el evento “Al hacer click”, generamos el siguiente código 4:
…
Private Sub cmdCerrar_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End Sub
…
La primera línea del DoCmd lo que hace es cerrar el formulario actual; la segunda línea abre el
formulario FMenu (que aún no hemos creado, pero que crearemos en breve).
Creamos otro formulario en blanco, al que llamaremos FMenu. Este será nuestro “panel de
control” para acceder a diferentes opciones que podamos crear en la BD. Lo dejaremos creado,
y ya lo diseñaremos después.
Vamos a crear el formulario de acceso a la BD, que será el que nos permitirá seleccionar
usuario y contraseña. Lo llamaremos FPass. Os muestro aquí cómo debería quedar, y después
3 A partir de ahora, cuando diga, al referirme a un control, “le ponemos de nombre...”, me estaré refiriendo a esta propiedad Nombre
de la Pestaña Otras.
4 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos aparece un pequeño
botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le decimos que queremos generar código.
Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben tocarse. El código lo
escribimos entre dichas líneas
3
Visítame en http://bit.ly/NckAccess
os explicaré cómo creamos los diferentes controles.
– Emergente: SÍ
– Modal: SÍ
1.- Insertamos un cuadro combinado (etiqueta: Usuario:). Cuando nos salga el asistente lo
configuramos de la siguiente manera:
…
Private Sub cboUser_AfterUpdate()
Me.txtPass.SetFocus
End Sub
…
3.- Insertamos un botón de comando que nos permitirá cancelar. Le ponemos de nombre
cmdCancelar. En el evento “Al hacer click” le generamos el siguiente código:
…
Private Sub cmdCancelar_Click()
'Declaramos la variable
Dim resp As Integer
'Solicitamos al usuario la confirmación
4
Visítame en http://bit.ly/NckAccess
resp = MsgBox("¿Seguro que desea cancelar?", vbQuestion + vbYesNo, "CONFIRMAR")
'Si responde que sí quiere salir cerramos la aplicación
If resp = vbYes Then
DoCmd.Quit
End If
End Sub
…
…
Private Sub cmdAceptar_Click()
'Declaramos las variables
Dim vUser As String
Dim vPass As String
Dim vPassT As String
vUser = Nz(Me.cboUser.Value, "")
vPass = Nz(Me.txtPass.Value, "")
5
Visítame en http://bit.ly/NckAccess
End If
End Sub
…
Sacamos las propiedades del formulario y nos vamos a Pestaña Datos → Permitir agregar, y
fijamos la propiedad en NO.
Como vemos, hemos puesto un botón de comando (Cerrar), al que pondremos de nombre
cmdCerrar. Al evento “Al hacer click” le generamos el siguiente código:
…
Private Sub cmdCerrar_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End Sub
…
Vamos a programar este formulario para que sólo nos deje dar un tipo de permiso para cada
usuario. La mecánica es muy simple y repetitiva.
…
Private Sub Administrador_AfterUpdate()
With Me
'Si marcamos el check de administrador el resto de checks
'se desmarcan
If .Administrador.Value = True Then
.Operador.Value = False
.Invitado.Value = False
End If
End With
End Sub
…
5 Para usuarios de Access 2003 sacamos las propiedades del formulario → Pestaña Formato → Vista predeterminada, y ahí
seleccionamos “Formularios continuos”. Para versiones posteriores tenemos un botón en la cinta de opciones que nos crea el
formulario directamente en esta vista (Botón → Varios elementos)
6
Visítame en http://bit.ly/NckAccess
2.- Seleccionamos el check de “Operador” y en su evento “Después de actualizar escribimos el
siguiente código:
…
Private Sub Operador_AfterUpdate()
With Me
'Si marcamos el check de operador el resto de
checks
'se desmarcan
If .Operador.Value = True Then
.Administrador.Value = False
.Invitado.Value = False
End If
End With
End Sub
…
….
Private Sub Invitado_AfterUpdate()
With Me
'Si marcamos el check de invitado el resto de checks
'se desmarcan
If .Invitado.Value = True Then
.Operador.Value = False
.Administrador.Value = False
End If
End With
End Sub
…
1.- En el editor de VB nos vamos a menú Insertar → Módulo. Guardamos ese módulo con el
nombre de mdlTipoUsuario.
2.- Escribimos el siguiente código en la ventana de código, debajo de la línea o líneas que, por
defecto, nos habrán aparecido (Option Compare Database / Option Explicit):
…
Public Function tipoUser() As String
'En la tabla TPass, el campo [Administrador] tiene el índice 2,
7
Visítame en http://bit.ly/NckAccess
'el campo [Operador] tiene el índice 3, y el campo [Invitado]
'tiene el índice 4. Capturaremos los campos en función de su
'índice, que viene representado por la variable vInd
'-------------------- ---------------------------------------------------------
'Declaramos las variables
Dim nombreUsuario As String
Dim tipUs As Boolean
Dim vInd As Integer
Dim rst As Recordset
Dim miSql As String
'Capturamos el nombre de usuario del formulario
FChivato
nombreUsuario = Forms!FChivato.txtUser.Value
'Creamos la consulta SQL que nos filtrará la línea correspondiente
'a la información del usuario activo
miSql = "SELECT * FROM TPass WHERE NomUser='" & nombreUsuario & "'"
'Definimos el recordset sobre la SQL
Set rst = CurrentDb.OpenRecordset(miSql, dbOpenSnapshot)
'Empezamos a recorrer los campos, y nos detendremos en aquel que tenga
'el check marcado (es decir, que sea TRUE)
For vInd = 2 To 4
tipUs = rst.Fields(vInd).Value
'Si está marcado como verdadero pasamos como resultado de la función
'el nombre del campo
If tipUs = True Then
tipoUser = rst.Fields(vInd).Name
Exit For
End If
Next vInd
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Function
…
Y con esto ya tenemos el grueso del trabajo hecho. Vamos a seguir estableciendo lo que se
puede o no a través del formulario FMenu.
PROGRAMANDO FMENU
La idea subyacente de todo lo que hemos hecho anteriormente es que el usuario de la base
siga este “camino”.
Si queremos ir haciendo pruebas tened en cuenta que, antes de abrir FMenu, debemos pasar
obligatoriamente por abrir FPass, puesto que es ahí cuando el control txtUser de FChivato
adquiere valor. Si no hay valor en txtUser todos los códigos os darán error. ¡Ojo!
8
Visítame en http://bit.ly/NckAccess
1.- Insertamos un botón de comando, al que llamaremos cmdAbreFDatos. Este botón nos
abrirá el formulario FDatos, teniendo en cuenta que:
– Si se es “Administrador” o se es “Operador” se
pueden editar y añadir datos
– Si se es “Invitado” sólo se pueden consultar los
datos
…
Private Sub cmdAbreFDatos_Click()
'Declaramos las variables
Dim vRol As String
'Cerramos el formulario actual
DoCmd.Close acForm, Me.Name
'Llamamos a la función para saber qué permisos tiene
vRol = tipoUser()
'Damos permisos en función del tipo de usuario
If vRol = "Administrador" Or vRol = "Operador" Then
'Abrimos el formulario para añadir o editar
DoCmd.OpenForm "FDatos"
Else
'Si no es administrador u operador será invitado.
'Abrimos el formulario sólo para consulta
DoCmd.OpenForm "FDatos", , , , acFormReadOnly
End If
End Sub
…
Si en nuestro FMenu añadimos otro botón de comando (lo llamaremos cmdAbreFDatos2) para
cumplir lo anterior el código asociado al evento “Al hacer click” debería ser el siguiente:
…
Private Sub cmdAbreFDatos2_Click()
'Declaramos las variables
Dim vRol As String
'Cerramos el formulario actual
DoCmd.Close acForm, Me.Name
'Llamamos a la función para saber qué permisos tiene
vRol = tipoUser()
'Damos permisos en función del tipo de usuario
Select Case vRol
Case "Administrador"
'Si es administrador abrimos el formulario con todos los permisos
DoCmd.OpenForm "FDatos"
9
Visítame en http://bit.ly/NckAccess
Case "Operador"
'Si es operador abrimos el formulario sólo para ser editado, pero no para añadir
DoCmd.OpenForm "FDatos"
Forms!FDatos.AllowAdditions = False
Case "Invitado"
'Si es invitado abrimos el formulario en sólo
lectura
DoCmd.OpenForm "FDatos", , , , acFormReadOnly
End Select
End Sub
…
2.- Añadimos un botón de comando, que llamaremos cmdAbreRDatos. En este caso los
permisos serán los siguientes:
…
Private Sub cmdAbreRDatos_Click()
'Declaramos las variables
Dim vRol As String
'Llamamos a la función para saber qué permisos tiene
vRol = tipoUser()
'Abrimos sólo si se es administrador
If vRol = "Administrador" Then
'Abrimos el informe
DoCmd.OpenReport "RDatos", acViewPreview
Else
'Si no lanzamos un mensaje de advertencia
MsgBox "No tiene privilegios para ver este informe", vbCritical, "NO AUTORIZADO"
End If
End Sub
…
3.- Para practicar con lo anterior, vamos a crear un botón de comando para administrar los
permisos. Es decir, que claramente aquí sólo el administrador puede tener acceso. A ese botón
lo llamaremos cmdGestionPermisos. En el evento “Al hacer click” generamos el siguiente
código (ya no os pondré los comentarios):
…
Private Sub cmdGestionPermisos_Click()
Dim vRol As String
vRol = tipoUser()
If vRol = "Administrador" Then
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FUsers"
Else
10
Visítame en http://bit.ly/NckAccess
MsgBox "No está autorizado a acceder a esta información", vbCritical, "NO AUTORIZADO"
End If
End Sub
…
Un saludo y...
¡suerte!
11
Visítame en http://bit.ly/NckAccess