Опубликован: 17.09.2009 | Доступ: свободный | Студентов: 1436 / 103 | Оценка: 3.94 / 3.53 | Длительность: 10:18:00
ISBN: 978-5-9963-0238-3
Лекция 12:

Триггеры Oracle Forms. Классификация триггеров. Пользовательские триггеры

< Лекция 11 || Лекция 12: 12 || Лекция 13 >

Свойства триггера

Для управления поведением триггера используйте его свойства, перечисленные в палитре свойств ( рис. 12.2).

Свойства триггера

Рис. 12.2. Свойства триггера
  • Имя триггера – это зарезервированное слово, определенное в Oracle Forms для именования события. Если вы создадите стандартный триггер, а затем измените его имя на другое, не входящее в перечень зарезервированных имен триггеров Oracle Forms, то такой триггер автоматически становится пользовательским. Также стандартный триггер становится пользовательским, если его имя не соответствует области его определения. Так, например, триггер WHEN-VALIDATERECORD недоступен на уровне элемента, поэтому если вы создадите пользовательский триггер с таким именем или переименуете существующий стандартный триггер в WHEN-VALIDATE-RECORD, то он все равно будет пользовательским.
  • Стиль триггера – это тип выполняемой команды. Значение этого свойства неизменно, так как тело триггера может содержать только PL/SQL-код.
  • Текст триггера – это код триггера (тело триггера), выполняемый при его срабатывании. При выборе этого свойства появляется PL/SQL-редактор.
  • Режим запроса – определяет поведение триггера во время режима запроса. Если значение свойства установлено в "Yes", триггер срабатывает в режиме запроса.
  • Иерархия выполнения – значение этого свойства определяет поведение триггера, в случае если на более высоком уровне объявлен триггер с тем же самым именем. Для этого свойства доступны три значения:
    • заменить – выполняется только код текущего триггера;
    • перед – текущий триггер выполняется до выполнения триггера с более высоким уровнем определения;
    • после – текущий триггер выполняется после выполнения триггера с более высоким уровнем определения.
  • Отобразить в "Справке по клавишам" – определяет, выводится ли триггер в "Справке по клавишам".
  • Текст "Справки по клавишам" – описание триггера, выводимое в "Справке по клавишам".

Например, триггеры типа "KEY-" срабатывают независимо от того, в каком режиме находится форма. Чтобы запретить срабатывание этого триггера, в режиме запроса установите значение свойства "Режим запроса" на "No".

Триггеры обработки блоков

Триггеры обработки блоков – это триггеры, которые срабатывают в ответ на события, связанные с модификацией и управлением записями в блоке, например:

  • WHEN-CREATE-RECORD – это событие возникает, когда Forms пытается создать запись в блоке;
  • WHEN-CLEAR-BLOCK – это событие возникает, когда Forms пытается отчистить блок, то есть удалить все записи;
  • WHEN-DATABASE-RECORD – это событие возникает, когда Forms пытается изменить статус записи;
  • WHEN-REMOVE-RECORD – это событие возникает, когда Forms пытается удалить или отчистить запись.

Триггеры события интерфейса

Триггеры события интерфейса – это триггеры, которые срабатывают в ответ на события интерфейса формы, обусловленные действием оператора или программным управлением.

  • WHEN-BUTTON-PRESSED – это событие возникает, когда оператор нажимает на кнопку, причем независимо от того, как было осуществлено нажатие – с помощью мыши или клавиатуры.
  • WHEN-CHECKBOX-CHANGED – это событие возникает, когда оператор изменяет состояние переключателя, включая и выключая его, причем независимо от того, как было осуществлено нажатие – с помощью мыши или клавиатуры.
  • WHEN-IMAGE-ACTIVATED – это событие возникает, когда оператор дважды щелкает по элементу изображения.
  • WHEN-IMAGE-PRESSED – это событие возникает, когда оператор щелкает по элементу изображения.
  • WHEN-RADIO-CHANGED – это событие возникает при выборе оператором радиокнопки в радиогруппе.
  • WHEN-TIMER-EXPIRED – это событие возникает, когда истекает период времени, определенный в таймере.
  • WHEN-WINDOW-ACTIVATED – это событие возникает, когда активизируется окно.
  • WHEN-WINDOW-CLOSED – это событие возникает в ответ на закрытие окна.
  • WHEN-WINDOW-DEACTIVATED – это событие возникает, когда окно становится неактивным, например, когда оператор активизирует другое окно.
  • WHEN-WINDOW-RESIZED – это событие возникает в ответ на изменение размеров окна.
  • KEY-[ALL] – это событие, возникающие в ответ на нажатие функциональной клавиши. К этой категории относятся все триггеры с префиксом KEY.

Триггеры главный-подчиненный

