| From: | "Luis Esteban" <esteban(at)princesa(dot)pri(dot)sld(dot)cu> | 
|---|---|
| To: | pgsql-es-ayuda(at)postgresql(dot)org | 
| Subject: | Dudas con trigger... | 
| Date: | 2010-02-10 21:01:57 | 
| Message-ID: | op.u7w7r8waie74ma@samaria | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-es-ayuda | 
Hola a todos, :)
Me estoy ensayando con los disparadores(triggers) en una aplicación  
contable en linux(PostgreSQL+Python) pero tengo dudas pues nunca he hecho  
alguno.
Esta es la tabla a la cual se le insertará datos como: cuenta, subcuenta,  
id_ncu, saldo_inicial, debito o credito, pero quiero que el disparador  
calcule el saldo_final y se lo inserte. Esto dependerá de si la naturaleza  
de la cuenta es dedudora(id_ncu=1) o acreedora(id_ncu=2). Quiero que  
cuando la aplicación inserte los datos en la tabla, el disparador calcule  
el saldo_final en función de los datos insertados.
Acá está mi versión pero... concretamente, mi duda está en cómo  
referenciar los campos de la tabla dentro de la función, no se si lo estoy  
haciendo bien.
/*
  * tabla mayor
  */
CREATE TABLE mayor(
     cuenta 		varchar(3) NOT NULL,
     subcuenta 		varchar(4) NOT NULL,
     id_ncu 		int REFERENCES naturaleza_cuentas(id_ncu),
     saldo_inicial 	numeric(6,2) DEFAULT 0.00 CONSTRAINT  
saldo_inicial_positivo CHECK(saldo_inicial>=0),
     debito 		numeric(6,2) DEFAULT 0.00 CONSTRAINT debito_positivo  
CHECK(debito>=0),
     credito 		numeric(6,2) DEFAULT 0.00 CONSTRAINT credito_positivo  
CHECK(credito>=0),
     saldo_final 	numeric(6,2) CONSTRAINT saldo_final_positivo  
CHECK(saldo_final>0),
     PRIMARY KEY(cuenta,subcuenta)
);
/*
  * definición de la función
  */
CREATE FUNCTION disparador_saldo_final
     RETURNS trigger
     AS $$
     BEGIN
         IF (TG_OP = 'INSERT') THEN
             IF (id_ncu=1) THEN
                 INSERT INTO mayor (saldo_final) VALUES  
(saldo_inicial+debito-credito);
             ELSE
                 INSERT INTO mayor (saldo_final) VALUES  
(saldo_inicial-debito+credito);
             END IF;
         END IF;
         RETURN NULL;
     END;
     $$
     language 'plpgsql';
/*
  * definición formal del disparador
  */
CREATE TRIGGER disparador_mayor_saldo_final
     BEFORE INSERT
     ON mayor
     FOR EACH ROW
     EXECUTE PROCEDURE disparador_saldo_final;
Ah!, y algo más: estoy insertando todo esto en el mismo .sql donde creo la  
base de datos, usuario, derechos, tablas e inserto algunos datos. ¿Estoy  
bien?.
Muchas gracias anticipadas.
-- 
Saludos,
Luis Esteban
--
Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas
Infomed: http://www.sld.cu/
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Alvaro Herrera | 2010-02-10 21:07:52 | Re: Dudas con trigger... | 
| Previous Message | Carlos Bazán | 2010-02-10 20:14:26 | Re: Uso de arrays en comparaciones |