** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error 2471 en validación
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Error 2471 en validación

 Responder Responder
Autor
Mensaje
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Error 2471 en validación
    Enviado: 05/Noviembre/2019 a las 05:53
Hola a todos,

Tengo el siguiente problema.

A una variable publica le paso el IdLevel del usuario logueado de la tabla AdminRoles.
Así:
intLevel = DLookup("[Level]", "AdminUsers", "[NetId]= '" & Me.txtUser & "' AND [Password] = '" & Me.txtPass & "'")

Luego la paso al formMain mediante argumento
DoCmd.OpenForm "formMain", , , , , , intLevel

En la Tabla AdminRoles tengo los nombres de los botones del formMain con campos Si/No, pretendo validar si el Botón es Si entonces permitir el acceso caso contrario negar el acceso, esto lo he visto de un codigo en la WEB.

Private Sub Form_Open(Cancel As Integer)
If IsNull(Me.OpenArgs) Then
    MsgBox "Usted no tiene acceso", vbCritical, "Warning"
    Cancel = True
End If
End Sub

Este es el codigo que me tira error, por mas que le doy vueltas, no lo hecho andar, los tipos de datos son integer.
Run-time error 2471
La expresion que usted ha ingresado como parametro de un query produce este error" '[intLevel]'

If DLookup("[Data]", "AdminRoles", "[intLevel]=" & Me.OpenArgs & "") = True Then
        MsgBox "Acceso", vbInformation, "Aviso"
    Else
        MsgBox "Acceso denegado", vbCritical, "Aviso"
    End If

imprimo las variables para ver si esta pasadon el IdLevel y si que si lo hace, pero la validación me tira error.

No se si es la forma correcta de validar si el usuario tiene o no permisos para ver el formulario ya que lo estoy haciendo a nivel de botón de comando y no de formulario.


Erick gamer

Aprendiz de todos, maestro de nadie.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: en línea
Puntos: 5274
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 10:57
Hola!

No lo sé pero si [intLevel] es de tipo texto te falta unas comas simples:

If DLookup("[Data]", "AdminRoles", "[intLevel]= '" & Me.OpenArgs & "'") = True Then

................
Un Saludo.
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 15:53
Hola mounir,

Es correcto faltaria las comillas simples si fuera tipo texto, pero intLevel es de tipo integer.

Ya lo habia probado así agregar las comillas simples, pero sigue arrojando el mismo error.

Que mas podria ser el problema?

Erick Gamer


Aprendiz de todos, maestro de nadie.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: en línea
Puntos: 5274
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 16:01
Hola!

Si es de tipo integer pues sobraría

If DLookup("[Data]", "AdminRoles", "[intLevel]= " & Me.OpenArgs & "") = True Then

Editado por mounir - 05/Noviembre/2019 a las 16:01
Un Saludo.
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 17:00
If DLookup("[Data]", "AdminRoles", "[intLevel]= " & Me.OpenArgs) = True Then

Tal cual Mournir, error 2471:

'[intLevel]'

Erick Gamer

Aprendiz de todos, maestro de nadie.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12140
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 20:18
¿intLevel es un campo de la tabla AdminRoles?

Yo creo que no...
Xavi, un minyó de Terrassa

Mi web
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 20:33
Hola Xavi,

intLevel es la variable publica, tomando el valor del campo AdminRoles en el Login con este Dlookup

intLevel = DLookup("[Level]", "AdminUsers", "[NetId]= '" & Me.txtUser & "' AND [Password] = '" & Me.txtPass & "'")
En la tabla AdminUser el campo Level esta toma el campo IdLevel mediante un combobox
Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 22:43
Alguna otra sugerencia estimados?
U otra forma de validar los permisos del usuario basado en el usuario logueado y los botones a los que puede acceder?


Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12140
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 23:28
Punto 1: Entonces lo haces mal. El tercer argumento del DLookup no funciona como tu lo haces. Debe ser una equivalencia entre un campo de la tabla y un valor. Como hemos visto, intLevel no es un campo de la tabla. De ahí el error que te devuelve.

Punto 2: si, como dices en el primer mensaje,  intLevel es una variable pública (se supone declarada em un módulo independiente) no tiene ningún sentido pasarla mediante OpenArgs puesto que estará disponible en cualquier parte de la aplicación.

Punto 3: otra forma que yo he utilizado. 
Tabla Roles
1-Dios
2-Administrador
3-Superusuario
4-Usuario
5-Invitado

Tabla Objetos
NombreFormulario
IdRolMinimo

(se asume que una variable pública intRol almacena el Rol del usuario actual)
Función en módulo independiente

Función TienePermiso(strFormName As String) As Boolean
  Dim lngRolMinimo As Long
  ' Restrictivos
  TienePermiso = False
  ' Buscamos el Rol 
  lngRolMinimo = Nz(DLookup("IdRolMinimo", "tblObjetos", "NombreFormulario = '" & strFormName & "'"), -1) 

  If lngRolMinimo < 0 Then
    ' Formulario no encontrado: se asume que no hay restricciones
    TienePermiso = True
  Else
    ' Comprobamos el nivel del usuario con el minimo
    If intRol <= lngRolMinimo Then
      TienePermiso = True
    End If
  End If
End Function

En cada formulario, en el evento Open

Cancel = Not TienePermiso(Me.Name)

Un saludo


Editado por xavi - 05/Noviembre/2019 a las 23:29
Xavi, un minyó de Terrassa

Mi web
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Noviembre/2019 a las 23:40
Publicado originalmente por Erick Gamer Erick Gamer escribió:

Hola a todos,

Tengo el siguiente problema.

A una variable publica le paso el IdLevel del usuario logueado de la tabla AdminRoles.
Así:
intLevel = DLookup("[Level]", "AdminUsers", "[NetId]= '" & Me.txtUser & "' AND [Password] = '" & Me.txtPass & "'")



Pasar el valor si que lo hacia en un modulo independiente, ahora dejame probar lo que tu haces en el punto tres xavi.

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 251
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Erick Gamer Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 06/Noviembre/2019 a las 06:53
Tengo estas tres tablas y su respectiva relación:
Estruturas
He hecho las siguientes pruebas, en la tabla AdminObjects, agregue el nombre de dos formularios, repetido dos veces con los siguientes IdRol:
formMain,IdRol=1
formRegistration,IdRol=1
formMain,IdRol=Null
formRegistration,IdRol=Null

Voy al login y con tu función xavi, con el Rol de Admin accedo a los formularios formMain y formRegistration.
Con el rol de Superuser=2 no accedo, me marca error: 2501 OpenForm action was canceled.
Esto lo puedo tratar con un control de errores.

El problema viene en que después de hacer esa prueba agregue el IdRol a los dos formularios:
formMain,IdRol=2
formRegistration,IdRol=2

Y aun así, no me deja accesar a los formularios, entonces ando perdido, estoy haciendo las cosas mal o ese no es el correcto funcionamiento. Tu lo tienes con dos tablas yo quisiera hacerlo con las tres si es que es posible.

Aqui los codigos:

Public lngRol As Long '<--Variable global del rol del usuario

'Tu función
Option Compare Database

Function fPermit(strFormName As String) As Boolean
  Dim lngRolMinimo As Long
  ' Restrictivos
  fPermit = False
  ' Buscamos el Rol
  lngRolMinimo = Nz(DLookup("IdRol", "AdminObjects", "FormName = '" & strFormName & "'"), -1)

  If lngRolMinimo < 0 Then
    ' Formulario no encontrado: se asume que no hay restricciones
    fPermit = True
  Else
    ' Comprobamos el nivel del usuario con el minimo
    If lngRol <= lngRolMinimo Then
      fPermit = True
    End If
  End If
End Function

'Parte del login
Else
    lngRol = DLookup("[IdRol]", "AdminUsers", "[NetId]= '" & Me.txtUser & "' AND [Password] = '" & Me.txtPass & "'")
    If lngRol = 1 Then
    strUser = Me.txtUser.Value
    DoCmd.OpenForm "formMain"
    DoCmd.Close acForm, "formLogin"
    Else
    strUser = Me.txtUser.Value
    DoCmd.OpenForm "formMain"
    DoCmd.Close acForm, "formLogin"

'Evento open del formulairo
Private Sub Form_Open(Cancel As Integer)
Cancel = Not fPermit(Me.Name)
End Sub

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable