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: | Raw Message | Whole Thread | 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 |