PDA

Ver la Versión Completa : Trigger de Actualización


subzero
10-02-2004, 15:34:53
Hola amigos.


Estoy trabajando con Interbase 6.0, y la interfase en delphi, quisiera que siempre que una tabla se actualizara desde mi aplicación se reflejara en todos los equipos que se encuentran conectados a la base de datos.

He utilizado el comoponente Transactions poniendo su propiedad a Commit. Pero no me ha dado resultado.

Y escuche ha alguien que estos procesos pueden hacerse des de la base de datos mediante triggers, ¿es cierto? ¿Cómo lo puedo hacer?.


Gracias, por interezarse en mi inquietud.

Nuria
10-02-2004, 16:41:15
Hola Subzero!

Mira el siguiente hilo para informarte un poco : Triggers (http://www.clubdelphi.com/foros/showthread.php?t=3510&highlight=triggers) .

Yo también utilizo Interbase 6.0 y los utilizo sin problemas, te ayudan a agilizar tú aplicación, ya que los triggers se ejecutan en el servidor por tanto ganas en rápidez y no se satura la red. Además de que te ahorras un buen puñado de líneas de código.

Depende del programa que utilices para crearte y gestionarte la base de datos, yo utilizo el IBConsole de Interbase, y es allí donde me creo los triggers.

Un ejemplo: el borrado de las líneas de un cabecera-líneas, cuando borras el registro de cabecera.




CREATE TRIGGER BORRALINEAS FOR TABLACABECERA
ACTIVE BEFORE DELETE POSITION 0 AS
BEGIN
DELETE FROM TABLALINEAS WHERE COD=old.COD;
END


No hace falta que coloques ninguna línea de código en delphi, antes de borrar la cabecera, borra todas las líneas asociadas. Esto lo gestiona la base de datos.

Espero haberme explicado bien. Cualquier duda....

Saludos!

jachguate
11-02-2004, 09:27:49
quisiera que siempre que una tabla se actualizara desde mi aplicación se reflejara en todos los equipos que se encuentran conectados a la base de datos.


El tener que hacer commit o no depende del nivel de aislamiento de transacciones. Si queres que otros equipos vean tus cambios, tenes que poner el nivel de aislamiento a ReadCommited o DirtyRead.

Para "Notificar" a los otros clientes de los cambios de la base de datos, podes valerte del mecanismo de eventos de interbase, y del componente TibEventAlerter (o algun equivalente) en las aplicaciones (simplemente para hacer un refresh de los datasets, y del procedimiento post_message de la base de datos. Evidentemente este procedimiento deberá ser invocado desde un trigger (after update, after insert, after delete) o desde un stored procedure.

Hasta luego.

;)

kinobi
11-02-2004, 09:59:42
Si queres que otros equipos vean tus cambios, tenes que poner el nivel de aislamiento a ReadCommited o DirtyRead.

Correcto Juan Antonio. Simplemente comentar que en el caso de InterBase, el nivel de aislamiento mínimo que soporta el motor es ReadCommited (es decir, los cambios sólo se verán si están confirmados). DirtyRead no tiene efecto, se tomaría ReadCommited en su lugar.

Saludos.

subzero
12-02-2004, 17:31:42
Gracias a todos por interezarse en mi pregunta, no siendo un poco inconforme o desagradecido, puden explicarme un poco mas detallada donde puedo hacer ese Commit, desde Delphi e Interbase.

Nota
====

Soy nuevo y algunos términos no los manejo muy bien

Nuria
12-02-2004, 18:10:55
Mírate, es el que yo uso, el componente TIBTransaccion de la paleta Interbase de Delphi. Con él es con el que yo hago los ReadCommited.

Saludos!

subzero
12-02-2004, 18:31:25
Gracias primero que todo, :confused: osea que puedo poner en la propiedad "defaultaction=TACommit" y ya

StartKill
12-02-2004, 18:54:08
Hola, subzero.... :cool:

No soy buen profesor pero tratare de explicarme... :cool:

Lo trigger se desencadenan 'ejecutan' en el servidor cuando haces un cambio en las tablas de tu base de datos como es añadir, modificar, eliminar.

La idea es que el servidor envie un mensaje a los clientes cuando suceda dicho cambio, hay dos oportunidades que son: "un antes de" y "un despues de" (before/after), la idea es utilizar un despues de la actividad.

CREATE TRIGGER DPTO_AI FOR DPTO ACTIVE
AFTER DELETE POSITION 0
AS
BEGIN
POST_EVENT 'DEL_DPTO';
END

Estas lineas envian un mensaje a los clientes indicando que hay han borrado un registro en la tabla "dpto", la frase 'DEL_DPTO' es arbitraria dale el nombre que te guste(que sena descriptivos), en los clientes debe haber un componente "IBEvents" y tenes la oportunidad de saber que paso en el servidor de acuerdo al mensaje que enviaste.

En tu programa debes registrar los eventos que vas ha capturar, lo puedes hacer en el momento de mostrar tu formulario.

procedure TFrmRefe.FormShow(Sender: TObject);
begin
IBEvents1.Events.Add('DEL_DPTO');
IBEvents1.Events.Add('UPD_DPTO');
IBEvents1.Events.Add('INS_DPTO');
IBEvents1.RegisterEvents;
end;

No olvides que cuando termines desactivar los eventos

procedure TFrmRefe.FormDeactivate(Sender: TObject);
begin
IBEvents1.UnRegisterEvents;
end;

Bueno, parece que vamos bien... pero no queda alli, hay que atrapar las "señales" del servidor, como?,

Facil... en tu componente IBEvents hay un evento "OnEventAlert", alli hay un parametro "EventName" donde tendras el nombre arbitrario que pusiste (POST_EVENT 'DEL_DPTO'),

Alli elijes la accion a realizar, refrescas, avisas un cambio... lo que gustes, personalmente en mi formulario de tablas referenciales tengo un boton que dice refrescar y cuando sucede un evento este boton cambia de color del caption a ROJO y el usuario sabe que hay un cambio y necesita refrescar.;


procedure TFrmRefe.IBEvents1EventAlert(Sender: TObject;
EventName: String; EventCount: Integer; var CancelAlerts: Boolean);
begin
BitBtn1.Font.Color:=clRed;
end;

Ah, me olvidaba este evento tambien se ejecutara cuando hagas el cambio en el mismo cliente... osea: En un cliente haces un cambio y es normal que los demas clientes sepan lo que ha pasado "pintando el boton rojo" pero el cliente que hizo la modificacion tambien se pinta el boton, entonces debes controlar esa chispita, como?, tarea para Ud.

Bueno, espero haber sido de ayuda.... :D

Cuentame como te fue, estamos para ayudarnos..

Your Friend

StartKill :cool:
Lima-Perú

subzero
12-02-2004, 21:22:28
Gracias, ya creo tener la idea un poco más clara, StartKill muchas gracias por tan detallada explicación, y a los otros gracias por haberse interezado en ayudarme.


Gracias