Imprimir página | Cerrar ventana

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]'

Erick Gamer



-------------
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
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.


Publicado por: Erick Gamer
Fecha de publicación: 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.



Imprimir página | Cerrar ventana