Muchas veces no nos interesa registrar los cambios a todas las columnas de una tabla sino solamente los cambios a una columna determinada, un ejemplo muy frecuente se relaciona con los precios de venta.

En estos artículos hemos visto como se pueden registrar todas las operaciones que se realizan a una tabla:

https://firebird21.wordpress.com/2013/05/24/registrando-los-cambios-realizados-a-los-datos-de-una-tabla/

https://firebird21.wordpress.com/2013/05/24/otro-ejemplo-de-trigger-de-actualizacion/

Ahora, veremos como registrar solamente los cambios a los precios de venta de los productos. Para ello creamos una tabla llamada PRECIOS_VENTA que tiene esta estructura:

PRECIOSVENTA1

(haciendo clic en la imagen la verás más grande)

Y a la tabla PRODUCTOS le agregamos este trigger:

SET TERM ^ ;

CREATE TRIGGER PRODUCTOS_BIU FOR PRODUCTOS
   ACTIVE BEFORE INSERT OR UPDATE
   POSITION 1
AS
BEGIN

   IF (INSERTING) THEN     -- Si se está insertando un nuevo producto
      INSERT INTO PRECIOS_VENTA
          VALUES (NEW.PRD_CODSUC, 0, CURRENT_TIMESTAMP, NEW.PRD_IDENTI, NEW.PRD_PREVTA);

   IF (UPDATING AND NEW.PRD_PREVTA <> OLD.PRD_PREVTA) THEN     -- Si se está actualizando y cambió el precio de venta
      INSERT INTO PRECIOS_VENTA
          VALUES (NEW.PRD_CODSUC, 0, CURRENT_TIMESTAMP, NEW.PRD_IDENTI, NEW.PRD_PREVTA);

END^

SET TERM ; ^

Como puedes ver, cada vez que se inserta un nuevo producto a la tabla de PRODUCTOS se inserta también una fila a la tabla de PRECIOS_VENTA, para registrar en ella cual es el precio de venta de ese producto.

Además, cada vez que se actualiza una fila de la tabla PRODUCTOS y el precio de venta nuevo es distinto al precio de venta anterior también se inserta una fila a la tabla de PRECIOS_VENTA. Fíjate que solamente se realiza la inserción si el precio de venta cambió, si el precio de venta es el mismo entonces no se realiza la inserción, ya que no se tiene necesidad de hacerla. NEW.PRD_PREVTA es el precio de venta que se quiere grabar y OLD.PRD_PREVTA es el precio de venta que actualmente está guardado en la columna. Las seudovariables NEW y OLD son muy útiles porque nos permiten comparar si lo que ya tenemos guardado en una columna es igual o es distinto al valor que ahora queremos guardar en esa misma columna.

Ejemplo:

Para verificar el funcionamiento del trigger se agregó una fila a la tabla de PRODUCTOS y luego se modificó 2 veces su precio de venta. Este es el resultado obtenido:

PRECIOSVENTA2

(haciendo clic en la imagen la verás más grande)

 Como puedes ver, funcionó perfectamente. En la tabla PRECIOS_VENTA ahora tenemos guardados el precio de venta original y también cada uno de los cambios a ese precio de venta.

Conclusión:

A veces no necesitamos guardar los cambios a todas las columnas de una tabla sino solamente los cambios a algunas columnas específicas, un ejemplo típico es el de los precios de venta.

Anuncios