Ver Mensaje Individual
  #14  
Antiguo 24-02-2011
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Reputación: 20
Gallosuarez Va por buen camino
Talking Posible solución ..

JCapitan:

Yo lo haría de la siguiente forma:
1.Crear una tabla de cambios (bitácora de cambios). Crear una secuencia para esta tabla (SEC_BITACORA_CAMBIO). Crear un Trigguer (Aferter Insert/Update).
Código SQL [-]
CREATE TABLE BITACORA_CAMBIOS (
    ID            INTEGER NOT NULL,
    TIPO          CHAR(1) COLLATE ES_ES_CI_AI,
    TABLA_NOMBRE  VARCHAR(31) COLLATE ES_ES_CI_AI,
    ID_REGISTRO   INTEGER,
    DIA_HORA      TIMESTAMP,
    USUARIO       VARCHAR(31) COLLATE ES_ES_CI_AI
);

COMMIT;

ALTER TABLE BITACORA_CAMBIOS ADD CONSTRAINT PK_BITACORA_CAMBIOS PRIMARY KEY (ID);

CREATE INDEX BITACORA_CAMBIOS_IDX1 ON BITACORA_CAMBIOS (DIA_HORA);

COMMIT;
SET TERM ^ ;

CREATE OR ALTER TRIGGER BITACORA_CAMBIOS_AIU0 FOR BITACORA_CAMBIOS
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
BEGIN
  POST_EVENT 'Cambio';
END
^

SET TERM ; ^

COMMIT;

CREATE SEQUENCE SEC_BITACORA_CAMBIOS;
ALTER SEQUENCE SEC_BITACORA_CAMBIOS RESTART WITH 0;

COMMIT;

2. Crear Procedimiento Almacenado para registrar los cambios
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REGISTRA_CAMBIO(
    TIPO CHAR(1),
    TABLA_NOMBRE VARCHAR(31),
    ID_REGISTRO INTEGER)
AS
BEGIN
  INSERT INTO BITACORA_CAMBIOS
    (ID, TIPO, TABLA_NOMBRE, ID_REGISTRO, DIA_HORA, USUARIO)
  VALUES
    (GEN_ID(SEC_BITACORA_CAMBIOS, 1), :TIPO, :TABLA_NOMBRE, :ID_REGISTRO, CURRENT_TIMESTAMP, CURRENT_USER);
END^

SET TERM ; ^
3. Crear Triggers (After Insert/Update) para TODAS las tablas donde deseas saber si hubo cambios (pongo esto porque no se los detalles de esas tablas)
Código SQL [-]
IF (INSERTING) THEN
  EXECUTE PROCEDURE REGISTRA_CAMBIO 'I', 'Pon aqui el nombre de la tabla', NEW.ID <-(Pones aquí el ID de tu tabla);

IF (UPDATING AND (
  NEW.NOMBRE IS DISTINCT FROM OLD.NOMBRE OR
  NEW.APELLIDO IS DISTINCT FROM OLD.APELLIDO OR
  ETC, ETC, (Debes poner los campos donde quieras saber si hubo un cambio)
)) THEN
  EXECUTE PROCEDURE REGISTRA_CAMBIO 'C', 'Pon aqui el nombre de la tabla', NEW.ID <-(Pones aquí el ID de tu tabla);
3.Con esto tienes para saber exactamente en que tabla, y cual fue el registro que cambió después de una inserción o algún cambio.
Ahora, desde tu aplicación tienes que ejecutar una SQL para traer solo los últimos campos que se han insertado o sufrido un cambio. Al leer el campo de TIPO de la tabla BITACORA_CAMBIOS, si contiene un valor 'I', entonces fue una inserción, si tiene un valor de 'C', entonces fue un cambio.
Hay un parametro (no recuerdo cual es), de tus FIBPlus que te dice cuantas veces se ha disparado el POST_EVENT y este te sirve para saber cuantos campos tienes que leer o refrescar ¿Me explico?

Atte:
Gerardo Suárez Trejo

PD. Espero que te algo te sirva esto. Solo resta hacer una pequeñas adecuaciones para refrescar leer o refrescar el campo que se inserto. Si tienes dudas en esto dime y te lo explico un poco detallado (ya no quiero hacer mas largo este "post").

Última edición por Gallosuarez fecha: 24-02-2011 a las 18:13:33.
Responder Con Cita