Доброе время суток.
Есть внутрення процедура, которая заполняет поле ACT_PAID (заполняет в двух строках табл. DEVICES)
В которой OUT_ACT_RESULT_PAID = 1
В таблице DEVICES также есть поле DATE_RETURN, а у поля ACT_PAID (которое может быть равно 0 или 1, но сначало оно = 0) есть триггер
процедура SP_DATE_RETURN(old.PROPOSAL_ID, null, old.ID, 30);
где
:VAR_ACT_PAID = 1
заполняет поле DATE_RETURN.
Проблема в том, что запрос например (я уже не испольую первую описанную мной вверху процедуру, а заполняю сам)
с одним ID = 127 – работает, поле DATE_RETURN заполняет
А запрос
не заполняет ни одного DATE_RETURN, хотя в этом случае заполняться должна строка только с ID=127, т.к. для ID=129 не подходит условие
if (not :VAR_DEV_FROM_CLIENT_DATE is null) then
В чем может быть ошибка?
Заранее спасибо за ответ.
P.S.
- Конечно есть подозрение, что когда обновляется несколько строк, треггер вызывается только один раз, и с праметрами строки с ID=129, при которой поле DATE_RETURN заполняться не должно
Есть внутрення процедура, которая заполняет поле ACT_PAID (заполняет в двух строках табл. DEVICES)
for select DEVICE_ID from NC where ACCOUNTANCY_ID = :ACCOUNTANCY_ID into :VAR_DEVICES_ID do update DEVICES set ACT_PAID = :OUT_ACT_RESULT_PAID where ID = :VAR_DEVICES_ID;
В которой OUT_ACT_RESULT_PAID = 1
В таблице DEVICES также есть поле DATE_RETURN, а у поля ACT_PAID (которое может быть равно 0 или 1, но сначало оно = 0) есть триггер
CREATE OR ALTER TRIGGER AU_DEVICES_DATE_RETURN FOR DEVICES ACTIVE AFTER UPDATE POSITION 0 AS begin if ((new.ACT_PAID <> old.ACT_PAID) or (old.ACT_PAID is null and new.ACT_PAID is not null) or (old.ACT_PAID is not null and new.ACT_PAID is null)) then execute procedure SP_DATE_RETURN(old.PROPOSAL_ID, null, old.ID, 30); end
процедура SP_DATE_RETURN(old.PROPOSAL_ID, null, old.ID, 30);
create or alter procedure SP_DATE_RETURN ( IN_PROPOSAL_ID integer, IN_FROM_CLIENT_DATE date, IN_DEVICE_ID integer, IN_ADD_COUNT_DAY integer) as declare variable VAR_DEVICE_ID integer; declare variable VAR_ID integer; declare variable VAR_ACT_PAID integer; declare variable VAR_ADD_COUNT_DAY integer; declare variable VAR_DEV_FROM_CLIENT_DATE date; begin select ACT_PAID from DEVICES where ID = :IN_DEVICE_ID into :VAR_ACT_PAID; if (:IN_FROM_CLIENT_DATE is null) then select DEV_FROM_CLIENT_DATE from DEPARTMENT_RECEIPT where DEVICE_ID = :IN_DEVICE_ID into :IN_FROM_CLIENT_DATE; if (:VAR_ACT_PAID = 0) then update DEVICES d set d.DATE_RETURN = null where d.ID in (select n.DEVICE_ID from NC n where n.PROPOSAL_ID = :IN_PROPOSAL_ID and n.ACT_NUMBER = (select n.ACT_NUMBER from NC n where n.DEVICE_ID = :IN_DEVICE_ID)); if (:VAR_ACT_PAID in (1, 2)) then begin if (:IN_ADD_COUNT_DAY < 0) then :VAR_ADD_COUNT_DAY = 30; else :VAR_ADD_COUNT_DAY = :IN_ADD_COUNT_DAY; if (:IN_DEVICE_ID > 0) then begin for select n.DEVICE_ID from NC n where n.PROPOSAL_ID = :IN_PROPOSAL_ID and n.ACT_NUMBER = (select n.ACT_NUMBER from NC n where n.DEVICE_ID = :IN_DEVICE_ID) into :VAR_DEVICE_ID do begin select DEV_FROM_CLIENT_DATE from DEPARTMENT_RECEIPT where DEVICE_ID = :VAR_DEVICE_ID into :VAR_DEV_FROM_CLIENT_DATE; if (not :VAR_DEV_FROM_CLIENT_DATE is null) then update DEVICES d set DATE_RETURN = dateadd(day, :VAR_ADD_COUNT_DAY, :IN_FROM_CLIENT_DATE) where d.ID = :VAR_DEVICE_ID; --те СИТ которые есть уже в БП end end end end
где
:VAR_ACT_PAID = 1
заполняет поле DATE_RETURN.
Проблема в том, что запрос например (я уже не испольую первую описанную мной вверху процедуру, а заполняю сам)
update DEVICES d set act_paid = 1 where d.ID in (127)
с одним ID = 127 – работает, поле DATE_RETURN заполняет
А запрос
update DEVICES d set act_paid = 1 where d.ID in (127, 129)
не заполняет ни одного DATE_RETURN, хотя в этом случае заполняться должна строка только с ID=127, т.к. для ID=129 не подходит условие
if (not :VAR_DEV_FROM_CLIENT_DATE is null) then
В чем может быть ошибка?
Заранее спасибо за ответ.
P.S.
- Конечно есть подозрение, что когда обновляется несколько строк, треггер вызывается только один раз, и с праметрами строки с ID=129, при которой поле DATE_RETURN заполняться не должно