Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по Базам данных » Oracle - Статьи »

Обсудить на форуме Обсудить на форуме

Триггеры ORACLE FORMS для начинающих.

Учебное пособие.

Предисловие

Данный документ содержит довольно краткое описание триггеров, используемых в Oracle Forms. Основным материалом для создание методички являлась справочная система к Developer 200 Forms Designer, книга "Oracle Энциклопедия пользователя", а также программы, написанные непосредственно автором данной работы.

Как кажется автору данного документа для выполнения стандартного задания необходимо и возможно достаточно освоить следующие триггеры: WHEN_NEW_INSTANCE_FORM, WHEN_NEW_INSTANCE_ITEM, ON_CHANGE, WHEN_VALIDATE_ITEM, POST_QUERY, ON_ERR.


Оглавление


О событиях и триггерах

Триггеры - это непосредственно куски программного кода, который вы пишите для реализации функциональности вашего приложения. Каждый тригер имеет имя и содержит один или более PL/SQL операторов. Тригер на уровне среды разработки связывается с каким-нибудь событием и выполняется при возникновении этого события.

Имена триггеров соответствуют runtime событиям, с которыми они связаны. Так например тригер "When-Button-Pressed" соответствует событию нажатия кнопки "Button Pressed", в соответсвии с этим, когда пользователь нажимает данную кнопку Oracle Forms .вызывает данный тригер и выполняет его код.

Триггер должен быть связан непосредственно с каким-нибудь объектом, таким как фориа, блок в форме или какой-либо элемент (текстовое поле, кнопка и т.д.) Например в форме с тремя кнопками каждая из них имеет When-Button-Pressed тригер и каждый из этих триггеров содержит различный PL/SQL код. Пользователь нажимает какую-то кнопку и тригер, прикрепленный к этой кнопке (When-Button-Pressed) срабатывает. Очевидно, что остальные тригера When-Button-Pressed, прикрепленные к другим кнопкам не срабатывают.

Типы событий

Oracle Forms обрабатывает определенный набор событий, каждое из которых имеет встроенный триггер (имеется ввиду там нет готового кода, но он может быть написан в этом месте). События можно разделить на группы, об основных из которых будет сказано ниже.

События интрефейса (Interface Events)

События данной группы очевидны (связаны с элементами интерфейса):

Событие - Имя триггера

  • Pressing a button(нажатие кнопки) -When-Button-Pressed
  • Clicking a check box (нажатие check-boxa)-When-CheckBox-Changed
  • Pressing the Tab key (нажатие Tab-Key) Key-NxtItem

События внутреннего выполнения (Internal Processing Events)

Рассмотрим форму с двумя блоками A и B, в каждом из которых есть по текстовому полю. Для GUI платформ, пользователь может переместить фокус ввода с элемента из Блока A в элемент Блока В нажав мышкой на последний. Хотя эта операция включает только одно действие (нажатие мышки на элементе блока В) на самом деле она вызывает целый ряд событий, каждое из которых может иметь собственный триггер Рассмотрим эту последовательность событий и связанные с ними триггеры.

  • Событие - Имя триггера
  • 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)

Триггеры блоков (Block Processing Triggers)

Тригеры блоков срабатывают при возникновении событий, связанных с управлением записями в блоках.

Приведем основные тригеры данной категории и их возможное использование

When-Create-Record ("Когда создается новая запись")

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

When-Clear-Block

Срабатывает, когда Oracle Forms удаляет все записи из текущего блока

When-Database-Record

Срабатывает, когда Oracle Forms изменяет статус записи на Insert (для новой записи) or Update (для измененной уже хранящейся). Этот статус указывает, что данная запись будет обработана следующей COMMIT_FORM операцией (т.е. будет обработана сервером) .

When-Remove-Record

Срабатывает, когда какая-нибудь запись удаляется. Может быть использовано для пересчета "итоговых сум" по блоку

Пример 1 Есть табличный блок T_LUDI, содержащий список сотрудников некоторого предприятия. и в нем поле зарплата

Под этим блоком расположен другой блок BLOCK_ITOGI. В нем имеются поля - сумма по зарплате и премии для всех введенных сотрудников. Чтобы пересчитаь сумму по зарплате при удалении одной из записи достаточно ввести текст:

