FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour C贸mo saber que usuario esta usando la aplicaci贸n?
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM

C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Tue Jun 30, 2009 02:17 PM

Hola a todos

En internet he encontrado un programa WHOHASNT que me muestra que usuario esta utilizando la aplicaci贸n en la red, solo indicandole la carpeta. Tambi茅n permite cerrar

Se puede hacer esto con Fivewin-xHarbour, C贸mo?

Lo necesito porque en el momento del cierre diario, hay usuarios que dejan algo abierto y se tranca, tenemos que averiguar que usuario.

Espero que algui茅n me pueda ayudar

Saludos cordiales

Adhemar

Saludos,



Adhemar C.
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Tue Jun 30, 2009 02:44 PM
Hola amigo.
Yo tengo una rutina que la uso para saber cuales son los usuarios que est谩n en el sistema a la hora de generar los indices.
Para verificar que solo se est谩 en la PC que van a ejecutar tal operaci贸n.
Basicamente la funci贸n lo que hace es guardar en una tabla los usuarios que ingresan al sistema. (Nombre de PC y Usuario de Windows)
La tabla solo tiene esos dos campos.

NI bien ingreso al sistema hago lo siguiente:
Code (fw): Select all Collapse
USE ENUSO NEW
DATABASE oDbfUso
oDbfUso:bEof:=nil
oDbfUso:GoTop()

oDbfUso:Blank()
oDbfUso:PCNOMBRE:=GetEnv("COMPUTERNAME")
oDbfUso:PCUSER 聽:=GetEnv("USERNAME")
oDbfUso:Append()
oDbfUso:Save()
oDbfUso:UnLock()
oDbfUso:CLOSE()


Al salir del sistema hago lo siguiente para borrar el registro de que indica que el usario est谩 en el sistema.
Code (fw): Select all Collapse
USE ENUSO NEW
DATABASE oDbfUso
oDbfUso:bEof:=nil
oDbfUso:SetOrder(1)
oDbfUso:GoTop()

DO WHILE !oDbfUso:Eof()
聽 聽IF ALLTRIM(oDbfUso:PCNOMBRE)=ALLTRIM(GetEnv("COMPUTERNAME")) .AND.;
聽 聽 聽 ALLTRIM(oDbfUso:PCUSER)=ALLTRIM(GetEnv("USERNAME"))
聽 聽 聽 oDbfUso:RecLock()
聽 聽 聽 oDbfUso:Delete()
聽 聽 聽 oDbfUso:UnLock() 
聽 聽ENDIF
聽 聽oDbfUso:Skip()
ENDDO
oDbfUso:CLOSE()

Lo hago secuecialmente ya que generalmente no van a haber muchos usuarios en el sistema. Si fueran 100 esto igual ser铆a muy r谩pido.

Bueno a la hora de ejecutar la funci贸n de generar 铆ndices ejecuto antes la siguiente funci贸n:
Code (fw): Select all Collapse
Function VerificaUsuarios(SiUser)
Local oDbfUso,C,PC,User

C:=0

USE ENUSO NEW
DATABASE oDbfUso
oDbfUso:bEof:=nil
oDbfUso:GoTop()

DO WHILE !oDbfUso:Eof()
聽 聽IF ALLTRIM(oDbfUso:PCNOMBRE)<>ALLTRIM(GetEnv("COMPUTERNAME")) .AND.;
聽 聽 聽 ALLTRIM(oDbfUso:PCUSER)<>ALLTRIM(GetEnv("USERNAME"))
聽 聽 聽 C++
聽 聽 聽 IF C=1
聽 聽 聽 聽 聽PC 聽 聽:=ALLTRIM(oDbfUso:PCNOMBRE)
聽 聽 聽 聽 聽User 聽:=ALLTRIM(oDbfUso:PCUSER)
聽 聽 聽 聽 聽SiUser:=.t.

聽 聽 聽 聽 聽MsgStop("El usuario: ''"+User+"'' en la PC de la red: ''"+PC+"'' se encuentra utilizando el sistema"+CHR(13)+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"Por favor, cierre el sistema en todas las PCs de la Red para poder realizar esta operaci贸n",;
聽 聽 聽 聽 聽 聽 聽 聽 聽"Imposible reindexar sistema")
聽 聽 聽 聽 聽EXIT
聽 聽 聽 ENDIF
聽 聽ENDIf
聽 聽oDbfUso:Skip()
ENDDO
oDbfUso:CLOSE()

Return nil


Luego dentro de mi funci贸n reindexar la llamo asi:
Code (fw): Select all Collapse
Function Reindexa()
Local SiUser:=.f.

VerificaUsuarios(@SiUser)

IF SiUser
聽 聽Return nil
ENDIF

// Sigue el proceso
...
...
...

Return nil


Quiz谩 hay formas m谩s sencillas de hacer esto, pero es la forma que a mi se me ocurri贸.
Espero puedas adaptar esto a tus necesidades.
Saludos,
Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Tue Jun 30, 2009 03:07 PM

Gracias, Distinguido Esteban

Muy buena idea, la pondr茅 en pr谩ctica, como dices quizas algui茅n tenga otra idea.

Saludos

Adhemar

Saludos,



Adhemar C.
Posts: 883
Joined: Tue Oct 11, 2005 11:57 AM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Tue Jun 30, 2009 03:48 PM

Holas ..

Se me ocurre algo...
...que algun guru se pronuncie.

...si tengo mi aplicacion "escuchando" en algun puerto, puedo enviar una solicitud de respuesta desde cualquier Pc a la red y los Pc's que esten en la aplicacion responderian con su nombre y usuario activo.

Para eso habria que utilizar sockets, que por los post que he visto, hay quienes los utilizan sin problemas, seria una buena solucion ademas que serviria para controlar el N潞 de usuarios conectados al sistema, asi desarrollar versiones de 5, 10 o mas usuarios.

Alguna sugerencia.

voy a aprovechar de ver los ej, en una de esas no es tan dificil implementarlo.

Desde Chile

Adolfo

;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
Posts: 1283
Joined: Fri Feb 10, 2006 02:34 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Wed Jul 01, 2009 10:31 AM

Hola Esteban,

La idea es un inicio, el problema es cuando algun cliente/usuario sale de la aplicacion de manera 'anormal'. Q ocurre entonces ? el registro se mantiene con sus datos y te impide a ti seguir. El ejemplo seria mas evoluciuonado si como dice p.e. Adolfo, a mas del nombre de maquina, pongas la ip del user. A la hora de verificar con las maquinas, enviar via socket a cada Ip y esta q responda. No es muy complejo de hacer, pero ya necesitas habilitar el sistema de envio/recepcion en cada app. (no se si me he explicado... :D )

Siau

Salutacions, saludos, regards

"...programar es f谩cil, hacer programas es dif铆cil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
HIX -> https://github.com/carles9000/hix
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Wed Jul 01, 2009 12:04 PM
Carles wrote:Hola Esteban,

La idea es un inicio, el problema es cuando algun cliente/usuario sale de la aplicacion de manera 'anormal'. Q ocurre entonces ? el registro se mantiene con sus datos y te impide a ti seguir. El ejemplo seria mas evoluciuonado si como dice p.e. Adolfo, a mas del nombre de maquina, pongas la ip del user. A la hora de verificar con las maquinas, enviar via socket a cada Ip y esta q responda. No es muy complejo de hacer, pero ya necesitas habilitar el sistema de envio/recepcion en cada app. (no se si me he explicado... :-) )

Siau

Si te explicas bien, es algo que se que le falta a esta rutina...
Por ahora lo que estoy haciendo es en ese caso volver a ingresar y salir del sistema en la PC que se sali贸 de manera abrupta, sea el motivo que sea, corte de luz un bug del programa, etc... ingresando y saliendo ya se borra el registro, ya que lo hago secuencialmente y va a borrar todos los que hayan de la misma PC y el mismo usuario. Se que es un defecto de la rutina, pero en condiciones normales anda bien. Estar铆a bueno poder mejorarla un poco m谩s, claro est谩.
Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Wed Jul 01, 2009 03:14 PM

Me parece que la idea de los Socker por parte Adolfo es adecuada, por que no permite sdaber en todo momento si la aplicacion esta arriba. pasando por altoi los problemas de cierre del programa por cualquier motivo.

salu2

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Fri Jul 03, 2009 02:02 PM

Se帽ores,

Hace mucho tiempo, en alguna lejana galaxia.... creo haber publicado la forma de resolver
este tipo de problemas.

Se trata de obtener un "algo" bloqueante que cuando caiga el sistema (la red, el pc, el ordenata, el ctrl+alt+del) se "recomponga" automaticamente y la solucion ES:

un fichero de texto....

驴 como ? un fichero de texto soluciona esto ? pues SI... vamos a ver:

PSEUDOCODIGO para hacer un fichero de texto como bloqueo:

nHandle:= FCreate(CODIGO_USUARIO+ ".log", MODO COMPARTIDO)
fwrite(nhandle, computername())

Si queremos saber si CODIGO_USUARIO esta conectado solo es necesario mirar si existe su log y si existe entonces intentar abrirlo en EXCLUSIVO y si no se puede abrir en exclusivo es que el usuario esta conectato... no se si me explique..

Con este sistema se puede:
Saber que usuarios estan conectados al programa o programas que emitan bloqueos de control
Poder saber que documentos estan bloqueados (albaranes, fras...), aquellos documentos que emitan bloqueos de controls
Impedir entrar a una aplicacion que ha sido bloqueada

Y parafraseando a aquel... "dame un fichero para bloquear y bloqueare el mundo""

POSTDATA:
1潞 Este sistema tiene la ventaja que funciona en cualquier sistema, incluso Clipper)
2潞 Este sistema no necesita identificacion de equipos, ni controls de IPs ni nada por el estilo que lo unico que producen son dolores de cabeza para el "programando"

saludos

Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Sat Jul 04, 2009 02:12 AM

....otra idea, nmo la he probado, pero me gustaria saber si funciona

supuestamente el sistama autentica usuarios, por lo tanto tienes una tabla (dbf) de usuarios, entonces,
cada usuario al ingresar al sistema podria bloquear su registro de la tabla de usuarios, por lo tanto intentando
bloquear estos registros, sabrias que usuarios estan usuando el sistema. No estoy seguro hasta donde una colgada
podria dejar bloqueado el registro, pero una mala salida creo que lo desbloquearia, haber si pruebas esta posible
solucion y nos comentas.

saludos

Marcelo

Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM

Re: C贸mo saber que usuario esta usando la aplicaci贸n?

Posted: Sat Jul 04, 2009 01:43 PM

Hola a todos y Gracias por sus aportes

Siguiendo algunas ideas, al ingresar guardo el nombre del equipo, y al salir del sistema controlo cualquier salida con:

oWnd:bValid{ || Final(),.T.}

...

Funtion Final()
//Pongo el blanco el nombre del equipo
Return Nil

La 煤nica forma de que no va a la funci贸n Final() es cuando se quita la corriente o se cuelga.
Si dejamos la aplicaci贸n abierta y Pulsamos Alt-F4, cambiamos de sesi贸n, reiniciamos o apagamos normal, funciona

Pero creo que se necesita algo m谩s para controlar.

Saludos

Adhemar

Saludos,



Adhemar C.

Continue the discussion