Obtener ID de Sesion


([N3] blanyi) #1

Buenos días.
Quiero saber si hay alguna forma de obtener un número que identifique la sesión (o no estoy seguro si la instancia) que ha abierto un usuario. Esto porque como en el vclient (dentro de una misma máquina) se puede ejecutar varias veces la misma solución, entonces quiero identificar cuál sesión puede estar trabajando un mismo usuario.

Agradezco de antemano la colaboración.

YIMY MORA ACONCHA


([N4] Infortic) #2

No se que pasa, no me deja responder, vuelvo a probar.

Lo que propones sería fantástico, es una cosa que hecho MUCHO de menos.

Si existiera dicha “variable” se acabarán todos los problemas de persistencia de valores de variables en memoria entre el vserver y el vclient, símplemente habría que crear una tabla de variables por id de sesión.

Mucho me temo que no existe (si me equivoco que me corrijan), y es algo que deberían plantearse, pues es una limitación muy grande.


([N1] wikan) #3

Podrías crear una variable en memoria única cada vez que arranques el vClient.


([N3] blanyi) #4

Gracias Manuel, por tu respuesta.

Disculpa, pero no logro entender que quieres decir con “variable en memoria única”.
Por favor podrías detallar un poco más.

YIMY MORA ACONCHA


([N1] wikan) #5

Creas una variable en memoria, SESION
Y le asignas un valor único al ejecutar cada vClient, les das de alta en una tabla de sesiones y ya tienes controlado cada vClient.

En el OnClose, borras el registro y listo.

En el caso que se cierre el vClient de manera forzosa quedaría ese registro pendiente, así tendrías que hacer un control de sesiones para eliminarlos, podría ser incluso al cerrar cada vClient que elimine los registro con x días


([N4] Infortic) #6

Wikan, en el caso de blanyi podría servir.

En el caso de persistencia de variables que digo yo no, pues tienes el mismo problema, el id de sesión en memoria lo conoce el cliente, pero no el server, en las llamadas a triggers etc se pierde el valor :frowning:


([N1] wikan) #7

Podrías tener el valor igual que enviamos al servidor el usuario, empresa, etc.
Prueba a enviar esa variable con una función,
fun:ID_SESSION(%VARIABLE%)

y que la función retorno simplemente el valor que recibe.
Si no recuerdo mal ahora, debería devolverte el valor que manda el vClient, por que si lo necesitas para un trigger, supongo que tb lo guardas en una tabla.


([N4] Infortic) #8

Probaré a guardarlo en 3er plano con una función, creo que lo probé una vez y había casos en los que perdía el valor… la última vez no lo conseguí


([N3] blanyi) #9

Gracias Manuel.
Probaré lo que me propones, aunque aun tengo mis dudas. Lo que he entendido es esto:
Creo una tabla sesion en donde estaría el nombre del usuario que inicio la sesión y otro campo con un número que contiene el número para esa sesión.

¿Pero si en la misma máquina, el mismo usuario inicia otra sesión en la tabla sesion qué valor se almacena?
¿Se reemplaza el valor anterior de sesion para ese mismo usuario que ha iniciado una nueva sesion en la misma máquina?
¿Se crea un nuevo registro, pero el valor de sesion para ese nuevo registro de ese mismo usuario es el mismo que el anterior? Si el valor es diferente como refrenciaría el vclient cada una de estas sesiones para identificar cuál es cada una de ellas?

Cordial saludo.

YIMY MORA ACONCHA


([N1] wikan) #10

@blanyi,

  1. cuando arrancas el vClient, hay que generar un identificador único, aunque sea el mismo usuario, misma instancia, misma máquina. Debe ser único.

** Si esas windows, en el registro se guarda el valor LTE, en la rama de Velneo/vClient que (no estoy seguro), creo que equivale al identificador que aparece en el vAdmin para ese engache, abría que comprobarlo.

  1. Guardas el identificar y el usuario en la tabla de sesiones
    Si lo haces un un crear ficha, alta ficha, no tendrás problemas del valor en el cliente, valor en el servidor
    Podrías añadir, Fecha/Hora, Nombre de la máquina, Ip, toda la info que quieras

  2. En el evento OnClose, cargas tu registro de sesión y zasss borralo.

Notas:
Yo uso un trigger en una aplicación de mensajería, dónde indico al servidor que sigo activo, cada x minutos actualizo mi registro para saber que sigo vivo

Como no tenemos demonios, en el OnClose, borraría, el registro de sesión actual, y todos los que consideres que han caducado.

De todas formas, si no mala pregunta, ¿con qué fin necesitas esto?


([N3] blanyi) #11

Hola Manuel, buenos días.
Lo que sucede es que me di cuenta que los usuarios en una pequeña aplicación que tengo en V7 ejecutan varias veces el vclient y algunas de esas veces abren el mismo formulario en las diferentes sesiones que tienen abiertas.

Entonces, hay un formulario en el que llamo un proceso que guarda unos datos en una tabla con persistencia en disco. Estos datos son temporales, cada vez que se inicia el proceso borra los registro del usuario que ha iniciado sesion y guarda los nuevos registro que se originan de acuerdo a unos parametros dados por el usuario. Esto es para generar un informe.

Lo que se presenta entonces y es lo que estoy previendo, es que si el usuario entra por una sesion y ya tenía abierta otra sesion al borrar los registro, borraría todos los de ese usuario sin importar de que sesión son. Lo que espero conseguir entonces es que si logro indentificar la sesión y la guardo en un campo de tabla al eliminar los registros lo haría teniendo en cuenta tanto el usuario como de la sesion que se indique.

Gracias.

YIMY MORA ACONCHA


([N4] velavisual) #12

@blanyi

Creo que debes leer el artículo sobre el Ámbito de las variables donde se indica que:

El contenido de una variable global en disco es común a todos los usuarios y planos de ejecución (tanto en los clientes como en el servidor). Por tanto, si desde una sesión de Velneo vClient V7 se modifica una variable global en disco, esta modificación afectará tanto al resto de los clientes que estén ejecutando la misma instancia como a los procesos que hagan uso de ella en el servidor (procesos ejecutados en tercer plano).

Te recomiendo que las variables en disco las tengas en una tabla en disco y estas sean leídas cuando inicia sesión el vclient y usuario.


([N1] wikan) #13

¿Y si usas la tabla en vez de en disco en memoria?
tal y como lo describes no tendrías ningun problema, ya que es por cada usuario y a nivel local.
Incluso, si no recuerdo mal, las tablas en memoria pueden hacer actualizaciones a tablas en disco.


([N3] pacosatu) #14

Hola YIMY.

Si me permites, hago un pequeño resumen de este tema, que puede interesar a otros programadores noveles en Velneo.

Existen básicamente 3 niveles de persistencia de información en disco (aunque podemos crear más) que se diferencian por el tiempo de vida en activo del objeto.

  • Aplicación: todo lo que gestiona la Aplicación tiene una persistencia en disco permanente y afecta a todos los Usuarios.
  • Usuario: lo que gestiona el Usuario tiene persistencia en disco mientras ese usuario tiene permiso de acceso en la Aplicación. Los cambios afectan al Usuario conectado a la Aplicación (puede estar conectado el mismo usuario n-veces).
  • Sesión: la información creada en una sesión solo tiene persistencia en disco mientras dura dicha sesión. La sesion va normalmente asociada a un deteminado Usuario aunque puede haber Sesiones anónimas. La Sesión es efímera, solo debe dejar un rastro en forma de Log o histórico. La Sesión desaparece cuando hay un error de conexión, el Usuario y Aplicación son permanentes.

Así que efectívamente, todos los registros creados a nivel de Sesión deben ir identificados con el ID de Sesión (puedes añadir el Id de Usuario pero no es necesario). Simplemente tienes que generar en el vClient un ID de sesión (único en el tiempo) tal como ha indicado Manuel y con las técnicas de Velneo compartirlo en 3º plano para los procesos que lo necesiten.

En resumen, cuando necesites datos temporales que deben ser guardados en alguna tabla en disco, siempre necesitarás un Id de Sesión para que el 3º plano sepa qué registros gestionar en cada momento. Y olvídate del Id de Usuario, el 3º plano solo entiende de Sesiones.

Espero haber aclarado un poco la cuestión.

Saludos
Paco Satué


([N1] Juan) #15

Es imperioso que se tabla en disco? y porque para poder ayudarte.


([N3] blanyi) #16

Hola Juan, buenos días.
Inicialmente lo probé con tabla en memoria, pero me encontré con la dificultad, y era algo que no había entendido, que las tablas en memoria no las ve el vServer y yo quería ejecutar el proceso que llena la tabla en 3er plano para que fuera más rápido pero en el 3er plano aparentemente procesaba pero la tabla la dejaba vacía.

Cuando ejecuto el proceso en 1er plano, todo va bien y la tabla queda con los datos generados, pero el proceso es muy lento de esta manera. Por esa razón quiero hacerlo con tablas en disco y en 3er plano, pero aquí me he encontrado
con la dificultada planteada al inicio de este hilo.

Gracias.

YIMY MORA ACONCHA