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/
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

Responder a