Dudas con trigger...

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/

Responses

Browse pgsql-es-ayuda by date

  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