Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Полурабочая процедура Firebird

$
0
0
Доброе время суток.
Есть внутрення процедура, которая заполняет поле 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 заполняться не должно

Viewing all articles
Browse latest Browse all 1677

Trending Articles