Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Notificación de Cambios (https://www.clubdelphi.com/foros/showthread.php?t=61565)

marcial 12-11-2008 19:20:44

Notificación de Cambios
 
Hola a todos:
Trabajo con D5, FibPlus y Firebird 2
He diseñado un pequeño programa para familiarizarme con firebird y lo que quiero conseguir es lo siguiente:

Ejemplo:
El PC1 edita para cambiar el registro 4 del fichero de Articulos.
Mientras lo cambia y no lo cambia, el PC 2 edita tambien el registro 4 del mismo fichero de Articulos y le da a grabar antes que el PC1.
Evidentemente el PC1 no se entera de los cambios que ha hecho el PC2 y cree que los suyos son los correctos.

Tengo definido un EventAlerter (del FibPlus) que salta y comunica al PC1 y al PC2 que ha habido cambios, pero lo que yo quiero es que si el PC1 hace el cambio, que no se lo autocomunique, que solo lo comunique al PC2 y a todos los de la red menos a él mismo.

He hablado con otros usuarios de otros motores y me dicen "eso lo hace sola la base de datos".... pero será porque por defecto hay parametros establecidos que lo establecen (digo yo).

Podríais echarme una mano con esto de las comunicaciones a los PC's de la red???

Muchas gracias a todos por intentar ayudarme.

Marcial

Lepe 12-11-2008 19:50:40

El tema es que si se produce un cambio, no se puede saber si lo ha originado la propia base de datos (un trigger por ejemplo) o ha sido el programa que tú has diseñado. De hecho, puedes ejecutar un sql que produzca 10 EventAlert, pero no se mandan todos a los clientes, se envía un solo evento con un parámetro que indica la cantidad de veces que se ha producido.


Puedes hacer un invento, pero se te va a complicar un poco. Por ejemplo, usas una tabla donde guardas el usuario que ha realizado la modificación; cuando recibas el evento en tu aplicación, consultas esa tabla y si el usuario es el mismo que ha realizado el guardado, no presentas el mensaje de advertencia.

Ignoro si hay una solución mejor.

Kipow 12-11-2008 20:27:42

Al momento de regresar disparar el evento en la base puedes hacerlo incluyendo el nombre del usuario que esta generando el mismo algo asi;

Código SQL [-]

POST_EVENT 'MODIFICANDO_TABLAX'||USER;

luego en tu aplicacion solo debes de revisar eso pues si el evento es el indicado y no dispararlo si el usuario es diferente al logueado actualmente.

espero haberme dado a entender.

marcial 12-11-2008 21:13:44

Gracias a los dos por responder.
Lepe, estaba siguiendo tu consejo de fabricarme una tabla y he visto la respuesta de Kipov.
Kipov, como haces para preguntar por el usuario??.
He cambiado el POST_EVENT como me has dicho y en Delphi
en el OnEventAlert pongo

Código Delphi [-]
        if EventName='CAMBIO_ARTICULO' then
                begin
               showmessage('Registro modificado por el usuario: ' + #13#13              + User);

pero no funciona.
¿Podrías ampliarme un poco más esto?

Gracias de antemano a todos por responder
Marcial

Lepe 12-11-2008 21:24:19

Eso precisamente era lo que yo quería evitar. Tener en el mensaje el nombre del usuario.

Según hice una prueba (fb 1.5 creo recordar) no me permitía usar post_event con esa sintaxis. quizás usando execute statement pudiera ser, no lo sé.

Código SQL [-]
msg = ' post_event MODIFICANDO_TABLAX' || USER;
execute statement msg;

Además tenemos el inconveniente que al registrar el mensaje en los TEvenAlert, ya debemos tener en cuenta el usuario y que no varíe en ninguna letra. marcial el mensaje que debes registrar es:
Código Delphi [-]
if event_name = 'MODIFICANDO_ARTICULONOMBREUSUARIO' then

y ya digo, no sé si funcionará. Lo de la tabla auxiliar, siempre debería funcionar.

SAludos

Kipow 13-11-2008 02:32:07

Cita:

Empezado por marcial (Mensaje 325615)
Gracias a los dos por responder.
Lepe, estaba siguiendo tu consejo de fabricarme una tabla y he visto la respuesta de Kipov.
Kipov, como haces para preguntar por el usuario??.
He cambiado el POST_EVENT como me has dicho y en Delphi
en el OnEventAlert pongo

Código Delphi [-] if EventName='CAMBIO_ARTICULO' then begin showmessage('Registro modificado por el usuario: ' + #13#13 + User);


pero no funciona.
¿Podrías ampliarme un poco más esto?

Gracias de antemano a todos por responder
Marcial

No se quien sera ese tipo pero te respondo :),

es precisamente como dice Lepe, debes de registrar en los eventos "NOMBRE_TABLAXNOMBRE_USUARIO', (simplemente recorrer todos los usuarios de la bd no uso los fb pero me imagino que algo han de traer para poder hacerlo). luego solo quitas de la cadena del eventname NOMBRE_TABLAX y listo tienes el nombre del usuario.

marcial 13-11-2008 15:01:47

Gracias a todos los que respondeis y a los que lo intentais y no lo haceis.
El problema lo estoy solucionando como dijo Lepe, con una tabla auxiliar, ya que por desgracia mi nivel de firebird no me permite soltura suficiente como para lo que me decis del evento Nombre_de_Tabla_User y luego quitar el User del nombre.... Pero todo se andará (con vuestra ayuda).

Marcial

rastafarey 18-11-2008 20:54:58

Resp
 
Usando el usuario es una buena idea mas no funciona siempre. Por que solo se podria conectar un usuario a ala ves.

usar una tabla auxiliar es hacer mas consulta hacia la bd lo cual no seria optimo.

usando esto:
Código SQL [-]
POST_EVENT 'MODIFICANDO_TABLAX'||':'||current_connection
Es perfecto ya que nunca existiran dos conexiones con los mismos identificadores.

De esta manera verificas el evento que llego y tienes el id de la conexion. Si es persistente de no ser una coneiox persistente debes guardar el id antes de realizar cambio.

Tambien te recomiendo que hagas eventos separados para insercion, modificacion y borrado ya que los eventos de modificacion y insercion no deberian notificar nada, mas si los de borrado.

rastafarey 18-11-2008 20:58:02

Resp
 
Si puedes encontar los componenestes de ibobjects estos traen un componente que realiza lo que quieres y los dataset ya estan dotados de estas propedades. asi te puedes guiar de como hacerlo.

sigue al pie de la letra las reglas de progracion.
1. Si funciona ni lo toques
2. Lo que esta echo no se vuelve hacer. Solo usalo


La franja horaria es GMT +2. Ahora son las 04:51:42.

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