¿Cómo unificar código para deshabilitar y habilitar la tecla shift y restringir campos a usuarios en Access 2016?

Solicito amablemente su valiosa ayuda para resolver lo siguiente:

1.-Necesito restringir la edición de algunos campos y botones de comando de mis formularios a usuarios no autorizados. Es importante mencionar que este punto ya lo tengo solucionado con la siguiente macro la cual depende de las tablas "usuarios" y "registro", y se ejecuta desde un login de acceso.

'Private Sub CmbValidarRegistro_Click()
'If Nz(DCount("usuario", "usuarios", "contraseña = forms!usuarios!contraseña and usuario=forms!usuarios!usuario")) >= 1 Then
' DoCmd.SetWarnings False
' DoCmd.RunSQL "insert into registro(usuario,fecha,hora)values(Usuario,date(),time())"
' DoCmd.OpenForm "Frm_INICIO"
' DoCmd.Close acForm, "AccesoUsuarios"
'
'Else
' Contador = Contador + 1
' MsgBox "Verifica tu contraseña, " & Me.[Usuario], vbOKOnly, "Aviso, llevas " & Me.Contador & " intento(s)"
' DoCmd.CancelEvent
' If Contador = 3 Then
' MsgBox " Lo siento, tú no estás autorizado", vbOKOnly + vbCritical, "Intentalo más tarde"
' DoCmd.Quit
' End If
'End If
'End Sub

2.- Necesito proteger la estructura de mi BD antes de compartirla para que ningún usuario pueda acceder mediante la tecla shift, y solo yo como admin puedo habilitarla desde un optionbutton de mi form privilegios de admin, para ello, he sustituido la macro anterior para ejecutar esta otra desde el login de acceso, el código es el siguiente :

