злыдень
|
Цитата:
Сообщение от Gustav
Не хватает явно! Увы, много чего не хватает...
УжОс! Многа букв.
И слава богу что нет.. Я одного не понимаю чем этот изврат, которого нет, лучше хранимок и триггеров которые везде есть уже n десятков лет ???
Неужели программировать в родном "последовательно-процедурном" стиле не приятнее на порядок???
Вот как выглядит типичная обработка на firebird, по моему все понятно без слов:
Код: AS
declare variable znak integer;
declare variable sumnds double precision;
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_Z_PROVODKA_ID,1);
/* Перед подстановкой в основную считаем параметры осн записи и рассчитаем себестоимость*/
if (new.id_pribyl<>0) then /* Прибыли */
begin
select first 1 data, skladkod, statuskod, celkod from Z_PRIBYL
where Z_PRIBYL.id = NEW.id_pribyl into new.data, new.skladprihod, new.status, new.typeoper;
select result from f_valuta_calc(new.summaval,new.data,new.valutakod) into new.summaprihod;
new.summaoper = new.summaprihod;
end
if (new.id_ubytok<>0) then/* Убытки */
begin
select first 1 data, skladkod, statuskod, celkod from Z_UBYTOK
where Z_UBYTOK.id = NEW.id_ubytok into new.data, new.skladrashod, new.status, new.typeoper;
select result from z_ostatok_stoim(new.status,new.tovarkod,new.skladrashod,new.kolnov * (-1)) into new.summarashod;
new.summaoper = new.summarashod;
end
if (new.id_perem <> 0) then /*Перемещения*/
begin
select first 1 dataprih, datarash, skladrashodkod, skladprihodkod, statuskod, celkod from Z_PEREM
where Z_PEREM.id = new.id_perem into new.data,new.datarashod, new.skladrashod, new.skladprihod, new.status, new.typeoper;
select result from z_ostatok_stoim(new.status,new.tovarkod,new.skladrashod,new.kolnov * (-1)) into new.summarashod;
new.summaprihod = (-1)*new.summarashod;
new.summaoper = new.summarashod;
end
if (new.id_zpnakl <> 0) then /* Закупка */
begin
select first 1 data, skladkod, statuskod, celkod, postkod, valutakod from zp_nakl
where zp_nakl.id = NEW.id_zpnakl into new.data, new.skladprihod, new.status, new.typeoper, new.postkod, new.valutakod;
select result from f_valuta_calc((new.summaval-new.summands),new.data,new.valutakod) into new.summaprihod;
UPDATE ZP_NAKL SET SUMMA = SUMMA + new.summaprihod WHERE (ID = new.id_zpnakl);
select result from f_valuta_calc(new.summands,new.data,new.valutakod) into new.summaoper;
UPDATE ZP_NAKL SET SUMMANDS = SUMMANDS + new.summaoper WHERE (ID = new.id_zpnakl);
new.summaoper = new.summaprihod;
end
if (new.id_prnakl <> 0) then /* Продажа */
begin
select first 1 data, skladkod, statuskod, celkod, klientkod, valutakod from pr_nakl
where pr_nakl.id = NEW.id_prnakl into new.data, new.skladrashod, new.status, new.typeoper, new.klientkod, new.valutakod;
select result from f_valuta_calc(new.summaval-new.summands,new.data,new.valutakod) into new.summaoper;
select result from z_ostatok_stoim(new.status,new.tovarkod,new.skladrashod,new.kolnov * (-1)) into new.summarashod;
select result from f_valuta_calc(new.summands,new.data,new.valutakod) into sumnds;
UPDATE PR_NAKL SET
SUMMA = SUMMA + new.summaoper,
SUMMANDS = SUMMANDS + :sumnds
WHERE (ID = new.id_prnakl);
end
if (new.kolnov = 0) then exit;
/* Контроль */
if ((new.tovarkod is null) or (new.skladprihod is null AND new.skladrashod is null)) then
execute procedure ERROR('Проводки в никуда быть не может');
/* Собственно тригер */
/* Приход:"+", Расход:"-" */
if (new.status > 0) then znak = 1; else znak = (-1); /*Возвраты*/
if (not (new.skladprihod is null)) then
begin
new.kolprihod = new.kolnov;
execute procedure z_ostatok_calc (new.tovarkod,new.skladprihod,new.kolprihod,new.summaprihod,:znak,new.status);
end
if (not (new.skladrashod is null)) then
begin
new.kolrashod = new.kolnov*(-1);
execute procedure z_ostatok_calc (new.tovarkod,new.skladrashod,new.kolrashod,new.summarashod,:znak,new.status);
end
/* Обновим статусы*/
if (new.status = 1) then new.ZAAVKA = new.kolnov;
else
if (new.status = 2) then new.ZAKAZ = new.kolnov;
else
if (new.status = 3) then new.REZERV = new.kolnov;
else
if (new.status = 4) then new.PUT = new.kolnov;
else
if (new.status = 5) then new.ZAVER6ENO = new.kolnov;
END
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
|