Filtro formulario según valor de otro formulario

Estoy intentando hacer este filtro pero hay algo que no me funciona. Tengo este código creado que me da error

Private Sub Comando0_Click()
DoCmd.OpenForm "[PERIMETRO]", , , "[PROVEEDOR]='" & Me.txtUsuario & "'"
End Sub

Tengo dos tablas una se llama Usuarios en la cual hay dos campos uno llamado Usuario y otro Nivel y un segundo formulario llamado PERÍMETRO en el que uno de los campos es PROVEEDOR, el tema consiste que cuando escriba en el campo USUARIO (el campo de texto se llama txtUsuario) un valor al pulsar Aceptar se me abra el formulario PERÍMETRO solo con los registros que el campo proveedor coincida con el valor que he puesto en txtUsuario, esta condición solo será factible si el campo Nivel de la tabla Usuario sea "User" porque si el nivel es "Admin" no procede el filtro, es decir abriría el formulario PERÍMETRO mostrando todos los registros. Espero haberme explicado bien. Gracias.

3 Respuestas

Respuesta
1

Si tengo la tabla Usuarios como

Una tabla Perimetro como

Y un formulario con esos cuadros de texto que dices, TxtUsuario y TxtContraseña y escribo un nombre y una contraseña

Cuando pulso aceptar, como tanto el usuario y la contraseña son correctas y Carmen es Usuaria

Me abre el formulario sólo con los registros de ella. Por el contrario si pongo

Como Pepe es administrador al pulsar

El código del evento al hacer clic del botón es( no le he puesto nada de lo que debe hacer en caso de que el usuario o contraseña sean incorrectas)

Private Sub Comando4_Click()
If DCount("*", "usuarios", "usuario='" & Me.TxtUsuario & "' and contraseña='" & Me.TxtContraseña & "' and nivel=""Usuario""") = 1 Then
DoCmd.OpenForm "perimetro", , , "proveedor='" & Me.TxtUsuario & "'"
ElseIf DCount("*", "usuarios", "usuario='" & Me.TxtUsuario & "' and contraseña='" & Me.TxtContraseña & "' and nivel=""administrador""") = 1 Then
DoCmd.OpenForm "perimetro"
End If
End Sub
Respuesta
1

Le dejo otra alternativa.

Personalmente utilizo variables "Públicas", es decir definidas a nivel de módulo, por ejemplo

Public lnIDusuario AS Long

Public intNivel AS Integer

Observe que utilizo el Id del usuario el cual debe estar en la tabla o consulta origen de datos del formulario, cuando se registra el ingreso del usuario almaceno en estas variables el Id y el nivel del usuario, esto lo utilizo en varias partes del programa.

Al llamar el formulario quedaría algo como;

IF intNive<>1 THEN 

DoCmd.OpenForm "PERIMETRO", , , "idusuario='" & lnIDusuario & " AND nivel=" & intNivel 

ELSE

DoCmd. OpenForm "PERIMETRO"

ENDIF

Pero ! En el formulario en alguna parte (puede ser oculta) deben estar los campos idusuairo y nivel !

Se evita utilizar DCount() esto afecta en bases de datos de gran tamaño.

Una recomendación trate de no utilizar texto para fijar el "NIVEL", es mejor de tipo Byte.

Aún más esta línea sobra el filtro nivel por que ya esta almacenado en la variable pública.

DoCmd.OpenForm "PERIMETRO", , , "idusuario='" & lnIDusuario & " AND nivel=" & intNivel 

Quedaría

IF intNive<>1 THEN 

DoCmd.OpenForm "PERIMETRO", , , "idusuario='" & lnIDusuario

ELSE

DoCmd. OpenForm "PERIMETRO"

ENDIF

Este método es funcional en bases de dato pequeñas, pero siempre es mejor hacer el filtro mediante SQL y asignar con base en éste el "Origen de datos para el formulario", no se complique con DCount().

No es necesario crear la función a nivel de módulo, salvo que se vaya a llamar más de una vez, en este caso en particular a las variables públicas se les asignan los valores después validar el usuario.

Respuesta
1

Una tabla (Usuarios)

Usuario Contraseña Nivel
Luis astro1 0
Juan LUnaLLena 1
Pedro Agosto 1
Manuel Candelabro 2

Un modulo independiente:

Option Compare Database
Option Explicit
Public UserAct$, NivelAcc&
Public Function Validar(User$, Clave$) As Boolean
If DCount("*", "Usuarios", "Usuario= '" & User & "' And Contraseña = '" & Clave & "'") Then
    UserAct = User
    NivelAcc = DLookup("Nivel", "Usuarios", "Usuario= '" & User & "' And Contraseña = '" & Clave & "'")
    Validar = True
    End If
End Function

EL resultado en la ventana de inmediato

¿
?validar ("luis","astro1"), "Usuario: " & UserAct, "Permisos: " & NivelAcc
Verdadero Usuario: luis Permisos: 0
? Validar ("luis","astr1")
Falso
?validar ("pedro","agosto"), "Usuario: " & UserAct, "Permisos: " & NivelAcc
Verdadero Usuario: pedro Permisos: 1

En los objetos a abrir se valida el nivel del usuario y se condiciona según permisos, que en estos casos seria sin condición para el nivel cero, filtrando por el usuario en otro caso y de tener el nivel tres no puede modificar datos (o las condiciones que se impongan).

Los de nivel cero (0) administradores
Los de nivel uno (1) lectura y escritura
Los de nivel dos (2) solo lectura

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas