Обновление таблицы с использованием блока множественных записей в фиксации форм - PullRequest
0 голосов
/ 29 мая 2018

я хотел обновить таблицу, используя значения из блока с несколькими записями, и вот что я пробовал в фиксации форм сообщений:

BEGIN
    FIRST_RECORD;
    LOOP 
        UPDATE table1         
        SET ord_no = :blk.new_val;
        EXIT WHEN :SYSTEM.LAST_RECORD='TRUE';
        NEXT_RECORD;
    END LOOP;
END;

, но при сохранении я получил ошибку

FRM-40737: Illegal restricted procedure
FIRST-RECORD in POST-FORMS-COMMIT trigger.

1 Ответ

0 голосов
/ 29 мая 2018

ОК, несколько вещей, о которых можно поговорить здесь

1) Я предполагаю, что 'table1' - это НЕ таблица, на которой основан блок.Если блок был основан на таблице 1, просто, когда пользователь редактирует записи на экране, тогда, когда вы выполняете команду COMMIT_FORM (или пользователи нажимают кнопку Сохранить), соответствующие обновления будут сделаны для вас автоматически.(Это основное использование блока на основе таблицы базы данных).

2) Поэтому я предполагаю, что table1 - это нечто ДРУГОЕ, чем таблица на основе блоков.Следующее, что вам, вероятно, понадобится предложение WHERE в вашем операторе обновления.Я предполагаю, что вы обновляете конкретное в таблице1 на основе определенного значения из блока?Так что это будет что-то вроде:

update table1
set ord_no = :blk.new_val
where keycol = :blk.some_key_val

3) Вы не можете выполнять определенные операции стиля навигации, когда в середине фиксации, следовательно, ошибка.Обходной путь для этого состоит в том, чтобы отложить операцию до завершения навигации через таймер.Таким образом, ваш код выглядит примерно так:

Declare
  l_timer timer;
Begin
  l_timer := find_timer('DEFERRED_CHANGES');
  if not id_null(l_timer) then
    Delete_Timer(l_timer);
  end if;
  l_timer := Create_Timer('DEFERRED_CHANGES', 100, no_Repeat);
End;

, который создает таймер, который срабатывает один раз через 100 мс после завершения вашего триггера (выберите имя и время соответственно), а затем у вас будет свой исходный код на время-время-триггер с истекшим сроком действия.

Но, пожалуйста - сначала проверьте мою точку зрения (1).

...