источник:www.cs.ifmo.ru
Учебное пособие.
Автор: Илья
Фейгин.
Как кажется автору данного документа для выполнения стандартного задания необходимо и возможно достаточно освоить следующие триггеры: WHEN_NEW_INSTANCE_FORM, WHEN_NEW_INSTANCE_ITEM, ON_CHANGE, WHEN_VALIDATE_ITEM, POST_QUERY, ON_ERR.
Имена триггеров соответствуют runtime событиям, с которыми они связаны. Так например тригер "When-Button-Pressed" соответствует событию нажатия кнопки "Button Pressed", в соответсвии с этим, когда пользователь нажимает данную кнопку Oracle Forms .вызывает данный тригер и выполняет его код.
Триггер должен быть связан непосредственно с каким-нибудь объектом, таким как фориа, блок в форме или какой-либо элемент (текстовое поле, кнопка и т.д.) Например в форме с тремя кнопками каждая из них имеет When-Button-Pressed тригер и каждый из этих триггеров содержит различный PL/SQL код. Пользователь нажимает какую-то кнопку и тригер, прикрепленный к этой кнопке (When-Button-Pressed) срабатывает. Очевидно, что остальные тригера When-Button-Pressed, прикрепленные к другим кнопкам не срабатывают.
Событие - Имя триггера
Pressing a button(нажатие кнопки) -When-Button-Pressed
Clicking a check box (нажатие check-boxa)-When-CheckBox-Changed
Pressing the Tab key (нажатие Tab-Key) Key-NxtItem
Событие - Имя триггера
Validate the item (Проверяется элемент на корректность введенных данных ) When-Validate-Item
(соответствует или нет определенным условиям)
Leave the item ("покидаем") элемент (убираем фокус ввода)-Post-Text-Item
Validate the record (проверяем запись)-When-Validate-Record
Leave the record ("покидаем запись")-Post-Record
Leave the block ("покидаем блок") Post-Block
Enter the block ("делаем активным блок")- Pre-Block
Enter the record ("делаем активной запись")-Pre-Record
Enter the Item (устанавливаем фокус ввода на элементе) Pre-Text-Item
Ready block for input (блок готов для ввода)- When-New-Block-Instance
Ready record for input (запись готова для ввода)When-New-Record-Instance
Ready item for input (элемент готов для ввода) When-New-Item-Instance
Важно понимать, что навигационные события, такие как "Leave the Item" и "Enter the Block" возникают в ходе внутренней навигации в форме, что соотвествует переходам между объектами иерархии в.Oracle Forms.
В этом примере, чтобы переместить фокус от исходного элемента к желаемому, программа Oracle Forms сперва проверила значение в исходном элементе, затем поднялась на уровень записи и проверила все элементы записи, затем на уровень блока и т.д. пока не закончила установкой готовности ввода для желаемого элемента.
Модель, используемая Oracle Forms, гарантирует целостность данных в рамках элемента, записи, блока и формы. Для каждого из перечисленных объектов в данной модели имеется свой уровень. Как будет показанно дальше для каждого уровня определен набор тригеров, позволяющих реализовать требуемю функциональность приложения
"тригеры блоков" (block-processing triggers)
"интерфейсные" тригеры (interface event triggers)
тригеры, связанные с использованием связанных блоков (мастер-деталь, один- ко многим) (master-detail triggers)
тригеры управления сообщениями (message-handling triggers)
"навигационные" тригеры (тригеры перехода)( navigational triggers)
"тригеры запросов" (query-time triggers)
"тригеры транзакций" (transactional triggers)
"тригеры проверок" (validation triggers)
Приведем основные тригеры данной категории и их возможное использование
Пример 1 Есть табличный блок T_LUDI, содержащий список сотрудников некоторого предприятия. и в нем поле зарплата
Под этим блоком расположен другой блок BLOCK_ITOGI. В нем имеются поля - сумма по зарплате и премии для всех введенных сотрудников. Чтобы пересчитаь сумму по зарплате при удалении одной из записи достаточно ввести текст:
begin
:BLOCK_ITOGI.TOT_ZARPLATA:=:BLOCK_ITOGI.TOT_ZARPLATA-:T_LUDI.ZARPLATA;
end;
Приведем основные тригеры данной категории и их возможное использование
Пример 2 Для вычисления общих сумм по зарплате и премии с поиощью кнопки "ВЫЧИСЛИТЬ"
begin
do_key('commit_form');
select sum(T_LUDI.ZARPLATA) into :BLOCK_ITOGI.TOT_ZARPLATA from T_LUDI;
select sum(T_LUDI.PREMIA) into :BLOCK_ITOGI.TOT_PREMIApremia from T_LUDI;
end;
Приведем основные тригеры данной категории и их возможное использование
обработки возникающих ошибочных ситуаций
для замены стандартных сообщений - своими сообщениями
Пользуйтесь ERROR_CODE, ERROR_TEXT, ERROR_TYPE, DBMS_ERROR_TEXT, или DBMS_ERROR_CODE встроенными функциями для уточнения условий приведших к "ошибке" (к исключению)
В большинстве случаев On-Error тригера следует "привязать" к форме, а не к блоку или элементу. Так как "отлов" определенных ошибок может быть затруднен, когда Oracle Forms выполняет внутреннюю навигацию, такую как во время Commit процесса
Считая этот тригер очень важным, приведем пример из HELP System
В данном примере проверяется код ошибки и в случае определенных значений указаны ветки кода их обработки
DECLARE
lv_errtyp VARCHAR2(3) := ERROR_TYPE;
lv_errtxt VARCHAR2(80) := ERROR_TEXT;
/*
** Выполнение некоторых действий по обработке
*/
ELSIF (lv_errcod = 40mmm) THEN
/*
**Выполнение некоторых действий по обработке
*/
...
ELSIF (lv_errcod = 40zzz) THEN
/*
**Выполнение некоторых действий по обработке
*/
ELSE
Message(lv_errtyp||'-'||to_char(lv_errcod)||': '||lv_errtxt);
RAISE Form_Trigger_Failure;
END IF;
END;
Пример
В данном примере при определенном коде сообщения поднимается объект alert (тревога), который дает пользователю возможность продолжить работу или преостановить ее для довыполнения некой операции.
DECLARE
lv_errtype VARCHAR2(3) := MESSAGE_TYPE;
lv_errcod NUMBER := MESSAGE_CODE;
lv_errtxt VARCHAR2(80) := MESSAGE_TEXT;
IF alert_button = ALERT_BUTTON1
THEN
RAISE Form_Trigger_Failure;
.
Навигационные события возникают на различных уровнях иерархии объектов Oracle Forms (формы, блоки, записи, элементы). Навигационные тригеры можно разделить по следующим категориям: До- (Pre-), После-(Post-) и Когда-Новый-Экземпляр (When-New-Instance) тригеры.
Приведем основные тригеры данной категории и их возможное использование
назначения уникального значения ключу из последовательности (В общем случае это рекомендуется делать с помощью табличного тригера Before-Insert)
ограничения доступа к форме
инициализации глобальных переменных
позволить или не позволить доступ к блоку
установить значение переменных
установить "сложное" значение по умолчанию, базирующееся на уже введенных элементах этой же записи
записать текущее значение этого элемента в глобальную переменную для дальнейшего использования
Пример
Чтобы при нахождении курсора на поле это поле было выделено можнго использовать пару тригеров (When-New-Item-Instance,Post-Text-Item) для изменения свойства визуальных атрибутов. Соответственно, первый из них устанавливает VISUAL_ATRIBUTE например в VISUAL_WHITE_ON_RED, а второй возвращает в обычное состояние.
BEGIN
SET_ITEM_PROPERTY('T_LUDI.FAMILIA',VISUAL_ATTRIBUTE,'VISUAL_USSUAL');
END;
проверки правильности (в общем смысле) текущей записи в блоке (той, которая имела фокус ввода, когда данное событие случилось)
проверки некоторых условий и предотвращения пользователя от покидания данного блока. (На пример выполнить )
Приведем основные тригеры данной категории и их возможное использование
Пример
Данный пример из HELP System, был использован автором много раз. В нем форма заполняется данными из соответствующих таблиц. При автоматическом построении формы с помощью Forms Designer этот триггер не создается , но можно выбрать при создании панель кнопок, одна из которых "Query" выполняет тоже самое, однако из-за специфики реализации ее приходится нажимать два раза.
BEGIN
--переходим к главному блоку (в отношении мастер-деталь)
Go_Block('Glavnii_Block');
/*
** Подавляем стандартные "рабочие" сообщения
*/ :System.Suppress_Working := 'TRUE';
--непосредственно выполняем запрос
Execute_Query;
:System.Suppress_Working := 'FALSE';
Типичное использование триггеров запросов:
Pre-Query
Обрабатывает условия запроса или добавляет
дополнительные условия непосредственно перед посылкой управляющего
слова SELECT в БД.
Post-Query
Исполняется после
получения выборки, например, для поиска значений в других таблицах на
основе полученной в выборке информации. Запускается один раз для
каждой записи из выборки.
Основные тригеры данное категории :
On-Delete
Заменяет стандартный процесс управления
удаляемыми записями в Oracle Forms.
On-Insert
Заменяет
стандартный процесс управления вставляемыми записями в Oracle Forms.
On-Lock
Замена стандартной блокировки записей таблицах
БД.
On-Logon
Замена стандартных операций Oracle Forms
для соединения с ORACLE. Применяется в основном для обработки событий,
когда форме не требуется получать соединение с ORACLE, например, при
взаимодействии с таблицами иными, нежели ORACLE.
On-Logout
Замена стандартного процесса Oracle Forms при отключении от
ORACLE.
On-Update
Замена стандартного процесса Oracle
Forms , отвечающего за обновления записей в таблицах.
Post-Database-Commit
Добавление дополнительных функций
в Oracle Forms при завершении операции с БД.
Post-Delete
Проверочные транзакции при удалении записи из БД.
Post-Forms-Commit
Добавление доп. Функций в
стандартную процедуру завершения обмена в формой перед окончанием
транзакции.
Post-Insert
Проверочные транзакции при
вставка записи в БД.
Post-Update
Проверочные транзакции
при убновлении записи БД.
Pre-Commit
Производит срочные
операции до выполнения транзакций Post и Commit.
Pre-Delete
Управление записью перед ее удалением из БД стандартными
транзакциями Post и Commit; например, для защиты записей,
удовлетворяющих определенным условиям, от удаления.
Pre-Insert
Управление записью перед тем, как она будет
вставлена в БД с помощью стандартных транзакций Post и Commit.
Pre-Update
Управление записью перед тем, как будут
внесены изменения в запись с помощью стандартных транзакций Post
и Commit.
Tecon Ltd. © 2001 - 2021
All Rights Reserved.