--- On Thu, 10/28/10, Carlos Joaniquet <[email protected]> wrote:

From: Carlos Joaniquet <[email protected]>
Subject: Re: [pgsql-es-ayuda] problema con trigger
To: "Virginia" <[email protected]>
Cc: "Jaime Casanova" <[email protected]>, "Ayuda" 
<[email protected]>
Date: Thursday, October 28, 2010, 7:23 AM

Por qué razón no se deben utilizar los campos calculados? Es que en alguna de 
mis tablas existen varios :) que me recalculan gastos, base imponible, iva, etc 
de un registro factura cada vez que introduzco un apunte contable que hace 
referencia a esa factura. ¿Es un mal diseño?
Gracias
Carlos Joaniquet Tamburini
El 26/10/2010, a las 14:52, Virginia <[email protected]> escribió:



El 25 de octubre de 2010 23:09, Jaime Casanova <[email protected]> escribió:

2010/10/25 Virginia <[email protected]>:

> Buenas noches, cómo están? quisiera saber si pueden ayudarme con una duda.

> Tengo una tabla con los campos id, campo1, campo2, campo3, total y un

> trigger q lo que debería hacer es que cada vez q inserto un registro en esa

> tabla me sume el campo1 + campo2 + campo3 y actualice ese resultado en el

> campo total.

> Ahora bien, hice el trigger q se dispara desde la misma tabla me crea un

> lazo infinito, cóm puedo resolver esto? o no debo hacer un n trigger q se

> dispare cuando hay un evento en la tabla X para realizar una acción en la

> misma tabla X?

>



apoyo la idea de la vista (los campos calculados no deberian existir a

menos que haya una buena razon).



sobre tu problema, no ejecutes otro insert ni un update, por eso se

dispara el trigger deberias tener un codigo algo asi:



create function fn_trg_calcula() returns trigger as $$

 begin

    new.total = new.campo1+new.campo2+new.campo3;

 end;

$$ language plpgsql;



--

Jaime Casanova         www.2ndQuadrant.com

Professional PostgreSQL: Soporte y capacitación de PostgreSQL





Les comento, el código del trigger es el siguiente:

CREATE OR REPLACE FUNCTION calcular_total() RETURNS trigger AS '
BEGIN
  IF (tg_op = ''INSERT'') OR (tg_op = ''UPDATE'') THEN

     UPDATE promedios SET total= NEW.campo1 + NEW.campo2 + NEW.campo3 WHERE id 
= codigo;
  END IF;
  RETURN NEW;
END
' LANGUAGE plpgsql;


CREATE TRIGGER calcular_total AFTER INSERT OR UPDATE ON promedios

  EXECUTE PROCEDURE calcular_total();
Normalmente en las bases de datos transaccionales no se guardan los campos 
calculados, esta filosofia se usa en las base de datos tipo data warehouse. 





      

Responder a