список сотрудников
begin
:BLOCK_ITOGI.TOT_ZARPLATA:=:BLOCK_ITOGI.TOT_ZARPLATA-:T_LUDI.ZARPLATA;
end;

"Интерфейсные" Триггеры (Interface Event Triggers)

"Интерфейсные" триггеры срабатывают (что следует из их названия) при возникновении событий интерфейса. Некоторые из них (такие как When-Button-Pressed), срабатывают только при непосредственных действиях пользователя. Другие, как When-Window-Activated, могут быть сработать в результате как непосредственно действия пользователя (мышку поставил на этот экран) так и в результате действий программы (открыл форму командой OPEN_FORM ).

Приведем основные тригеры данной категории и их возможное использование

When-Button-Pressed

Наиболее часто используемый тригер, срабатывает когда пользователь нажимает кнопку

Пример 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;

When-CheckBox-Changed

Срабатывает, когда пользователь переключает состояние check-box-a

When-Image-Activated

Срабатывает, когда пользователь дважды нажимает на картинку (image item)

When-Image-Pressed

Срабатывает, когда пользователь нажимает на картинку (image item)

Key- [all]

Заменяет действия связанные с данными "функциональными" клавишами. Например вы можете написать тригер Key-EXIT , чтобы заменить стандартный выход.

When-Radio-Changed

Срабатывает, когда пользователь изменяет текущую "выбранную" кнопку в радио-группе.

When-Timer-Expired

Срабатывает, когда время программного таймеа истекает Используйте тригер When-Timer-Expired для обновления значений каких-либо элементов или выполнения любых других заданий, которые должны случиться через определенный промежуток времени

When-Window-Activated

Срабатывает, когда пользователь или приложение активизирует окно. Может быть использован для получения в программе начальных значений свойств окна с помощью встроенной функции GET_WINDOW_PROPERTY, а также для автоматической установки фокуса на определенный элемент взависимости от ситуации.

When-Window-Closed

Срабатывает, когда пользователь закрывает окно с помощью Close команды.

When-Window-Deactivated

Срабатывает, когда окно становится неактивным например в результате активизации другого окна

When-Window-Resized

Срабатывает, когда окно изменяется в размерах пользователем или программно (например с помощью RESIZE_WINDOW or SET_WINDOW_PROPERTY.)

Мастер-деталь

Триггеры (Master-Detail Triggers )Oracle Forms генерирует мастер-деталь триггеры автоматически, когда вы определяете связь между блоками. Сгенерированные тригеры обеспечивают координацию между записямт в главном(мастер) блоке и в подчиненном (деталь) блоке. Это выражается например, что при переходе на запись в главном блоке, автоматически в подчиненном появляются записи, связанные с выбранной в главном. Если вы не хотите создать свою специальную систему связи, то вам нет необходимости, что-нибудь менять в сгенерированном коде.

Приведем основные тригеры данной категории и их возможное использование

On-Check-Delete-Master

Срабатывает, когда Oracle Forms пытается стереть в главном(мастер) блоке

On-Clear-Details

Срабатывает, когда Oracle Forms требуется удалить записи из подчиненного блока так как в главном связанной записи больше нет (после удаления ее оттуда)

On-Populate-Details Fires

Срабатывает, когда Oracle Forms требуется синхронизировать содержимое подчиненного блока с активной записью в главном блоке

Тригеры управления сообщениями (Message-Handling Triggers)

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

On-Error

Срабатывает, когда Oracle Forms "собирается" выдать сообщение об ошибке.Данный тригер рекомендуется использовать для

  • обработки возникающих ошибочных ситуаций
  • для замены стандартных сообщений - своими сообщениями

Пользуйтесь ERROR_CODE, ERROR_TEXT, ERROR_TYPE, DBMS_ERROR_TEXT, или DBMS_ERROR_CODE встроенными функциями для уточнения условий приведших к "ошибке" (к исключению)

В большинстве случаев On-Error тригера следует "привязать" к форме, а не к блоку или элементу. Так как "отлов" определенных ошибок может быть затруднен, когда Oracle Forms выполняет внутреннюю навигацию, такую как во время Commit процесса

Считая этот тригер очень важным, приведем пример из HELP System

В данном примере проверяется код ошибки и в случае определенных значений указаны ветки кода их обработки

DECLARE
  lv_errcod NUMBER := ERROR_CODE;
  lv_errtyp VARCHAR2(3) := ERROR_TYPE;
  lv_errtxt VARCHAR2(80) := ERROR_TEXT;
    BEGIN IF (lv_errcod = 40nnn) THEN /* ** Выполнение некоторых действий по обработке */ 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;

    On-Message

    Ловит сообщения. Может быть использовано для замены стандартного своим. Чтобы определить данное сообщение об ошибке или информационное пользуйтесь Oracle Forms Codes (MESSAGE_CODE, MESSAGE_TEXT, MESSAGE_TYPE, DBMS_MESSAGE_CODE, or DBMS_MESSAGE_TEXT ).

    Пример

    В данном примере при определенном коде сообщения поднимается объект alert (тревога), который дает пользователю возможность продолжить работу или преостановить ее для довыполнения некой операции.

    DECLARE
      alert_button NUMBER;
      lv_errtype VARCHAR2(3) := MESSAGE_TYPE;
      lv_errcod NUMBER := MESSAGE_CODE;
      lv_errtxt VARCHAR2(80) := MESSAGE_TEXT;
      BEGIN IF lv_errcod = 40350 THEN alert_button := Show_Alert('continue_alert'); IF alert_button = ALERT_BUTTON1 THEN ... ELSE ... END IF; ELSE Message(lv_errtyp||'-'||to_char(lv_errcod)||': '||lv_errtxt); RAISE Form_Trigger_Failure; END IF; END;

      "Навигационные" триггеры (Navigational Triggers)

      Навигационные тригеры или тригеры "перехода" срабатывают в ответ на соответcтсвующие одноименные события. На пример, когда пользователь нажимает мышкой на текстовой элемент в другом блоке возникает последовательность навигационных событий, в результате кторых фокус ввода от текущего элемента переходит к только что выбранному.

      Навигационные события возникают на различных уровнях иерархии объектов Oracle Forms (формы, блоки, записи, элементы). Навигационные тригеры можно разделить по следующим категориям: До- (Pre-), После-(Post-) и Когда-Новый-Экземпляр (When-New-Instance) тригеры.

      Pre- and Post- триггеры

      Pre- и Post- тригеры срабатывают, когда Oracle Forms осуществляет внутренние переходы между различными уровнями объектной иерархии Эти тригеры отрабатываются в ответ на действия пользователя, такие как нажатие кнопки [Next Item] (Следующий элемент), а также при внутренних переходах , когда Oracle Forms выполняет некоторые стандартные действия.

      Приведем основные тригеры данной категории и их возможное использование

      Pre-Form

      Выполняется перед тем, как Oracle Forms "переходит" от внешней формы к данной. Может быть использован для:

      • назначения уникального значения ключу из последовательности (В общем случае это рекомендуется делать с помощью табличного тригера Before-Insert)
      • ограничения доступа к форме
      • инициализации глобальных переменных

      Pre-Block

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

      • позволить или не позволить доступ к блоку
      • установить значение переменных

      Pre-Text-Item

      срабатывает перед тем, как Oracle Forms переходит с уровня записи на уровень элемента (а также при переходе от одного элемента к другому в рамках той же записи). Возможное его использование :

      • установить "сложное" значение по умолчанию, базирующееся на уже введенных элементах этой же записи
      • записать текущее значение этого элемента в глобальную переменную для дальнейшего использования

      Post-Text-Item

      Срабатывает перед тем как Оracle Forms снимет фокус ввода с этого элемента. Можно использовать этот тригер для вычисления или изменения значений элемента. Помимо этого удобно использовать этот тригер для изменения визуальных атрибутов элемента (таких как фон и цвет текста).

      Пример

      Чтобы при нахождении курсора на поле это поле было выделено можнго использовать пару тригеров (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;
      

      Post-Record

      Срабатывает, когда Oracle Forms "оставляет" запись. Это происходит когда фокус ввода уходит с данной записи например к другой записи. При переходе к элементу вне данного блока управление переходит к тригерам уровня блока. Может быть использован для установки свойства visual attribute для активной записи, также как это было описано выше для одного элемента

      Post-Block

      Срабатывает, когда Oracle Forms "оставляет" блок и переходит на уровень формы.Может быть использован для

      • проверки правильности (в общем смысле) текущей записи в блоке (той, которая имела фокус ввода, когда данное событие случилось)
      • проверки некоторых условий и предотвращения пользователя от покидания данного блока. (На пример выполнить )

      Post-Form

      Срабатывает перед тем, как Oracle Forms переходит к другой форме.

      When-New-Instance-Триггеры

      When-New-Instance тнриггеры срабатывают после последовательности переходов по иерархии объектов Oracle Forms, результатом которой, является перемещение фокуса ввода к данному элементу. На самом деле этот тригер выполняется, когда фокус уже установлен и форма готова к вводу пользователя. В отличии от триггеров Pre- и Post- тригеры When-New-Instance не срабатывают при внутренних навигационных событиях.

      Приведем основные тригеры данной категории и их возможное использование

      When-New-Form-Instance

      Выполняется при запуске формы , после выполнения всех навигационных переходов. Может быть использован для загрузки данных в форму, а также для установки глобальных переменных.

      Пример

      Данный пример из HELP System, был использован автором много раз. В нем форма заполняется данными из соответствующих таблиц. При автоматическом построении формы с помощью Forms Designer этот триггер не создается , но можно выбрать при создании панель кнопок, одна из которых "Query" выполняет тоже самое, однако из-за специфики реализации ее приходится нажимать два раза.

      BEGIN
        Setup_My_Global_Variables;
        --переходим к главному блоку (в отношении мастер-деталь)
        Go_Block('Glavnii_Block');
        /*
        ** Подавляем стандартные "рабочие" сообщения
        */ :System.Suppress_Working := 'TRUE';
        --непосредственно выполняем запрос
        Execute_Query;
        :System.Suppress_Working := 'FALSE';
        END;

        When-New-Block-Instance

        Срабатывает сразу после того, как фокус ввода переходит от элемента из одного блока к элементу из другого. Это происходит уже тогда, когда Oracle Forms готов принимать вводимые пользователем данные, тоесть уже после "последовательности навигационных событий."

        When-New-Record-Instance

        Выполняется после перехода фокуса от элемента из одной записи к элементу в другой записив Это происходит уже тогда, когда Oracle Forms готов принимать вводимые пользователем данные, тоесть уже после "последовательности навигационных событий . Если новая запись находится в другом блоке по отношению к предыдущей, тогда данный триггер вызывается после When-New-Block-Instance, но перед When-New-Item-Instance триггером.

        When-New-Item-Instance

        Выполняется после перехода фокуса к данному элементу. Это происходит , когда Oracle Forms готов принимать вводимые пользователем данные, то есть уже после "последовательности навигационных событий Как было сказано выше этот тригер можно использовать для изменения визуальных атрибутов элемента при получении им фокуса ввода.

        Query-Time Триггеры

        Триггеры запросов (query-time triggers) срабатывают непосредственно ДО или ПОСЛЕ того, как оператор или приложение запускает запрос в блоке.

        Типичное использование триггеров запросов:

        • Pre-Query - Обрабатывает условия запроса или добавляет дополнительные условия непосредственно перед посылкой управляющего слова SELECT в БД.
        • Post-Query - Исполняется после получения выборки, например, для поиска значений в других таблицах на основе полученной в выборке информации. Запускается один раз для каждой записи из выборки.

        Transactional Триггеры

        Триггеры транзакций (transactional triggers) срабатывают на широком диапазоне событий, возникающих при взаимодействии форм и таблиц БД.

        Основные тригеры данное категории :

        • 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.

        Может пригодится:


        Автор: Илья Фейгин
        Прочитано: 19467
        Рейтинг:
        Оценить: 1 2 3 4 5

        Комментарии: (2)

        Прислал: Shooter
        1

        Прислал: alen
        Zahopl'uju4e! :-)

        Добавить комментарий
        Ваше имя*:
        Ваш email:
        URL Вашего сайта:
        Ваш комментарий*:
        Код безопастности*:

        Рассылка новостей
        Рейтинги
        © 2007, Программирование Исходники.Ру