Problema con los usuarios y sus restricciones vba access

Estoy realizando un proyecto y he conseguido que se abra la base de datos con el primer formulario llamado "login" donde se detalla el nombre de usuario y su contraseña de acceso. Después se abre otro formulario con 2 botones Gestión de Pacientes y Facturación y he creado una tabla con casillas de verificación para restringir el acceso del usuario a cada apartado.

Si el usuario tiene marcada la casilla de verificación Gestión Pacientes se abrirá el formulario "Panel_Menu1" y si esta marcada la casilla de verificación Facturación se abra el formulario "Panel_Menu2".

Dichas casillas significan:

                       Sí = -1 = true

                       No = 0 = false

En un módulo he detallado:

Public UserLevel As Integer

y esto es lo que he escrito en el código:

Private Sub btnFacturacion_Click() 

UserLevel = (IsNull(DLookup("[FACTURACION]", "USUARIOS", "[FACTURACION]= 0 " _
& " AND [Usuario] = '" & Me.txtUsuario.Value & '" AND [Contraseña] = '" & Me.txtPass.Value & "'")))

Lo que pretendo es obtener un Sí = -1 o un No = 0 y así poder indicar lo siguiente: 
If UserLevel = -1 Then
DoCmd.OpenForm "Panel_Menu2"
Else
MsgBox "Usted no tiene permiso para este módulo", vbCritical, "Aviso"
End If
End Sub

Soy principiante y no tengo mucha idea por eso pido ayuda a ver si alguien me puede decir como hacer que funcione correctamente.

Respuesta

Carmen, me voy a meter donde no me llaman, pero, por si puede darte una idea. Personalmente, crearía una tabla Registro, con Usuario, Fecha y hora, de forma que cuando, en el formulario de Login, el usuario "acertara", me guardara en dicha tabla, quien entró, el día y la hora. Si hace un desaguisado, sabes quien ha sido y le puedes dar una paliza( es broma, con dos bofetadas llega). Se le podría poner la hora en que salió del sistema, por si hay que exonerarlo( después de haberlo abofeteado). También se le podría decir que te guardara quien intentó entrara y no acertó( por la misma razón de antes). Se le puede poner que guarde el formulario que abrió, lo que "tocó", lo que modificó, etc.

Luego, como sabes quien es el usuario que en ese momento está "trabajando", bastaría con poner, por ejemplo, en el evento Al cargar de un formulario( vamos a suponer que no tiene "marcada" la casilla Gestión Pacientes)

If dlookup("Gestion pacientes","usuarios","usuario=dlast(""usuario"",""registro"")")=0 then

Msgbox"No tienes permiso para entrar a en este formulario", vbokonly,"Adiós muy buenas"

Docmd. Close

end if

1 respuesta más de otro experto

Respuesta

Supongo que en el formulario de Login tendrás un desplegable con los usuarios.

Si es así, en el origen de los datos del desplegable añade las columnas de permisos.

Imaginemos que el desplegable se llama Usuarios i que en el origen de datos has puesto los permisos 0 y -1 en las columnas 3 y 4 (las columnas se empiezan a enumerar por 0)

Entonces, cuando alguien se identifica, exploras estas columnas y según los permisos activas o desactivas los botones que abren los formularios de gestión

El código los pondrías en el evento "después de actualizar" del control Usuarios y sería algo así

if Me.Usuarios.Column(3) then me.Boton1.enabled = True else me.Boton1.enabled = False

if me.Usuarios.Column(4) then me.Boton2.enabled = True else me.Boton2.enabled = False

Pero depende de como tengas construida la interfase.

Yo, por ejemplo, una vez un usuario se ha identificado, suelo esconder el formulario de Login modificando su propiedad Visible y luego abro un formulario desde donde se accede a las funcionalidades de la aplicación.

En este caso, en el evento "Al abrir" de este formulario Menú, exploro el formulario Login y hago lo mismo:

If Forms!Login!Usuarios.Column(3) then Me. Boton1.enabled=True, else....

La única diferencia, es que en vez de referirme al formulario actual (me) me refiero al un control del formulario Login.

No se si me he explicado muy bien

Buenas Pere y gracias por su respuesta, pero no tengo en el formulario login ningún desplegable. En el botón aceptar tengo el siguiente código y me funciona bien.

Private Sub btnEntrar_Click()
Dim IdUsuario As Integer 'aqui indico como se validan los usuarios

If DCount("[Usuario] AND [Contraseña]", "Usuarios", "[Usuario] = '" & Me.txtUsuario & "' AND [Contraseña] = '" & Me.txtPass & "'") Then
IdUsuario = DLookup("[Id_Usuario]", "Usuarios", "[Usuario]= '" & Me.txtUsuario & "' AND [Contraseña] = '" & Me.txtPass & "'")
DoCmd.OpenForm "FormPrincipal", , , , , , IdUsuario
DoCmd.Close acForm, "Login"
Else
MsgBox "Usuario y/o Contraseña incorrectos", vbExclamation, "Aviso"
End If
End Sub

Ok. Puedes hacer esto:

Tu obtienes el IdUsuario con la función DLookUp. En lugar de ello, puedes obtener el registro completo del usuario donde tienes los campos Pacientes y Facturación con valores de 0 y -1

En el código declaras una variable tipo Recordset;

DIM Usuarios as Recordset

I para localizar al usuario, en vez de la función DLookUp abres la tabla filtrada:

Set Usuarios = CurrentDb.OpenRecordset ("SELECT * FROM Usuarios WHERE Usuario= "  & Me.txtUsuario & ";")

Ahora, en la variable Usuarios tienes la Tabla Usuarios con un único registro que es el del usuario que se ha identificado.

Abres el formulario FormPrincipal tal como lo haces, pero él útimo parámetro ahora será Usuarios!Id_Usuario.

Y ahora ja puedes activar o desactivar los botones del FormPrincipal tal como te dije:

If Usuarios!Pacientes then Forms!FormPrincipal!Boton1.enabled=True Else Forms!FormPrincipal!Boton1.enabled=False

Y así para todos los botones segun el usuario tenga acceso o no a estas funcionalidades

Disculpa Pere. Me he mareado con tu explicación y veo que no se nada de na. XD. Quieres decir:

Dim Usuarios As Recordset

Set Usuarios = CurrentDb.OpenRecordset("SELECT * FROM usuarios WHERE usuario= " & Me.txtUsuario & ";")

If Usuarios!GESTION_PACIENTES Then Forms!FormPrincipal!GESTION_PACIENTES.Enabled = True
Else: Forms!FormPrincipal!GESTION_PACIENTES.Enabled = False

Y que si marco la casilla de facturación y cambio el campo gestion_pacientes por facturación en la expresión anterior o me olvido de algo?

Un saludo

No pasa nada. Tdos hemos pasado por esa etapa de aprendizaje.

Te lo aclaro a ver si triumfamos:

Dim Usuarios As Recordset

Set Usuarios = CurrentDb.OpenRecordset("SELECT * FROM usuarios WHERE usuario= " & Me.txtUsuario & ";")

'Aquí abres el formulario FormPrincipal con

DoCmd. OpenForm "FormPrincipal",,,,,, Usuarios! Usuario '(campo Usuario de la tabla Usuarios)

'Y ahora gestiona la activación de los botonos según los permisos del usuario identificado, tal como lo pones

If Usuarios!GESTION_PACIENTES Then Forms!FormPrincipal!GESTION_PACIENTES.Enabled = True
Else  Forms!FormPrincipal!GESTION_PACIENTES.Enabled = False

'Y luego el otro botón, de la misma forma pero con su nombre.

'Y luego cierras el formulario de Login

Te he puesto Usuarios! Usuario pero dependerá de como se llame el campo de la tabla que quieres mandar al FormPrincipal. Te lo digo porque en tus notas anteriores he visto Id_Usuario. Si fuera así entonces debería ser Usuarios!Id_Usuario.

O si quieres mandar el nombre del usuario, pues Usuarios! Nombre (o como se llame el campo)

Por cierto, yo en la tabla de usuarios tengo las passwords cifradas para que nadie las pueda consultar por la "puerta de atrás".

Además en la password incorporo los permisos. Así si alguien modifica los permisos por la puerta de atrás, luego la password no coincide.

Pero eso es otro tema que, si te interesa, podemos ver con más detalle.

Pere no se que hago mal pero no me funciona.

Solo por aclaración lo que quiero conseguir es si la casilla de verificación "gestion_pacientes" este marcada como Sí se me abra el formulario "Panel_menu1" y si tengo marcada la casilla de "facturación" se me abra el formulario "panel_menu2".

Y aquel usuario que no tenga marcada alguna de las casillas o las dos pues que salga un mensaje de "no esta autorizado".

Al principio viste que lo evalue con el usuario y contraseña del formulario "login" porque intentaba conseguir que diera a la variable userlevel la respuesta de 0 o de -1 y también tenia en cuenta los nulos, esa era mi pretensión pero como ves no me funciona.

Disculpa, me ha surgido una urgencia familiar. Te contesto más tarde

Por cierto, Pere. Es de agradecer todas los mensajes que me has enviado y que intentes explicarme cada paso. 

Posiblemente es que yo no lo haya entendido bien.

Yo entendía que tenías un formulario Login en el que el usuario se identificaba con su nombre y su password. Y que una vez identificado, abrías una formulario principal o de menú, desde dónde el usuario podía acceder a determinadas funcionalidades (en tu caso 2) mediante unos botones de comando que habrían los correspondientes formularios de trabajo, uno sobre gestión de clientes y otro sobre facturación.

Vamos a empezar para confirmar, o no, este modelo que yo había interpretado.

Buenas Pere.

Mi consulta es en relación a las casillas de verificación que aparecen en la siguiente foto. En función de estar marcada o no la casilla correspondiente que me abra un panel de menú u otro.

Te explico como lo hago yo para enender similitudes.

Por un lado tengo un formulario de gestión de usuarios, que entiendo que sería equivalente a la imagen que me has mandado:

Verás que ahí tengo una casilla que indica si el usuario es administrador o no.

Luego tengo el formulario de Login

Ahí es donde se identifica el usuario cuando quiere acceder a la aplicación

Una vez ha accedido, se abre un Menu para acceder a las distintas funcionalidades de la aplicación

En este menú, verás que hay botones activos y otros no activos, dependiendo de si el usuario que se ha identificado es Administrador o no.

Yo quería entender como funciona tu interfase para poder enfocar mejor mi respuesta.

Disculpa por mi torpeza

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas