Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Триггеры 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)События данной группы очевидны (связаны с элементами интерфейса): Событие - Имя триггера
События внутреннего выполнения (Internal Processing Events)Рассмотрим форму с двумя блоками A и B, в каждом из которых есть по текстовому полю. Для GUI платформ, пользователь может переместить фокус ввода с элемента из Блока A в элемент Блока В нажав мышкой на последний. Хотя эта операция включает только одно действие (нажатие мышки на элементе блока В) на самом деле она вызывает целый ряд событий, каждое из которых может иметь собственный триггер Рассмотрим эту последовательность событий и связанные с ними триггеры.
Важно понимать, что навигационные события, такие как "Leave the Item" и "Enter the Block" возникают в ходе внутренней навигации в форме, что соотвествует переходам между объектами иерархии в.Oracle Forms. В этом примере, чтобы переместить фокус от исходного элемента к желаемому, программа Oracle Forms сперва проверила значение в исходном элементе, затем поднялась на уровень записи и проверила все элементы записи, затем на уровень блока и т.д. пока не закончила установкой готовности ввода для желаемого элемента. Модель, используемая Oracle Forms, гарантирует целостность данных в рамках элемента, записи, блока и формы. Для каждого из перечисленных объектов в данной модели имеется свой уровень. Как будет показанно дальше для каждого уровня определен набор тригеров, позволяющих реализовать требуемю функциональность приложения Обзор категорий триггеровЭтот параграф содержит обзор наиболее часто используемых триггеров, сгруппированных по функциональным категориям
Триггеры блоков (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; 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; "Навигационные" триггеры (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 "переходит" от внешней формы к данной. Может быть использован для:
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'; 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) срабатывают непосредственно ДО или ПОСЛЕ того, как оператор или приложение запускает запрос в блоке. Типичное использование триггеров запросов:
Transactional ТриггерыТриггеры транзакций (transactional triggers) срабатывают на широком диапазоне событий, возникающих при взаимодействии форм и таблиц БД. Основные тригеры данное категории :
|
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|