Access - Usuario Logeado

 
Vista:
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 18/11/2022 00:35:14
Hola Gente!!! Necesitaria que alguien me heche una manito...
Resulta que he "Creado" una BD, todo venia bien hasta que se me ocurrio colocar una "Auditoria" o control de cambios en los registros que encontré en Foros por lo que deje usar mi Login en el que utilizaba el metodo Args y ahora no puedo colocar el nombre del Usuario conectado en un formulario.
Entonces debo elegir entre quedarme con mi Login (sencillo) o utilizar la Auditoria pero pierdo mi Login... Os dejo el codigo del Modulo del Login y me dicen que puedo hacer? Ya he probado todo, variables globales, formulario chivatos, Args y nada... Si me pueden ayudar con esto os agradecere mucho!!

Saludos desde Surinam

Martin

Option Compare Database
Option Explicit
Private intentos As Integer
Private strUsuarioActual As String

Sub EntroAlSistema()
If IsNull(Forms!Clave.StrClave) Then
MsgBox "Debe incluir una Contraseña", vbInformation, "ATENCION"
Forms!Clave.StrClave.SetFocus
Exit Sub
Else
Call Controla(Form_Clave, Forms!Clave.StrClave)
If Autorizado Then
DoCmd.Close acForm, Form_Clave.Name
End If
End If
End Sub
Sub Controla(FrmClave As Access.Form, CpoContraseña As Access.control)
If Not IsNull(CpoContraseña) Then
intentos = intentos + 1
QuienEntro = Nz(DLookup("[Nombre]", "TUsuarios", "Contraseña= '" & CpoContraseña.Value & "'"), "No Esta")
setUsuarioActual QuienEntro
If QuienEntro = "No Esta" Then
FrmClave.Caption = "NO EXISTE EL USUARIO. ""lleva"" " & intentos & " de 3 Intentos"
CpoContraseña.Value = vbNullString
CpoContraseña.SetFocus
If intentos = 3 Then
DoCmd.SetWarnings False
FrmClave.Caption = "todos los Intentos fueron errados..."
MsgBox "Disculpe Ud supero el numero de intentos", vbInformation, "ATENCION"
DoCmd.Quit
End If
Exit Sub
End If
Autorizado = True
Else
MsgBox "Disculpe no esta autorizado", vbCritical, "ATENCION"
DoCmd.Quit
End If
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 18/11/2022 01:39:52
Creo que la duda y 'problema' no reside en guardar o no el usuario activo, la dificultad parece estar en entender que una cosa es una auditoria y otra crear el registro de cambios al que auditar.

El registro de cambios (al que también se suele llamar 'bitácora') lo generan los usuarios de forma paralela y automática al hacer su trabajo diario.

La auditoría la hace 'el auditor' leyendo el registro (bitácora) y analizado los datos para después extraer conclusiones y sea o no sea auditada su sesión, lo que haga el 'auditor' lo tendrá que hacer como cualquier otro usuario: con su clave.

Entrar 'con la clave de otro' para lo único que valdría seria para falsear los datos reales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 18/11/2022 02:29:27
Entiendo lo que me dices. "Auditoria" la llamo porque así lo nombro el programador!!. No explique esto... Mi problema reside en en que mi Login (la mayoría de los Login que he visto) consta de un ComboBox (Usuario) y una casilla donde ingresas el Password (txtPass), de esta forma si pude utilizar el método Args para extraer de allí el "Nombre" del usuario logeado.
El modulo de la Bitácora funciona bien con su propio login que tiene solo la casilla "strClave" donde ingresas la contraseña, sin nombre de usuario. Entonces en el Modulo_Clave no menciona al usuario. Mi pregunta es como puedo hacer para que funcionen ambas funciones: Poder utilizar la bitácora y a través del modulo del Login, extraer el nombre del usuario para colocarlo en un formulario.
Por otro lado, el sentido de poner la Auditoria no es "para saber a quien pegarle" si pasa algo sino poder recuperar aquellos registros que fueron erróneamente modificados.
Concretamente lo que necesito es o poder agregar alguna línea a este modulo de VBA actual para poder saber el nombre del usuario llamando desde una función. ACLARACION: Las líneas que contienen "setUsuarioActual", las agregue yo para probar si funcionaba, pero no...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 18/11/2022 12:06:22
Si no has creado la aplicación, creo que las modificaciones en lo concerniente a la seguridad deberían hacerlo el creador de la aplicación que conocerá la implicación de las posibles modificaciones o bien acudir a quien la diseño con las dudas.

Para acceder a una aplicación 'asegurada', normalmente se requiere una combinación única de usuario y contraseña, que los usuarios se elijan entre los disponibles en un combo no es el método más seguro (al intruso se le proporcionan pistas), con dos cuadros de texto (o uno en que alternativamente se solicite usuario y contraseña) se logra lo mismo.

Al usuario se le conoce en cuanto se le valide su contraseña, no veo en que parte interviene ¿OpenArgs? cuya finalidad es enviar 'cualquier cosa' para que esté disponible en el formulario/informe que se está abriendo.

Utilizar el nombre de usuario como elemento de seguridad (o distintivo) para abrir un formulario u informe, requerirá modificaciones en el diseño si se cambia al usuario o se desea reutilizar el formulario/informe, una asignación de permisos más eficiente puede convertir al director en un trabajador de menor rango y al cualificado para el puesto en el director (y solo modificando la tabla de permisos).

Si al usuario identificado se le 'recuerda' (la variable publica) estará disponible a la hora de grabar datos en la bitácora y para cualquier otra necesidad en su trabajo (por ejemplo acceder a su particular área de datos o clientes) y si existen rangos de accesos el que tenga permisos de mayor nivel (el jefe de sección) podrá acceder a los datos de sus subalternos (de ser posible: en modo solo lectura o limitado) y en esa misma línea los subdirectores de área acceden a los de los jefes de sección ... etc.

Y no hay que 'pegarle' a nadie, más de una vez le será útil para validar la calidad de su trabajo o premiarle por su eficiencia, verificar datos perdidos (sabiendo quien/quienes intervinieron pedirles que refresquen la información perdida ..) etc. y si en lugar de eficiente se le declara 'ineficiente' pues ...... a un curso de reciclaje.

El único que 'escribe' en la bitácora es la aplicación, el usuario activo hace su trabajo y el sistema (la aplicación) va anotando: usuario, fecha
y actividad a controlar sin que el usuario activo tenga intervención sobre ello.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 18/11/2022 12:26:28
Hola, te comento que ya hace unos meses le escribi al diseñador de BD, es JJJT de los foros de Access pero no tengo noticias de el y solamente te puedes contactar con el mediante su Facebook, desconozco su email.

En cuanto a tu apreciacion, al parecer no me has entendido. Lo que quiero hacer es solo, colocar en un formulario aparezca el nombre del usuario que esta usando el sistema, nada mas. Entiendo que se hace obteniendo dicha info del Form Login.

Gracias nuevamente y saludos

Martin
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 18/11/2022 13:33:03
Siento que no logres comunicarte con el autor, el tiempo pasa y los años se acumulan (solo lo que esta publicado en 'la nube' permanece tan joven como 'cuando nació').

Si la única finalidad es que aparezca el nombre del usuario activo y se utiliza el método de enviar el dato en la propiedad 'OpenArgs', no veo nada que lo invalide.
El inconveniente aparecería si en la misma sesión se cierra el formulario, al volverlo a abrir ya no estará disponible el dato (que estaría si se guarda en una variable publica).

No tengo nada más que añadir (hay cuando menos dos opciones a disposición).

Un Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 18/11/2022 14:57:27
Ya que lo dices, me puedes enseñar como utilizar el metodo "OpenArgs"? porque yo no he podido...
Gracias nuevamente
Martin
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 18/11/2022 18:08:03
Es una opcion disponible en VBA a la hora de abrir un formulario u informe, de la ayuda de Access:

El método OpenForm lleva a cabo la acción OpenForm (AbrirFormulario) en Visual Basic.
Sintaxis

expresión.OpenForm(FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)


En este caso concreto lo aplicaría así:

1
DoCmd.OpenForm "Un formulario", , , , , , QuienEntro 

Hay que respetar las comas y si se desease abrir el formulario con una condicion (filtro) y en modo Modal, se haria asi:

1
DoCmd.OpenForm "un formulario", , , "Costo > 100", , acDialog, QuienEntro

Y ya en el formulario se utiliza la propiedad (la variable con el valor antes asignado) para asignarselo a una etiqueta:

1
Me.[la_etiqueta].Caption = Me.OpenArgs

Y si se utilizo su propiedad Filter, se aplicaria un filtro en el ejemplo aquellos registros que en su campo Costo su valor fuera mayor de 100
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 18/11/2022 22:29:45
Holaaa!!! Otra vez yo... Perdona probé con tu recomendación, una vez que que chequeo el usuario y la contraseña y cerro el Form login le escribí "DoCmd.OpenForm "FPrincipal", , , , , , QuienEntro". Cree una Form "FPrincipal" chivato y en el cuadro de texto le puse "txtusuario".
En ese Form, le puse Al Cargar::
Private Sub Form_Load()
Me.[txtusuario].Caption = Me.OpenArgs
End Sub

Resultado, Entro a la BD perfectamente, abre el FPrincipal pero me da un error de complicación: No se encontro el metodo o el dato miembro. marcando en azul la frase: ".Caption ="... Estoy haciendo algo mal...???
Saludos de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 19/11/2022 03:05:22
la propiedad Captión solo está disponible para las etiquetas ¿se le esta asignando al objeto etiqueta asociada a un cuadro de texto o a un objeto que sea etiqueta e independiente?

Aconsejo ampliar un poco el método para asignarle el valor de OpenArgs si el formulario puede ser abierto sin un valor para la propiedad, (por ejemplo, se le abre desde diferentes ubicaciones), si se hace referencia a la propiedad y esta no tiene valor, dará un error en tiempo de ejecución, lo adecuado para estos casos es condicionarla:

1
2
3
Private Sub Form_Load()
If Nz(Me.OpenArgs, "") <> "" Then Me.Etiqueta54.Caption = Me.OpenArgs
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 19/11/2022 13:33:55
Eres los mas!!! Efectivamente, yo estaba queriendo colocar la información en un cuadro de texto independiente, jamás iba a funcionar...!!
Ahora...Perdona que use y abuse de tu paciencia.
Si en una vez autorizado el usuario a la BD y cerrado el Login yo quisiera poder poner esa información en una etiqueta pero en cada que el usuario abriera, como seria? con una consulta sql quizas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 19/11/2022 14:37:18
Has dado una vuelta completa para regresar al inicio.

Si (como era de suponer) se va a reutilizar esa información, lo correcto es dejarla a disposición para utilizarla en cualquier momento a lo largo de la sesion de trabajo.

Si se crea la variable como publica e independiente y se le asigna el valor en el momento de autorizar el acceso: el 'problema' es 'la solución'.

SI la variable fuera 'QuienEntro' los formularios se abrirían sin condicionantes (o como se quisieran condicionar) pero en lugar de utilizar 'OpenArgs' .....

Antes:
1
Me.Etiqueta54.Caption = Me.OpenArgs

Después:
1
Me.Etiqueta54.Caption = QuienEntro

Como 'QuienEntro' es una variable publica, estará a disposición para ser utilizada en donde haga falta.

Por cierto, si se desea visualizar el dato (OpenArgs o similar) en un cuadro de texto:

Me.[el cuadro de texto] = Me.OpenArgs (y tambien Me.[el cuadro de texto] = QuienEntro)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 20/11/2022 02:53:59
Holaaa...perdoooon por tanta insistencia pero esto ya se volvió personal...!!! Paso a contarte lo sucedido.
1. Hice la declaración publica e independiente en otro modulo: Public QuienEntro As String
2. En el form en el que tengo la etiqueta "txtuser" inserté Al Cargar :
Private Sub Form_Load()
If Nz(Me.OpenArgs, "") <> "" Then Me.txtuser.Caption = QuienEntro
End Sub
Resultado: No paso del Login, me da una falla de "Nombre Ambiguo" en QuienEntro. Estoy haciendo algo mal...??
Nota: Antes de hacer la declaración Publica, constate que no estuviera declarada previamente y hay una declaración en el "Modulo Auditoria" pero es una declaración Global, estará afectando esto...?? Te adjunto captura de pantalla del suceso para ser mas claro.
Saludos, gracias y perdon de nuevo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usuario Logeado

Publicado por Anonimo (3394 intervenciones) el 20/11/2022 15:55:41
Creo que los árboles no permiten ver el bosque.

El código publicado en el primer post tiene errores, no es funcional.

En principio supuse que era un error al copiar y pegar, pero una ojeada posterior (en la inútil búsqueda de donde se declaraban las variables) ha delatado errores: hay variables que no están declaradas que si declaran en un módulo independiente (para que actúen a nivel global) y están declaradas en otro sitio a nivel local, solo generaran conflictos.

Las declaradas a nivel local tendrán preferencia en su ámbito, el valor de una y otra son (y serán) diferentes, en el ámbito de la local esta será preferente y tendrá un valor, fuera de ese ámbito la misma referencia a la variable utilizara la declarada como publica a nivel global y (si anteriormente no se igualan) tendrá otro valor.

Un consejo, vuelve a leer lo anterior otra vez: es importante.
--------------------------

En esta linea (pertenece a la subfuncion Controla) :

1
setUsuarioActual QuienEntro

Supongo que en el original sera algo asi:
1
strtUsuarioActual = QuienEntro

Partiendo de que este codigo esta creado en un modulo independiente, se debe de modificar la declaracion de la variable:

1
2
'La actual:
Private strUsuarioActual As String

1
2
'La adecuada:
Public strUsuarioActual As String


Se le asigna a la variable 'strtUsuarioActual' el nombre del usuario activo, por lo que si se reescribe el código de la función 'Controla' de forma correcta debería funcionar tal y como lo habrá diseñado el autor original: para utilizar en el formulario el nombre del usuario activo (y cualquier otra necesidad):

Asignarlo a una etiqueta del formulario (en el formulario):
1
Me.[la etiqueta].Caption = strtUsuarioActual

Asignarlo a un cuadro de texto en las mismas condiciones:
1
Me.[el cuadro de texto] = strtUsuarioActual

En definitiva, el autor utiliza el sistema clásico (y lógico) para manejar la seguridad básica.
Quizás tenga un módulo 'más avanzado' que controla los accesos permitidos al contenido (formularios/informes, tablas, consultas, macros, VBA pero ya seria otro hilo).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Usuario Logeado

Publicado por Martin (17 intervenciones) el 21/11/2022 18:00:48
Holaa!!! Lograste hacerlo y yo estuve aprendiendo mucho contigo, Milloooooon de gracias!!!
Saludos
Martin
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar