Estoy desarrollando un sistema donde tengo que disparar procesos dependiendo de registros agregados a una tabla desde procesos diferentes, es decir, un proceso agrega los registros y otro se encarga de disparar los procesos.
Pues bien, la historia comenzó cuando utilizaba Paradox.
Mi primer idea de hacer esto (hace unos 10 años) fué la de leer periódicamente la tabla y al encontrar nuevos registros ejecutaba los procesos correspondientes.
Posteriormente utilicé sockets para enviar la orden de un programa a otro incluso utilizando ya Firebird.
Cualquiera de estas formas me funcionó en su momento, sin embargo, seguía inconforme con la forma de hacerlo. Hace unos días y aunque parezca de risa, me levanté a media noche con una idea, si Firebird puede generar eventos y Delphi a través de su componente IBEvents los puede capturar, tendría que haber una forma de hacer lo que quiero.
Pues bien, después de unos días encontré la forma de hacerlo y quiero compartir con ustedes mi idea, por supuesto y como siempre lo he dicho, habrá mejores alternativas y me gustaría que esto que he desarrollado fuese mejorado con optimización de código u otras alternativas.
Lo primero que hice fué generar el Evento en Firebird.
/*****************************************************************/ /* Following SET SQL DIALECT is just for the Database Comparer */ /*****************************************************************/ SET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER "POST_EVENT" FOR EVENTOS ACTIVE AFTER INSERT POSITION 0 AS BEGIN IF (NEW.event = 1) THEN POST_EVENT 'NEW_EMAIL'; IF (NEW.event = 2) THEN POST_EVENT 'NEW_MESSAGE'; IF (NEW.event = 3) THEN POST_EVENT 'NEW_GREETING'; IF (NEW.event = 4) THEN POST_EVENT 'NEW_PHONE_NOTIFY''; end ^ SET TERM ; ^
new.event es un campo de la base de datos el cual contiene un ID para determinar el evento que se va a generar.
Bueno pues la tarea siguiente era codificar la captura de estos eventos en Delphi, para ello utilicé el componente IBEvents de la paleta IBX.
Primero se declaran los eventos.
procedure TfrmPMSNec.FormCreate(Sender: TObject); begin IBDatabase1.Connected := true; IBEvents1.Events.Add('NEW_EMAIL'); IBEvents1.Events.Add('NEW_MESSAGE'); IBEvents1.Events.Add('NEW_GREETING'); IBEvents1.Events.Add('NEW_PHONE_NOTIFY'); IBEvents1.RegisterEvents; end;
Y en el evento EventAlert del componente IBEvents disparo los procesos correspondientes a cada una de las acciones.
procedure TfrmPMSNec.IBEvents1EventAlert(Sender: TObject; EventName: string; EventCount: Integer; var CancelAlerts: Boolean); begin if EventName = 'NEW_EMAIL' then begin // Disparo proceso de nuevo correo end; if EventName = 'NEW_MESSAGE' then begin // Disparo proceso de nuevo Mensaje end; if EventName = 'NEW_GREETING' then begin // Disparo proceso de nuevo Saludo end; if EventName = 'NEW_PHONE_NOTIFY' then begin // Disparo proceso de nueva notificación a teléfono end; end;
Con esto, ya no me preocupo por buscar periódicamente en la tabla por nuevos eventos ni de estar enviando a través de sockets la órden para ejecutar los procesos.
Espero que sea de ayuda y si hay algún comentario para mejorar y optimizar esta idea será bienvenida.
Salud OS