Private Sub CmbValidarUsuario_Click()
Dim OnOfRibbon As Integer
Dim OnOfShift As Integer
If IsNull(Me.txtUsuario) Then
MsgBox "Por favor, escriba su Usuario", vbInformation, "Usuario requerido"
Me.txtUsuario.SetFocus
ElseIf IsNull(Me.txtPass) Then
MsgBox "Por favor, ingrese su Contraseña", vbInformation, "Contraseña requerida"
Me.txtContraseña.SetFocus
Else
If (IsNull(DLookup("[Usuario]", "Usuarios", "[Usuario] ='" & Me.txtUsuario.Value & _
"' And Contraseña = '" & Me.txtConstraseña.Value & "'"))) Then
MsgBox "Usuario y/o Contraseña incorrectos"
Else
OnOfShift = DLookup("Activar_Shift", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
OnOfRibbon = DLookup("Mostrar_Cinta_Opciones", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
UserLevel = DLookup("Admin", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
If OnOfShift = -1 Then
TeclaShift "AllowBypassKey", dbBoolean, True
Else
TeclaShift "AllowBypassKey", dbBoolean, False
End If
If OnOfRibbon = -1 Then
DoCmd.ShowToolbar "Ribbon", acToolbarYes
Else
DoCmd.ShowToolbar "Ribbon", acToolbarNo
End If
If UserLevel = -1 Then
LogedUser = Me.txtUsuario.Value
DoCmd.Close
DoCmd.OpenForm "FrmMenu"
Else
LogedUser = Me.txtUsuario.Value
DoCmd.Close
DoCmd.OpenForm "FrmMenu"
End If
End If
End If

End Sub

Esta macro funciona sin problema, solo yo puedo habilitar o deshabilitar la tecla shift para poder modificar la estructura de mi BD cuando lo requiera. Sin embargo, la desventaja es que al desactivar la primera macro, todos los campos y botones de mis forms quedan habilitados para cualquier usuario y se compromete la integridad de la información.

Por lo tanto, necesito unificar y optimizar estas dos macros en una sola para que se ejecute desde el login, y con ello lograr el propósito de ambas con el fin de salvaguardar la integridad de la información, así como, la estructura de la BD.

Motivo por el cual recurro a su amplia experiencia y conocimiento para resolver lo anterior.

2 respuestas

Respuesta
1

Veamos, en el primer código que pones no hay nada que sirva para habilitar o deshabilitar campos y botones de tus formularios. Supongo que eso lo tienes en el formulario que abres, Frm_INICIO, que no es el que abres con el segundo código (que es FrmMenu)

Otra cosa que veo rara en el segundo código es que este bloque If no sirve para nada, porque da igual que se cumpla o no la condición, hace exactamente lo mismo:

If UserLevel = -1 Then
   LogedUser = Me.txtUsuario.Value
   DoCmd.Close
   DoCmd.OpenForm "FrmMenu"
Else
   LogedUser = Me.txtUsuario.Value
   DoCmd.Close
   DoCmd.OpenForm "FrmMenu"
End If

Si lo quitas, no notarás ninguna diferencia.

En cualquier caso, si quieres unificar los dos códigos solo has de meter dentro del if correspondiente del segundo código, las lineas que tienes en el primero, ya que las condiciones son idénticas:

Private Sub CmbValidarUsuario_Click()
Dim OnOfRibbon As Integer
Dim OnOfShift As Integer
If IsNull(Me.txtUsuario) Then
  MsgBox "Por favor, escriba su Usuario", vbInformation, "Usuario requerido"
  Me.txtUsuario.SetFocus
ElseIf IsNull(Me.txtPass) Then
  MsgBox "Por favor, ingrese su Contraseña", vbInformation, "Contraseña requerida"
  Me.txtContraseña.SetFocus
Else
  If (IsNull(DLookup("[Usuario]", "Usuarios", "[Usuario] ='" & Me.txtUsuario.Value & _
      "' And Contraseña = '" & Me.txtConstraseña.Value & "'"))) Then
      MsgBox "Usuario y/o Contraseña incorrectos", vbOKOnly, "Aviso, llevas " & Me.Contador & " intento(s)"
      Contador = Contador + 1
      Exit Sub
      If Contador = 3 Then
         MsgBox " Lo siento, tú no estás autorizado", vbOKOnly + vbCritical, "Intentalo más tarde"
         DoCmd.Quit
      End If
  Else
      OnOfShift = DLookup("Activar_Shift", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
      OnOfRibbon = DLookup("Mostrar_Cinta_Opciones", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
      UserLevel = DLookup("Admin", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
      CurrentDb.Execute "insert into registro(usuario,fecha,hora) values(Usuario,date(),time())"
      DoCmd.OpenForm "Frm_INICIO"
      DoCmd.Close acForm, "AccesoUsuarios"
      If OnOfShift = -1 Then
         TeclaShift "AllowBypassKey", dbBoolean, True
      Else
         TeclaShift "AllowBypassKey", dbBoolean, False
      End If
      If OnOfRibbon = -1 Then
         DoCmd.ShowToolbar "Ribbon", acToolbarYes
      Else
         DoCmd.ShowToolbar "Ribbon", acToolbarNo
      End If
End If
End Sub

No he tenido en cuenta lo que quieres hacer con UserLevel, y uso como formulario a abrir el del primer código (es decir, Frm_INICIO y no FrmMenu)

Buenas tardes, muchas gracias!

Es correcta su apreciación en cuanto a la restricción de los campos,  pues estos se encuentran en los formularios de consulta.

He realizado los ajustes de la macro en el login, pero al ejecutarlo me marca el siguiente error:

En mi respuesta simplemente he copiado los códigos que tenías y que decías que funcionaban. El error está en que en tu formulario no tienes ningún control que se llame contador.

Ahora que reviso el primer código, tengo mis dudas de que no te diera el mismo error...

La solución más sencilla es cambiar esa línea por esta otra, además de invertir el orden con la siguiente:

Contador = Contador + 1
MsgBox "Usuario y/o Contraseña incorrectos", vbOKOnly, "Aviso, llevas " & Contador & " intento(s)"
      

Si te fijas, solo hay que quitar el Me.

Muy buenos días!

Gracias por la atención, he estado revisando la macro y efectivamente me faltaba el control por eso me aparecía el error;  he realizado todos los ajuste necesarios que usted me ha indicado y aparentemente todo esta bien, pero cuando  intento abrir la aplicación y después de agregar el usuario y la contraseña, doy click  en el botón de comando y no pasa nada, no puedo entrar.

Qué cree usted que me este fallando para entrar a mi pantalla principal?

Por lo pronto y para salir del paso, he establecido  dos formularios de acceso, el primero para registrar el usuario en la tabla registros (primer código) y el segundo para validar el admin y entrar a la pantalla principal (segundo código), sé que esto no es lo correcto, pero necesitaba acceder a la aplicación :(

Comprueba que el código lo tienes bien asignado al botón correspondiente (y que el nombre sea correcto), porque me parece muy, muy raro que no haga nada...

Otra cosa, al pegar el código del primer procedimiento en el segundo, hay una cosa que se puede mejorar, y es cambiar el orden de alguna linea, para que quede así:

      OnOfShift = DLookup("Activar_Shift", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
      OnOfRibbon = DLookup("Mostrar_Cinta_Opciones", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
      UserLevel = DLookup("Admin", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
      CurrentDb.Execute "insert into registro(usuario,fecha,hora) values(Usuario,date(),time())"
      If OnOfShift = -1 Then
         TeclaShift "AllowBypassKey", dbBoolean, True
      Else
         TeclaShift "AllowBypassKey", dbBoolean, False
      End If
      If OnOfRibbon = -1 Then
         DoCmd.ShowToolbar "Ribbon", acToolbarYes
      Else
         DoCmd.ShowToolbar "Ribbon", acToolbarNo
      End If
      DoCmd.OpenForm "Frm_INICIO"
      DoCmd. Close acForm, "AccesoUsuarios"

El nombre del botón es correcto, por lo que me di a la tarea de revisar línea por línea y me di cuenta que el error lo tenia en la tabla usuarios, ya corregí el problema, pero además, he realizado el cambio en el orden de las líneas para mejorar el código como me lo sugiere, y funciona perfecto. ¡Muchas gracias! .

Saludos cordiales.

Respuesta
1

Jonathan, me tienes que perdonar pero hay cosas que no entiendo

1º Dices que desde el formulario Login se inhabilite la tecla SHIFT, pero pienso que para entonces la base ya está abierta, y, normalmente, se deshabilita la tecla SHIT "antes" de que se abra para que no puedan acceder a nada. La idea es impedir que un usuario abra desde Access abra la base manteniendo la tecla SHIFT pulsada y pueda acceder a ventana de navegación, etc.

2º Una vez que ya "estás dentro", ¿para qué sirve deshabilitar la tecla? ¿Para que te sirve habilitarla.?

3º Mencionas que en un formulario quieres inhabilitar ciertos controles. Pues según parte del código como al entrar, si acierta con el usuario y la contraseña te lo pasa a la tabla Registro, bastaría con que en el evento Al abrir del formulario que se pusieras algo como

If dlast("usuario","registro")<>"Jonathan" then

fechacompra.enabled=false

nombrecliente.enabled=False

etc.

end if

4º ¿No sería mejor ocultar todo el entorno Access, habiendo deshabilitado la tecla SHIFT y tu te guardas la base "normal"?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas