Error 2471 en validación
Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84793
Fecha de impresión: 27/Marzo/2026 a las 00:24
Tema: Error 2471 en validación
Publicado por: Erick Gamer
Asunto: Error 2471 en validación
Fecha de publicación: 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.
|
Respuestas:
Publicado por: mounir
Fecha de publicación: 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.
|
Publicado por: Erick Gamer
Fecha de publicación: 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.
|
Publicado por: mounir
Fecha de publicación: 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
------------- Un Saludo.
|
Publicado por: Erick Gamer
Fecha de publicación: 05/Noviembre/2019 a las 17:00
If DLookup("[Data]", "AdminRoles", "[intLevel]= " & Me.OpenArgs) = True Then |
Tal cual Mournir, error 2471:
'[intLevel]'
------------- Aprendiz de todos, maestro de nadie.
|
Publicado por: xavi
Fecha de publicación: 05/Noviembre/2019 a las 20:18
|
¿intLevel es un campo de la tabla AdminRoles?
Yo creo que no...
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: Erick Gamer
Fecha de publicación: 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.
|
Publicado por: Erick Gamer
Fecha de publicación: 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.
|
Publicado por: xavi
Fecha de publicación: 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
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: Erick Gamer
Fecha de publicación: 05/Noviembre/2019 a las 23:40
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.
|
Publicado por: Erick Gamer
Fecha de publicación: 06/Noviembre/2019 a las 06:53
|
Tengo estas tres tablas y su respectiva relación:
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ónOption 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 loginElse 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.
|
|