Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2019, 20:09   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Полурабочая процедура Firebird

Доброе время суток.
Есть таблица DEVICES, у нее есть поля ACT_PAID (которое может быть равно 0 или 1), и DATE_RETURN.
Есть триггер на поле ACT_PAID

Код:
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 заполняться не должно
- поле ACT_PAID заполняет также другая внутрення процедура
Код:
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;

Последний раз редактировалось KBO; 14.06.2019 в 20:40.
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Firebird - Внутренняя процедура, условие с условием для цикла KBO SQL, базы данных 1 12.10.2018 07:45
Процедура в Firebird. VHomer SQL, базы данных 2 13.12.2013 16:25
Хранимая процедура для Firebird Lait1989 БД в Delphi 1 15.05.2010 11:02
Хранимая процедура FireBird Gurt87 БД в Delphi 3 27.01.2010 13:31
хранимая процедура(firebird) alex_-87 БД в Delphi 8 03.01.2010 14:59