powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Полурабочая процедура Firebird
2 сообщений из 2, страница 1 из 1
Полурабочая процедура Firebird
    #39826771
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток.
Есть внутрення процедура, которая заполняет поле ACT_PAID (заполняет в двух строках табл. DEVICES )
Код: sql
1.
2.
3.
4.
5.
6.
7.
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) есть триггер
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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);

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
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 .

Проблема в том, что запрос например (я уже не испольую первую описанную мной вверху процедуру, а заполняю сам)
Код: sql
1.
2.
3.
update DEVICES d
            set act_paid = 1
              where d.ID in (127)



с одним ID = 127 – работает , поле DATE_RETURN заполняет
А запрос
Код: sql
1.
2.
3.
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 заполняться не должно
...
Рейтинг: 0 / 0
Полурабочая процедура Firebird
    #39826774
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жаль что вопрос нельзя удалить, нашел ошибку в "
Код: sql
1.
set DATE_RETURN = dateadd(day, :VAR_ADD_COUNT_DAY, :IN_FROM_CLIENT_DATE)

"
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Полурабочая процедура Firebird
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]