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)
-   -   ¿Cómo conocer algún dato de la tupla que ha producido el evento? (https://www.clubdelphi.com/foros/showthread.php?t=41603)

membrillo 20-03-2007 19:47:28

¿Cómo conocer algún dato de la tupla que ha producido el evento?
 
Hola amigos,

Estoy haciendo un servicio de alarmas con firebird, delphi y php, para lo cual estoy haciendo uso de los eventos que puedo generar con firebird. El caso es que ya sé capturar un evento, pero no sé cómo saber qué tupla produjo ese evento. Me explico: Tengo una tabla de alarmas en las que la aplicación php introduce datos de algún tipo de alarma. Con delphi ya logro saber cuándo se produce una alarma, pero no sé qué tupla la produjo. Lo que quiero saber por ejemplo es si introduzco una tupla en la base de datos que contenga (nombreAlarma, tipoAlarma, Descripción, identificador), cuando capturo con delphi el evento que se produce al introducir esta tupla, cómo puedo conocer los datos nombreAlarma, tipoAlarma, Descripción, identificador????

No sé si está claro. Si no lo teneis claro de lo que quiero, me lo comentais y lo intento explicar mejor.

Gracias por todo y saludos.

membrillo 20-03-2007 22:54:57

Código Delphi [-]


procedure TDataModule1.IBEvents1EventAlert(Sender: TObject; EventName: string;
EventCount: Integer; var CancelAlerts: Boolean);
begin
if EventName='NEW_ALARM' then
*****************


end;



donde pongo ***********, ¿como sé cuáles son los datos que se han insertado para producir ese evento?

Creo que así está más claro

RONPABLO 21-03-2007 00:26:06

Me imagino que te enteras que se cambio algo desde php al poner un evento dentro de un trigger... pon varios eventos:

Código SQL [-]
SET TERM ^^ ;
CREATE TRIGGER TR_ESTACUENTA FOR T_ADICIONALES_ABONOS ACTIVE AFTER UPDATE POSITION 0 AS
begin
  /* code */
  if (new.Campo1 <> old.campo1)
     POST_EVENT 'Evento1';
  if (new.Campo2 <> old.campo2)
     POST_EVENT 'Evento2';
  if (new.Campo3 <> old.campo3)
     POST_EVENT 'Evento1';
end
^^
SET TERM ; ^^

membrillo 21-03-2007 00:35:08

Ya, pero no es a eso a lo que me refiero. Por ejemplo, Tengo un trigger AFTER INSERT que lo que hace es un post_event "NEW_ALARM". Si yo por ejemplo inserto una alarma con los siguientes datos (idAlarma, nombreAlarma, EquipoDeAlarma, MotivoDeAlarma) que son realmente (3, 'Alarma por Temperatura, 'Frigorífico 2', 'La temperatura ha bajado de 3 grados') , con el delphi yo puedo saber que se ha introducido una tupla, pero ¿cómo sé yo que la tupla que ha producido el evento es (3, 'Alarma por Temperatura, 'Frigorífico 2', 'La temperatura ha bajado de 3 grados')?

Gracias y saludos.

RONPABLO 21-03-2007 01:57:23

Código SQL [-]
select first 1 * from laTabla order by idAlarma Desc

membrillo 21-03-2007 11:28:41

Gracias RONPABLO. Eso lo había pensado, pero si se introducen 2 tuplas casi al mismo tiempo, ¿no habrá problemas de concurrencia?

membrillo 21-03-2007 12:12:46

Además, uno de los campos de la alarma es si está activa, de forma que cuando la alarma no está activa (un update) también tengo que saber qué alarma ya no está activa, y eso creo que no lo puedo saber con un select.
¿No hay alguna forma de pasar parámetros al POST_EVENT?

pvizcay 21-03-2007 16:09:42

los eventos de firebird no pueden tener parametros, por lo menos hasta 1.5.x que es lo que yo conozco, pero dudo que que se pueda porque si uno hace el post dos veces del mismo evento y después hace un commit, ahí recien llegan los eventos a los clientes pero llega una sola vez por cada evento, si tuvieran parámetros, ¿cúal llegaría?

llendo a lo práctico, creo que te las vas a tener que rebuscar con una tabla auxiliar y mezclado con un mecanismo de auditoria, cada vez que hay una modificación puedes postearlo en una tabla con el ID de transacción que la realizo, en que tabla, que tipo de operación fue y que clave primaria afecto. el cliente que se hace cargo de eso lo puede borrar

a ver si alguien tiene una idea mejor
suerte

Lepe 25-05-2007 16:33:54

Sigo en la misma línea, de hecho:
Código Delphi [-]
procedure TDataModule1.IBEvents1EventAlert(Sender: TObject; EventName: string;
EventCount: Integer; var CancelAlerts: Boolean);
begin
se ve que puede haber ocurrido una acumulación del mismo evento, por tanto es imposible saberlo.

La idea del compañero pvizcay me parece más que acertada.

Saludos


La franja horaria es GMT +2. Ahora son las 10:03:27.

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