Access - Problemas con último usuario

 
Vista:

Problemas con último usuario

Publicado por David (23 intervenciones) el 26/01/2024 16:19:41
Hola.
Tengo una BD a la que accedo a través de un formulario Utilizador/Contraseña.
((Digo “Utilizador” para no confundirlo con el “Usuario” que ha entrado en Windows.))
Una vez dentro, unos utilizadores tienen acceso a toda la información y otros sólo a algunos formularios/datos.
Esto lo hago mediante un subformulario oculto que me dice quién es el último utilizador que ha accedido, y según quién sea tiene acceso o no.
El problema es el siguiente:
Desde su ordenador, el Utilizador Pepito (que tiene acceso a todo) abre el programa (en ese momento se queda en la tabla como "último utilizador”). Al poco, el utilizador Manolito (con acceso restringido), abre el programa desde otro ordenador, y pasa a ser él el último utilizador. Entonces, cuando Pepito abre algún formulario, el programa interpreta que ya no tiene acceso porque el último utilizador es otro.
¿Cómo puedo solucionarlo?
Gracias de antemano a todo el mundo


David
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

Problemas con último usuario

Publicado por Anonimo (3316 intervenciones) el 26/01/2024 22:02:35
Lo idóneo es que en la apertura de los objetos, se modifiquen los/sus permisos en función del utilizador que accede y el 'ultimo utilizador' deja de tener importancia ya que se trabaja con el utilizador activo.

Lo que no veo claro en el actual esquema es el manejo de los datos y los permisos, parece que solo puede haber un único usuario (no se asume la concurrencia), pues si el ultimo utilizador es Pepito, Manolito tendría acceso total (un poco raro), una adecuada compartición debería permitirles acceder de forma simultanea a ambos con los permisos que a cada uno le correspondiesen..
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

Problemas con último usuario

Publicado por David (23 intervenciones) el 27/01/2024 09:19:31
No había puesto que el programa estaba en red y se dividía en Front y en Back.
Se puede acceder al back desde diferentes ordenadores en red desde el Front respectivo. Incluso en un mismo ordenador puede haber varios Front abiertos. Si no fuera así, sería más sencillo contar sólo con el dato del usuario del ordenador, que sólo es uno por máquina activa (mientras que el usuario del programa -"utilizador"- puede ser múltiple)
En el programa en concreto hay datos sanitarios sensibles a los que sólo podrán acceder los médicos (por ejemplo, el Dr. Pepito), mientras que los "contables" (por ejemplo Manolito) sólo podrán acceder a datos puramente administrativos. Por eso hay dos tipos de acceso: total y restringido.
Espero haberme explicado un poco mejor.

Se me ha ocurrido crear un formulario oculto que se abre tras poner los datos Utilizador/contraseña y que se cierra al cerrar el programa, por lo que siempre estará cargado. En este formulario se cargarían los datos de Utilizador/Contraseña, los cuales estarían siempre accesibles, y serían diferentes para cada Front conectado.
Entonces crearía código del estilo:
Si UtilizadorActual ="Pepito" Then formularioX.CuadroY.visible =True
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

Problemas con último usuario

Publicado por David (23 intervenciones) el 27/01/2024 14:17:55
Me respondo a mí mismo.
Por una parte, tengo un formulario Utilizador/contraseña, que busca los datos en una Tabla de Utilizadores con nombre, contraseña, nivel de seguridad (diferentes grados de nivel de acceso, según utilizador y contraseña, ya que un mismo utilizador puede tener diferentes contraseñas que le otorgan diferentes permisos)
Cuando se acepta utilizador y contraseña, se guardan estos datos en la tabla de utilizadores.
Creo un formulario (el que está oculto y que permanece activo hasta que se cierra el programa) que, a través de un subformulario, recoge los datos anteriores y los copia en cuadros de texto: txtUtilizador y txtContraseña.
En ese Subformulario pongo código en el evento Después de Actualizar del campo Utilizador (recogido a través del formulario de contraseña --> tabla de Utilizadores --> Consulta Último Utilizador) y le digo que si el cuadro txtUtilizador >”” que se bloquee (el campo Utilizador del subformulario).
He abierto varias Front en un mismo ordenador con diferentes niveles de permiso y ha funcionado perfectamente.
Haré pruebas en varios ordenadores accediendo al mismo tiempo al Back .
Espero que se entienda.
Si alguien tiene una idea mejor, que me lo diga y podré mejorar mi propuesta.
Gracias a todo el mundo
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

Problemas con último usuario

Publicado por Anonimo (3316 intervenciones) el 27/01/2024 21:22:42
Si funciona como se espera nada hay que añadir.

Si en un futuro se plantease la forma de conservar esos datos (para su uso en la sesión activa, al finalizarla se pierden), en lugar de utilizar un formulario utilizaría variables declaradas como publicas, consumen menos recursos y si se desea obtenerlas 'fuera de VBA' se logra mediante funciones muy simples.

Se puede crear una función para que devuelva el usuario y otra el/su nivel de permiso o bien una sola que necesitará un parámetro que le indique que dato ha de devolver.

Hay otra alternativa: las variables-temporales (son un recurso nuevo/viejo) que permiten hacer prácticamente lo mismo (tal vez se tiene menos control sobre ellas, pero están a disposición).

Un ejemplo de como funcionaria para obtener el nivel de permisos y el usuario al que se le asignan.

.- Se dimensionan dos variables publicas (en un modulo independiente o uno ya existente).
.- En el formulario de entrada (donde se solicita usuario/contraseña) y tras pasar con éxito la validación:
.- Se le asigna a una de las variables el nombre (que se conoce) y a la otra su nivel de privilegio.
(su contraseña no me parece necesaria, solo interesa el nivel de acceso, ¿el nombre? ... solo si ha de figurar en alguna parte).

Sea Juan, Pedro o Luis, o que sea el gerente o un peón es lo de menos, lo importante es el nivel de permisos, dato que se utilizara para manipular en tiempo de ejecución a los formularios/informes.
(activando/desactivando en tiempo real las mismas opciones que actualmente hace el formulario oculto)
(formulario oculto que tras esta modificación se convierte en innecesario y desaparece).
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

Problemas con último usuario

Publicado por David (23 intervenciones) el 28/01/2024 11:24:42
Muchas gracias, una vez más, Anónimo.
Si supiera hacer todo eso, ya no habría necesitado la ayuda del foro.
Mi nivel es bajito, y necesito las instrucciones "para tontos": paso a paso. Por ejemplo, qué escribo exactamente en esas variables públicas.
El formulario oculto lo mantengo abierto hasta el final, con la orden de que al cerrase registre now(), y con una simple resta se queda archivada la duración de la sesión.
Gracias 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

Problemas con último usuario

Publicado por Anonimo (3316 intervenciones) el 29/01/2024 01:09:53
Prefiero ser burro que caballo, un burro puede aprender y dejar de serlo (y con el tiempo llegar a ser el jinete del caballo).

Aprender Access no se logra con un par de lecciones y este foro no es el entorno ideal para dar clases (máxime habiendo como hay cursos en video y los impagables en PDF).

Unos pasos sencillos para crear un modulo desde cero desde la barra superior:

En la pestaña 'CREAR' click en en 'MÓDULO', se abre una ventana (la de VBA) y si es el primero propondrá como nombre 'Módulo' + un numero ascendente (lo propone Access por defecto, pero se le puede cambiar).

En la ventana de trabajo aparece por defecto:
Option Compare Database

Añadiría una línea mas debajo de la anterior:
Option Explicit es una regla que exigirá la declaración de las variables.

A continuación se declaran las variables que se necesitan y para utilizarlas fuera de VBA se las declara como publicas.

A las líneas anteriores se le añaden las declaraciones de las variables:
1
2
Public L_Usuario As String ' el nombre del usuario activo, texto
Public L_Nivel As Long  ' su nivel de privilegio, número

En el formulario de entrada (donde se solicita usuario/contraseña) tras validar los datos se le asignan los datos a las variables:
L_Usuario = Me.Txt_USUARIO ' toma el nombre de cuadro de texto (le he llamado Txt_Usuario), pero podria llamarse 'Texto8' si se le dejo el nombre que propone Access.

Como se conoce el nombre y la contraseña, en la misma ubicación que la contraseña debería estar su nivel de permisos y ese dato (que podrá ser numérico o alfanumérico, en el ejemplo es numérico) tras obtenerlo se le asigna a la variable 'L_Nivel' (no has publicado como lo haces, tendrás que publicarlo o adaptar lo anterior)

Para utilizar libremente los datos guardados (en informes, formularios, consultas y macros) se utilizaran funciones, las funciones pueden devolver un dato.

Creamos una función para obtener el nombre del usuario (un texto):

1
2
3
Public Function DameUser () As string
DameUser = L_Usuario
End function

Otra para el nivel de privilegio (un numero)

1
2
3
Public Function DameNivel () As long
DameNivel = L_Nivel
End function


Estas funciones, al igual que se le pide la fecha con: Fecha(), devolverá el usuario activo con DameUser() y su nivel con DameNivel()


El código del modulo al completo (y con espacio para añadir mas funciones variables ....):

1
2
3
4
5
6
7
8
9
10
11
12
Option Compare Database
Option Explicit
Public L_Usuario As String
Public L_Nivel As Long
 
Public Function DameUser () As string
DameUser = L_Usuario
End function
 
Public Function DameNivel () As long
DameNivel = L_Nivel
End function

(No olvidarse de guardar el modulo, con escribirlo una vez debería ser suficiente)
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

Problemas con último usuario

Publicado por David (23 intervenciones) el 29/01/2024 20:28:15
Muchas gracias, Anónimo, por tu trabajo y tu paciencia
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

Problemas con último usuario

Publicado por Eduardo Pérez Fernández (317 intervenciones) el 29/01/2024 17:27:02
Como tiene diseñado su sistema no admite múltiple concurrencia y como dice que sus conocimientos son pocos no comprenderá las soluciones que le brindemos.
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

Problemas con último usuario

Publicado por David (23 intervenciones) el 29/01/2024 20:32:42
Con mis conocimientos limitados y las ideas que me ha ido dando Anónimo, he logrado que el programa funcione. No sé si perfectamente, eso lo iré viendo con el tiempo.
Estoy convencido que cualquier experto borraría la mitad de todo el código que tengo puesto por redundante, inútil o conflictivo, y conforme voy adquiriendo conocimientos lo voy puliendo.
Gracias a todos por vuestra ayuda.
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