Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   saber quien esta conectado a mi programa delphi (https://www.clubdelphi.com/foros/showthread.php?t=74293)

ingabraham 10-06-2011 01:19:49

saber quien esta conectado a mi programa delphi
 
tengo desarrollado un programa qlo hice el delphi 7 y firebird 2.0
lo conecto a los clientes a traves de la ip del servidor.


quiero que en mi form principal me aparescan usuarios conectados. ps puede ser en una barra statusbar.

Chris 10-06-2011 01:25:20

Creo que ese tipo de información no la puedes obtener con Firebird 2.0. No estoy seguro, pero me parece que así es.

Con la misma inseguridad te digo, que a partir de Firebird 2.1 se introdujeron las tablas MON$*. Éstas albergan entre otras cosas ese tipo de información que necesitas. Tengo entendido que el único problema es que la información contenida en esas tablas solo puede ser consultada por SYSDBA y el propietario de la BD. De la misma forma, tengo entendido que la limitación que te acabo de mencionar ya ha sido quitada en la versión 2.5 de Firebird.

Espero que corrobores la información que te he dado, o que los demás compañeros me corrijan sino es así.

Saludos,
Chris

ecfisa 10-06-2011 01:55:47

Hola.

Otra opción es valerte de la propiedad UserNames de TIBDatabaseInfo.

Código Delphi [-]
  IBDatabase.Connected:= True;
  ListBox1.Items:= IBDatabaseInfo.UserNames;

Saludos.

Casimiro Notevi 10-06-2011 02:07:23

Creo recordar que también el componente TIBDataBaseInfo tiene una propiedad que lista los usuarios conectados, creo que era UserNames, devuelve un StringList con la lista.

Edito: ya se me adelantó ecfisa :)

Casimiro Notevi 10-06-2011 02:13:19

Añado otra forma:

Código SQL [-]
SELECT DISTINCT RDB$USER
  FROM RDB$USER_PRIVILEGES;

Creo que sólo con FB2.1 en adelante.

Chris 10-06-2011 02:24:13

Cita:

Empezado por Casimiro Notevi (Mensaje 403232)
Añado otra forma:

Código SQL [-]
SELECT DISTINCT RDB$USER
  FROM RDB$USER_PRIVILEGES;

Creo que sólo con FB2.1 en adelante.

Creo que RDB$USER_PRIVILEGES contiene información de los privilegios de los usuarios, no los que en este momento están conectados.

Saludos,
Chris

ecfisa 10-06-2011 03:06:44

Hola.

Creo que la consulta SQL completa sería:
Código Delphi [-]
SELECT MON$USER, MON$REMOTE_ADDRESS, MON$REMOTE_PID, MON$TIMESTAMP FROM MON$ATTACHMENTS

Saludos.

Caral 10-06-2011 03:12:31

Hola
Yo lo que hago es muy simple.
Tengo usuarios que entran al programa por medio de un login.
Una vez que esta autorizado cambio un campo activo por SI.
Una vez que el usuario sale del programa el campo activo vuelve a cambiar a NO.
Simple, en una pantalla puedo ver los usuarios que estan usando el programa en tiempo real, incluso si quisiera podria poner hora y dia de entrada y salida.
Saludos

casacham 10-06-2011 03:38:35

Que pasa si se corta la energia
 
Hola Caral

Yo utilizo un sistema similar para loguear a los usuarios de la base de datos, y esta pregunta que da inicio al hilo me ha surgido un monton de veces. No me anime a hacer lo que propones porque se me ocurrio que si hubo un corte de luz o algo por el estio (resetean la maquina), queda registrado como logueado cuando puede no estarlo.

Se me ocurre que se pueden utilizar los componentes INDY cliente y servidor UDP o TCP, similar a un programa de chat, para lograr una interconeccion entre los ejecutables y se den aviso entre ellos de quien esta logueado. Estoy tratando de aprender mas sobre como utilizar esos componentes. Me gustaria saber si alguien ha logrado plasmar esa idea y que opinas tu (CARAL) al respecto.

oesqueda 10-06-2011 04:23:13

El metodo de caral es mejor, solo agrega la fecha y hora.

Si la fecha de ingreso es menor a la del dia es que se desconecto de mala manera.
Si la hora de ingreso es menor a 4 horas por ejemplo pues lo mismo, es cuestion de poner restricciones.

La opcion de indy la maneja el software de Contpaq i aqui en Mexico, donde manejan un software en el servidor llamado Administrador de licencias y asi tambien validas cuantos usuarios entran.

Si el servidor de licencias detecgta que cierta IP perdio la conexion simplemente la quita de la lista de conectados y ya.

Por esa razon no me gusta poner esas cosas jejejeje.

Caral 10-06-2011 04:29:42

Hola
Ya sabeis que me complico poco la vida, por eso trato de hacer las cosas mas sencillas.
En el caso del sistema que uso lo he probado apagando los ordenadores (simulando una falla eléctrica), saliendo del programa etc y siempre actualiza la lista por que uso una comprobación con un sencillo timer cada 20 minutos.
Me imagino que habran sistemas mas complejos y mejores, pero en mi caso funciona bien.
Saludos

Neftali [Germán.Estévez] 10-06-2011 12:18:36

Cita:

Empezado por casacham (Mensaje 403241)
Yo utilizo un sistema similar para loguear a los usuarios de la base de datos, y esta pregunta que da inicio al hilo me ha surgido un monton de veces. No me anime a hacer lo que propones porque se me ocurrio que si hubo un corte de luz o algo por el estio (resetean la maquina), queda registrado como logueado cuando puede no estarlo.

Hace tiempo utilizamos un sistema similar. La única modificación para evitar esto, es que cada minuto (configurable) el usuario/cliente hacía un UPDATE a la tabla de ENTRADAS para guardar la hora (hora del servidor). El UPDATE no "perjudica" mucho, pues 1 UPDATE cada minuto es poco (ojo si tenemos 400 clientes conectados que entonces a lo mejor si sobrecarga... :o) y de esta forma puedes detectar las conexiones fantasma.

Las conexiones que llamamos "zombies" o "fantasmas" son aquellas que llevan entre 1 y 5 minutos sin actualizar. Pasados 5 minutos se borran esas entradas. De esta forma cuando una máquina se cuelga, pasado 1 minuto esa entrada se considera zombie, y pasados 3 o 5 se borra. Es una forma de tener "actualizada" esa información de la tabla de ENTRADAS. Los tiempo son configurables dependiendo de las necesidades y de la sobrecarga del sistema. Si son 5 máquinas puedes usar 1 minuto, si son 300 tal vez sea mejor utilizar 10 minutos.

Cita:

Empezado por casacham (Mensaje 403241)
Se me ocurre que se pueden utilizar los componentes INDY cliente y servidor UDP o TCP, similar a un programa de chat, para lograr una interconeccion entre los ejecutables y se den aviso entre ellos de quien esta logueado.

Esta la estamos utilizando ahora, pero la verdad es que cuando hay muchas máquinas (hablamos de 100 conexiones), y sobre todo cuando se conectan a la vez (todo el mundo llega a las 9:00 conecta el ordenador y entra en la aplicación) estamos notando retardos.

Chris 10-06-2011 18:33:46

Cita:

Empezado por ecfisa (Mensaje 403235)
Hola.

Creo que la consulta SQL completa sería:
Código Delphi [-]
SELECT MON$USER, MON$REMOTE_ADDRESS, MON$REMOTE_PID, MON$TIMESTAMP FROM MON$ATTACHMENTS

Saludos.

Esa sería la solución perfecta, pero a cómo dije anteriormente estos datos MON$* solo están disponibles a partir de la versión 2.1 de Firebird y la que está usando el compañero lamentablemente es la 2.0.

Casimiro Notevi 10-06-2011 21:14:08

En un soft que desarrollé hace años usé un sistema prácticamente idéntico al descrito por Neftalí.
Por cierto, no sé de dónde he sacado la sql que puse antes :confused:. Para controlar las conexiones se puede hacer también en un trigger que haga saltar una excepción cuando llegue al máximo permitido, a ver si ahora lo copio bien:

Código SQL [-]
CREATE EXCEPTION bloquear 'Ha superado el máximo de conexiones permitidas';

create trigger ocVerificarConexiones on connect as
BEGIN
   if ((select count(*) from MON$ATTACHMENTS) > 5) then EXCEPTION bloquear;
END

Aunque creo que también está disponible a partir de fb2.1

ingabraham 11-06-2011 01:15:28

compannero, companneros

creo que estamos o estoy yo mal.

les comento,
yo tengo una tabla en firebird llamada usuarios, asi.
Código Delphi [-]


CREATE TABLE USUARIOS (
    US_USUARIO  VARCHAR(100) NOT NULL,
    US_CLAVE    VARCHAR(20),
    US_TIPO     VARCHAR(20)
    US_NOMBRE_COMPLETO    VARCHAR(20)
);


Buen y estos usuarios, cuando entro los busco en esta tabla,

hay aproximadamente 8 usuarios
y deseo tener una lista de los que estan conectados . ojo que se vean desde mi aplicacion que desarrolle en delphi, no desde firebird.

bueno companneros no lo hago como ustedes dicen, directamente desde firebird con los user, sino desde una tabla.

no se si pueda saber los usuarios teniendolos en una tabla.

Casimiro Notevi 11-06-2011 01:31:30

Si no estoy confundido, ya te lo han explicado antes, un poquito más arriba.

oesqueda 11-06-2011 02:34:05

no creo mi casimiro.
El usa sysdba como usuario para firebird, por lo que la solucion a la tabla del sistema de FB no entra en su esquema.

Y la solucion esta en la respuesta de Caral, por ahi.

Mi estimado une las respuestas y obtienes lo que necesitas, creeme que estan buenisimas las que han dado, felicitaciones a todos.

casacham 12-06-2011 03:02:00

Coincido con oesqueda, nuestro amigo no ha creado un usuario para cada cual, sino que registra a las personas en una tabla propia y se maneja con ella. El hilo esta buenisimo, ya que me ha aportado un monton de ideas. Desde ya que siempre trato de programar como si fuesen miles los que se conectan debido al principio de utilizacion de los recursos. Desde el momento que uno destruye los objetos que no utiliza mas para liberar memoria, hasta cuidad de sobrecargar la red, lo cual los objetos INDY no seria adecuados por la experiencia comentada por Neftali. Asi que creo que la mejor opcion es la de chequear cada cinco minutos quien esta o no subido a la red.

ingabraham 15-06-2011 17:41:28

Cita:

Empezado por Caral (Mensaje 403237)
Hola
Yo lo que hago es muy simple.
Tengo usuarios que entran al programa por medio de un login.
Una vez que esta autorizado cambio un campo activo por SI.
Una vez que el usuario sale del programa el campo activo vuelve a cambiar a NO.
Simple, en una pantalla puedo ver los usuarios que estan usando el programa en tiempo real, incluso si quisiera podria poner hora y dia de entrada y salida.
Saludos

no me actualiza la lista

1. al iniciar usuario
Código Delphi [-]
   DMDatos.CambiarUsuario(CBUsuarios.Text,'Conectado');

Procedure TDMDatos.CambiarUsuario(PUsuario,PEstado:String);
Begin
   With ConsultaFlash do
   Begin
    close;
    SQL.Clear;
    SQL.Add('Update Usuarios Set US_ESTADO=''' +PEstado+'''  where US_USUARIO =''' +PUsuario+''' ');
    ExecQuery;
  end;
     DMDatos.IBTransaction.CommitRetaining;
End;
2. al salir
Código Delphi [-]
  DMDatos.CambiarUsuario(CBUsuarios.Text,'DesConectado');
3. el timer q me muestra los usuarios
Código Delphi [-]

 if Temporizador.Interval  = 5000  then
 begin

  TreeView1.Items.Clear;
   With DMDatos.IBConsultaSql do
    Begin
      Sql.Clear;
      Sql.Add('Select * From USUARIOS ');
      Open;
      DMDatos.IBConsultaSql.First;
       While Not DMDatos.IBConsultaSql.Eof Do
       Begin
          if  'Conectado' = DMDatos.IBConsultaSql.fieldbyname('US_ESTADO').AsString THEN
            TreeView1.Items.AddChild(nil, DMDatos.IBConsultaSql.fieldbyname('US_USUARIO').AsString  );

           DMDatos.IBConsultaSql.Next;
       End;
   End;
 end;
pero al momento de otro pc q esta en la red entra no me actualiza la lista. parece que no reconociera los cambios de la bdatos, lo la refrescara no se si algun trigger o procedure me pueda solucionar esto.

oesqueda 15-06-2011 18:40:46

Revisa tu transaccion como esta configurada, te paso un codigo que acelera tu codigo:

Código Delphi [-]
 if Temporizador.Interval  = 5000  then  begin    TreeView1.Items.Clear;    With DMDatos.IBConsultaSql do     Begin       Sql.Clear;       Sql.Add('Select * From USUARIOS where US_ESTADO = ''Conectado''';       Open;       DMDatos.IBConsultaSql.First;        While Not DMDatos.IBConsultaSql.Eof Do        Begin             TreeView1.Items.AddChild(nil, DMDatos.IBConsultaSql.fieldbyname('US_USUARIO').AsString  );             DMDatos.IBConsultaSql.Next;        End;    End;  end;
Ademas te recomiendo cambiar el us_esado a numerico y ponerle un indice, seria mucho mas rapido.

Saludos


La franja horaria es GMT +2. Ahora son las 12:14:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi