Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-02-2004
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Exclamation Trigger de Actualización

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.
Responder Con Cita
  #2  
Antiguo 10-02-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Hola Subzero!

Mira el siguiente hilo para informarte un poco : 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.


Código:
  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!
Responder Con Cita
  #3  
Antiguo 11-02-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por subzero
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 11-02-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Cita:
Empezado por jachguate
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.
Responder Con Cita
  #5  
Antiguo 12-02-2004
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 12-02-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
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!
Responder Con Cita
  #7  
Antiguo 12-02-2004
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Gracias primero que todo, osea que puedo poner en la propiedad "defaultaction=TACommit" y ya
Responder Con Cita
  #8  
Antiguo 12-02-2004
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Hola, subzero....

No soy buen profesor pero tratare de explicarme...

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....

Cuentame como te fue, estamos para ayudarnos..

Your Friend

StartKill
Lima-Perú
Responder Con Cita
  #9  
Antiguo 12-02-2004
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
Wink

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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:23:45.


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
Copyright 1996-2007 Club Delphi