Триггеры главный-подчиненный или Мастер-Деталь – это триггеры, которые управляют координацией между записями главной и подчиненной таблиц и срабатывают в ответ на модификацию записей в Мастер-блоке или Деталь-блоке. Триггеры главный-подчиненный генерируются Oracle Forms автоматически при создании отношения, например:

  • ON-CHEK-DELETE-MASTER – это событие возникает при попытке Oracle Forms удалить запись в главном блоке;
  • ON-CLEAR-DETAILS – это событие возникает при очистке Oracle Forms записей подчиненного блока, в момент, когда они уже не соответствуют записи главного блока;
  • ON-POPULATE-DETAILS – это событие возникает в момент, когда Oracle Forms необходимо извлечь записи в подчиненный блок.

Триггеры обработки сообщений и ошибок

Триггеры обработки сообщений – это триггеры, которые срабатывают в ответ сообщения, которые возникают во время выполнения формы, например:

  • ON-ERROR – это событие возникает в ответ на возникновения ошибки. Эти триггеры предназначены для того, чтобы вы могли подавить сообщения об ошибке, заменить его свои сообщением или выполнить иное действие;
  • ON-MESSAGE – это событие, возникающее в ответ на сообщение Oracle Forms и предназначенное для замены стандартного сообщения или его подавление.

Эти триггеры следует использовать для обработки наиболее обобщенных ситуаций, так как основная обработка ошибок должна быть выполнена непосредственно в том блоке, который ее возбуждает.

Навигационные триггеры

Триггеры навигации – это триггеры, которые срабатывают в ответ на какие-либо навигационные действия в форме, например, перемещение фокуса на другой объект или переход от одного элемента к другому. Навигационные триггеры действуют на всех уровнях иерархии объектов Forms. Навигационные триггеры можно разделить на две категории: PRE-, POST- и WHEN-.

PRE-, POST – это триггеры внутренней навигации, которые срабатывают в ответ на внутреннее перемещение между иерархиями объектов. Так, например, при перемещении фокус ввода одним щелчком мыши из одного элемента блока в элемент, находящийся в другом блоке, выполняется целый ряд внутренних навигационных событий.

  • PRE-FORM – это событие возникает перед переходом на уровень формы, например, перед запуском формы.
  • PRE-BLOCK – это событие возникает перед тем, как Oracle Forms перейдет с уровня формы на уровень блока.
  • PRE-RECORD – это событие возникает перед тем, как Oracle Forms перейдет с уровня блока на уровень записи.
  • PRE-TEXT-ITEM – это событие возникает перед переходом с уровня записи на уровень элемента.
  • POST-TEXT-ITEM – это событие возникает во время того, как Oracle Forms покидает элемент и переходит на уровень записи.
  • POST-RECORD – это событие возникает во время того, как Oracle Forms покидает запись и переходит на уровень блока.
  • POST-BLOCK – это событие возникает во время того, как Oracle Forms покидает блок и переходит на уровень формы.
  • POST-FORM – это событие происходит во время того, как Oracle Forms перейдет к "вне" формы, то есть покинет уровень формы, например, выход из формы или переход к другой форме.

WHEN – это триггеры, срабатывающие в завершении последовательности навигации, то есть уже после перемещения фокуса ввода в элемент. Триггеры этого типа не реагируют на события внутреннего интерфейса.

  • WHEN-NEW-FORM-INSTANCE – это событие возникает при старте формы.
  • WHEN-NEW-BLOCK-INSTANCE – это событие возникает при перемещении фокуса ввода в блок.
  • WHEN-NEW-RECORD-INSTANCE – это событие возникает при переходе фокуса ввода в новую запись.
  • WHEN-NEW-ITEM-INSTANCE – это событие возникает после того, как фокус ввода переместится в другой элемент.

Триггеры перечислены в порядке их срабатывания – так, например, если вы перемещаетесь с записи одного блока на новую запись другого блока, то триггеры срабатывают в следующем порядке:

WHEN-NEW-BLOCK-INSTANCE - WHEN-NEW-RECORD-INSTANCE

Триггеры периода запроса

Триггеры периода запроса – это триггеры, которые срабатывают в ответ на события, связанные с обработкой запроса, до или после его выполнения в блоке, причем независимо от того, инициировано оно пользователем или программой, например:

  • PRE-QUERY – это событие возникает до того, как в базу данных будет отправлен оператор SELECT ;
  • POST-QUERY – это событие возникает после того, как записи извлечены, причем данный триггер срабатывает для каждой извлекаемой записи отдельно.

Например, для того чтобы изменить критерий запроса перед его выполнением используйте триггер PRE-QUERY. Если же вам необходимо откорректировать извлекаемое значение, перед тем как отобразить его в блоке, задействуйте триггер POST-QUERY. Ниже приведен пример, в котором корректируется POST-QUERY.

DECLARE
Select cena*0.10 INTO :cena from price;
END;

Транзакционные триггеры

Транзакционные триггеры – это триггеры, которые срабатывают в ответ на события, происходящие во время взаимодействия формы с источником данных. Примерами таких событий могут служить: подсоединение к Oracle, фиксация или откат транзакции, обработка операций DML во время и после посылки транзакций, например:

  • ON-DELETE – это событие сигнализирует о точке, в которой можно заменить обработку процесса удаления записей Oracle Forms по умолчанию;
  • ON-INSERT – это событие сигнализирует о точке, в которой можно заменить обработку процесса вставки записей Oracle Forms по умолчанию;
  • ON-LOCK – это событие сигнализирует о точке, в которой можно заменить обработку блокировок Oracle Forms по умолчанию;
  • ON-LOGON – это событие сигнализирует о точке, в которой можно заменить обработку подсоединения Forms к базе данных Oracle или к любому другому источнику;
  • ON-LOGOUT – это событие сигнализирует о точке, в которой можно заменить обработку Forms по умолчанию для отсоединения от Oracle;
  • ON-UPDATE – это событие сигнализирует о точке, в которой можно заменить обработку процесса обновления записей Oracle Forms по умолчанию;
  • POST-DATABASE-COMMIT – это событие возникает после фиксации изменений, позволяя вам наращивать обработку по умолчанию;
  • POST-DELETE – это событие возникает после удаления строки из базы данных;
  • POST-INSERT – это событие возникает после вставки строки в базу данных;
  • POST-UPDATE – это событие возникает после обновления строки в базе данных;
  • PRE-COMMIT – это событие возникает, когда Oracle Forms определяет, что в форме есть изменения для посылки или фиксации, иначе говоря – перед процессом Post и Commit Transactions;
  • PRE-DELETE – это событие возникает до удаления записи из базы данных, позволяя вам выполнять различного виды проверки во время процессов Post и Commit Transactions;
  • PRE-INSERT – это событие возникает до вставки записи в базу данных, позволяя вам выполнять различного вида проверки во время процессов Post и Commit Transactions;
  • PRE-UPDATE – это событие возникает до обновления записи в базе данных, позволяя вам выполнять различного виды проверки во время процессов Post и Commit Transactions.

В качестве примера рассмотрим триггер PRE-INSERT, с помощью которого создадим аналог автоинкремента, то есть автоматического генератора первичных ключей для таблицы.

Select seq.nextval INTO :block_name.prkey_item from dual;

Триггеры проверки допустимости

Триггеры проверки допустимости – это триггеры, которые срабатывают в момент, когда Oracle Forms проверяет допустимость данных в элементе или записи. Проверка допустимости данных осуществляется во время навигации, которая может быть вызвана действиями оператора или программным управлением. Срабатывание триггеров проверки допустимости может также инициировать обработка по умолчанию, которая осуществляется Oracle Forms при выполнении какого-либо действия – например, выполнение команды сохранения commit ( commit_form ) инициирует обработку по умолчанию.

WHEN-VALIDATE-ITEM – это событие возникает во время обработки проверки допустимости, которую Oracle Forms выполняет по умолчанию. Вы можете использовать этот триггер, чтобы нарастить стандартную проверку допустимости для элемента дополнительными условиями и исключениями.

WHEN-VALIDATE-RECORD – это событие возникает во время обработки проверки допустимости, которую Oracle Forms выполняет по умолчанию. Вы можете использовать этот триггер, чтобы нарастить стандартную проверку допустимости для записи дополнительными условиями и исключениями.

В качестве примера рассмотрим триггер WHEN-VALIDATE-ITEM, с помощью которого выполним проверку элемента на введенные значения. Если значение элемента будет превышать 1000, то программа вернет фокус ввода обратно в элемент и отчистит его.

IF :item_name>1000 THEN
Message('Значение не должно превышать 1000');
Go_item('item_name');
:item_name:=null;
END IF;

Компиляция триггеров

Когда вы генерируете (компилируете) модуль, автоматически компилируются и все триггеры, принадлежащие этому модулю. Триггер автоматически компилируется при запуске формы, если включен параметр "Generate before run". Также вы можете скомпилировать все триггеры командой главного меню Program | Compile All.

Создание пользовательских триггеров

В Oracle Forms помимо триггеров событий существуют пользовательские триггеры, которые не связаны с какими-либо событиями.

Пользовательский триггер – это триггер, который не связан ни с одним событием Oracle Forms и имеет уникальное имя, данное ему разработчиком. Вы можете создавать пользовательские триггеры на уроне формы, блока и элемента.

Чтобы создать пользовательский триггер, выполните следующие действия:

  1. Находясь в навигаторе объектов, выберите узел "Триггеры" на уровне формы и нажмите иконку "Создать" или выберите пункт меню Edit | Create для запуска окна триггеров ( рис. 12.3).
    Окно "Триггеры"

    Рис. 12.3. Окно "Триггеры"
  2. Выберите из списка надпись "(User_Named)", она указана самой первой в списке, и подтвердите выбор.
  3. После создания триггер появляется в ветке "Триггеры" с именем, сгенерированным Oracle Forms. Вызовите для триггера палитру свойств и переименуйте его в нужное вам имя.

Поскольку триггер не отвечает ни на одно событие Forms, его срабатывание необходимо инициировать. Для вызова пользовательского триггера существует встроенная процедура EXECUTE_TRIGGER:

EXECUTE_TRIGGER("my_trigger");

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

< Лекция 11 || Лекция 12: 12 || Лекция 13 >