Make your own free website on Tripod.com

Объектно-реляционная БД Ultima-S

Описание триггера формирования таблицы сальдо на языке макросов

Таблица сальдо является достаточно сложной таблицей статистики в которой много разрезов, имеются нарастающие суммы, требуется обработка случаев дебетования и кредитования.

На начальном этапе представить себе как выглядит алгоритм обрабатывающий столько условий человеку затруднительно. Поэтому первый вариант триггера был не написан в прямом смысле, а сгенерирован программой путем раскрытия большого количества макросов содержащих указанные условия. Текст триггера описанный в макросах приводится ниже, описание макросов дается на отдельной странице.

После того как текст триггера был сгенерирован, стало понятно как выглядит искомый алгоритм, далее он был многократно оптимизирован вручную. Фактически такие правки потребовались сразу.

CREATE TRIGGER SaldoInformator

ON Complect

FOR INSERT, UPDATE, DELETE

as

insert _XS(UDN, u1, u2, u3, u4, u5, ic, id, sd, sc, ict, idt, sdt, sct)

SELECTI1,

0, 0, 0, 0,

(INS_TOT_SELECT _XS.iсt INSTOT_WHERE),

(INS_TOT_SELECT _XS.idt INSTOT_WHERE),

(INS_TOT_SELECT _XS.sdt INSTOT_WHERE),

(INS_TOT_SELECT _XS.sct INSTOT_WHERE)

from inserted I

where not exists (

SELECTT1 from inserted T, _XS where ABS_A_UX_UX1 )

-- C fields

update _XS

set

_XS.sc=_XS.sc-(select sum(T.s) DSEL1),

_XS.ic=_XS.ic-(select sum(T.i) DSEL1)

where exists( SELECTD1 DSEL1)

update _XS

set

_XS.sc=_XS.sc+(select sum(T.s) ISEL1),

_XS.ic=_XS.ic+(select sum(T.i) ISEL1)

where exists( SELECTD1 ISEL1)

 

--D fields

update _XS

set

_XS.sd=_XS.sd-(select sum(T.s) DSEL2),

_XS.id=_XS.id-(select sum(T.i) DSEL2)

where exists( SELECTD2 DSEL2)

update _XS

set

_XS.sd=_XS.sd+(select sum(T.s) ISEL2),

_XS.id=_XS.id+(select sum(T.i) ISEL2)

where exists( SELECTD2 ISEL2)

--CT fields

update _XS

set

_XS.sct=_XS.sct-(select sum(T.s) DSELTOTAL1),

_XS.ict=_XS.ict-(select sum(T.i) DSELTOTAL1)

where exists( SELECTD1 DSELTOTAL1)

update _XS

set

_XS.sct=_XS.sct+(select sum(T.s) ISELTOTAL1),

_XS.ict=_XS.ict+(select sum(T.i) ISELTOTAL1)

where exists( SELECTD1 ISELTOTAL1)

--DT fields

update _XS

set

_XS.sdt=_XS.sdt-(select sum(T.s) DSELTOTAL2),

_XS.idt=_XS.idt-(select sum(T.i) DSELTOTAL2)

where exists( SELECTD2 DSELTOTAL2)

update _XS

set

_XS.sdt=_XS.sdt+(select sum(T.s) ISELTOTAL2),

_XS.idt=_XS.idt+(select sum(T.i) ISELTOTAL2)

where exists( SELECTD2 ISELTOTAL2)

GO