Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

СУБД Oracle для разработчиков. Forms and Reports 6i-10g


Здравствуйте уважаемые подписчики! Благодарю вас за письма и вопросы, которые вы мне присылаете.

 

Проектирование, этапы построения и модификация форм

 

Сергеенко С.В.

 

Это довольно большой раздел, поэтому разобьем его на несколько этапов:

 

·         Триггеры. Виды и назначения триггеров

·         Блоки и элементы. Виды

·         Операции с блоками и элементами

·         Конструирование форм для запросов

                                            

Триггеры

 

Триггеры – это программный код, который вы функционально связываете с каким либо событием вашего приложения. Каждый триггер имеет имя, соответствующее событию на которое он определен, либо если это пользовательский триггер то имя, которое ему назначил пользователь. Код триггера может содержать как SQL так и  PL/SQL операторы. Уже из самого определения триггера становится ясным, что триггер на уровне среды разработки связан с каким-нибудь событием и выполняется при возникновении этого события. Так, например триггер "When-New-Record-Instance" соответствует событию “когда пользователь переходит на новую запись”, в соответствии с этим, когда пользователь попадает в новую запись Forms, вызывает данный триггер, исполняя его код.

Также важно помнить, что нельзя создать пустой триггер, т.к. он обязательно должен содержать какой-либо код и отсутствие такого вызовет ошибку компиляции, поэтому, в случае даже если вам и необходимо наличие такого триггера, то тогда вам достаточно в теле триггера написать “NULL;”

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

 

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

 

·   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

 

Приоритеты 

 

Здесь имеется ввиду приоритет срабатывания триггеров, который идет в обратном порядке. То есть если мы рассматриваем такие понятия как:

1.Триггер уровня формы

2.Триггер уровня блока

3.Триггер уровня записи

То приоритет срабатывания следует рассматривать как «от 3-го к 1-му».

 Примечание: Очень важно не запутаться в понятиях “триггеры” Forms, с триггерами которые вы создаете сами, для таблиц(create or replace trigger tr_1 ....), т.к. триггер, для таблицы, созданный вами будет  реагировать на  идентичные события Forms, к примеру у вас есть триггер T1, который реагирует на вставку в таблицу, изменяя при этом значение другой таблицы. Если мы введем в форму новую запись, то триггер отработает и изменить запись в другой таблицы. А триггер Forms вы не вызовите, к примеру, из SQL*Plus. Но я думаю это и так понятно из вышеупомянутого определения о “триггере” Forms. Триггер может вызвать другой триггер.

 

Виды триггеров:

 

Обзор категорий триггеров

 

Данный раздел дает обзор общеиспользуемых триггеров, сгруппированных в следующие функциональные категории:

 

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

 

·         триггеры событий интерфейса -  триггеры срабатывают при возникновении событий интерфейса, таких как нажатие кнопки, переключение радио-кнопки, открытие другой формы и т.д.

 

·         триггеры главный-подчиненный - обеспечивают координацию между записями в главном (мастер) блоке и в подчиненном (деталь) блоке. Forms автоматически  генерирует мастер-деталь триггеры, когда вы определяете связь между блоками. Связи, как будет показано далее, вы можете определить с помощью Wizard при создании блока либо уже в режиме разработки.

 

·         триггеры обращения с сообщениями – триггеры срабатывающие в ответ на генерируемые Formsoм информационные сообщения или сообщения об ошибках.

 

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

 

·         триггеры периода запроса - Триггеры запросов (query-time triggers) срабатывают непосредственно до (PRE) или после (POST) того, как оператор или приложение запускает запрос в блоке.

 

·         транзакционные триггеры - срабатывают на широком диапазоне событий, возникающих при взаимодействии форм и таблиц БД, сюда относятся как DML, так и DDL операции.

 

 

 

Описание триггеров

 

В данном разделе я вам приведу описание из стандартной документации. Можно было бы и опустить это описание так как в Интернете достаточно много статей на русском по этой теме.

 

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

 

 

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

Триггер

 

Типичное использование

 

When-Create-Record

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

When-Clear-Block

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

When-Database-Record

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

When-Remove-Record

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

 

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

 

 

Триггеры событий интерфейса срабатывают в ответ на события, происходящие в интерфейсе формы. Некоторые из этих триггеров, такие как When-Button-Pressed, срабатывают только в ответ на ввод или манипуляцию оператора. Другие, такие как When-Window-Activated, могут срабатывать в ответ и на ввод оператора, и на программное управление.

Триггер

 

Типичное использование

 

When-Button-Pressed

Инициируйте какое-то действие, когда оператор выберает кнопку или с помощью мыши, или посредством клавиатуры.

When-CheckBox-Changed

Инициируйте какое-то действие, когда оператор переключает состояние переключателя или с помощью мыши, или посредством клавиатуры.

When-Image-Activated

Инициируйте какое-то действие всякий раз, когда оператор дважды щелкает по элементу изображения.

When-Image-Pressed

Инициируйте какое-то действие всякий раз, когда оператор щелкает по элементу изображения.

Key-[all]

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

When-Radio-Changed

Инициируйте какое-то действие, когда оператор изменяет текущую выбранную радио-кнопку в элементе радио-группы.

When-Timer-Expired

Инициируйте какое-то действие, когда истечет программный таймер.

 

Триггер

 

Типичное использование

 

When-Window-Activated

Инициируйте какое-то действие всякий раз, когда оператор или прикладная программа активизирует окно.

When-Window-Closed

Инициируйте какое-то действие всякий раз, когда оператор закрывает окно с помощью команды менеджера окна Close.

When-Window-Deactivated

Инициируйте какое-то действие всякий раз, когда окно становится неактивным в результате активизации другого окна.

When-Window-Resized

Инициируйте какое-то действие всякий раз, когда окно изменяет размеры, или действиями оператора, или программно.

`

 

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

 

 

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

Триггер

 

Типичное использование

 

On-Chek-Delete-Master

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

On-Clear-Details

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

On-Populate-Details

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

 

Триггеры обращения с сообщениями

 

 

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

Триггер

 

Типичное использование

 

On-Error

Заменяйте сообщение об ошибке по умолчанию своим сообщением об ошибке, или улавливайте и производите исправление ошибки.

On-Message

Для улавливания и ответа на сообщение; например, для замены сообщения по умолчанию, издаваемого Oracle Forms, на свое сообщение.

Чтобы узнать, какие сообщения Runform определены как ошибки и какие как информационные, обратитесь к Oracle Forms Messages and Codes.

 

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

 

 

Навигационные триггеры срабатывают в ответ на навигационные события. Например, если оператор щелкает по элементу текста в другом блоке, навигационные события происходят при перемещении Oracle Forms фокуса ввода от текущего элемента к целевому элементу.

Навигационные события происходят на различных уровнях иерархии объектов Oracle Forms (Форма, Блок, Запись, Элемент). Навигационные триггеры можно далее подразделить на две категории: Pre- и Post-триггеры и триггеры When-New-Instance.

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

Триггер

 

Типичное использование

 

Pre-Form

Выполняйте какое-то действие прямо перед тем, как Oracle Forms перейдет к форме из “извне” формы, такого как при старте формы.

Pre-Block

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

Pre-Block (ошибка??)

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

Pre-Text-Item

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

Post-Text-Item

Манипулируйте элементом во время покидания Oracle Forms элемента текста и перемещения на уровень записи.

Post-Record

Манипулируйте записью во время выхода Oracle Forms из записи и перехода на уровень блока.

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

Выполняйте какое-то действие при старте формы.

When-New-Block-Instance

Выполняйте какое-то действие сразу после того, как фокус ввода переместится в блок иной, чем тот блок, на котором фокус ввода был перед этим.

When-New-Record-Instance

Выполняйте какое-то действие сразу после того, как фокус ввода переместится к элементу в другой записи. Если новая запись находится в другом блоке, то срабатывает после триггера When-New-Block-Instance, но до триггера When-New-Item-Instance.

When-New-Item-Instance

Выполняйте какое-то действие сразу после того, как фокус ввода переместится к другому элементу. Если новый элемент находится в другом блоке, то срабатывает после триггера When-New-Block-Instance.

 

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

 

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

Триггер

 

Типичное использование

 

Pre-Query

Проверяйте допустимость критерия запроса или предоставляйте программно дополнительный критерий запроса, прямо перед тем, как послать базе данных оператор SELECT.

Post-Query

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

 

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

 

 

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

Триггер

 

Типичное использование

 

On-Delete

Заменяйте обработку Oracle Forms по умолчанию обращением с удаленными записями во время посылки транзакции.

On-Insert

Заменяйте обработку Oracle Forms по умолчанию обращением со вставленными записями во время посылки транзакции.

On-Lock

Заменяйте обработку Oracle Forms по умолчанию для блокировки строк в базе данных.

On-Logon

Заменяйте обработку Oracle Forms по умолчанию для подсоединения к ORACLE, особенно для формы, не требующей подсоединения к базе данных, или для подсоединения к не-ORACLE источнику данных.

 

Триггер

 

Типичное использование

 

On-Logout

Заменяйте обработку Oracle Forms по умолчанию для выхода из ORACLE.

On-Update

Заменяйте обработку Oracle Forms по умолчанию обращением с обновленными записями во время посылки транзакции.

Post-Database-Commit

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

Post-Delete

Проверяйте транзакции после удаления строки из базы данных.

Post-Forms-Commit

Наращивайте оператор фиксации Oracle Forms по умолчанию перед фиксацией транзакции.

Post-Insert

Проверяйте транзакции после вставки строки в базу данных.

Post-Update

Проверяйте транзакции после обновления строки в базе данных.

Pre-Commit

Выполняйте какое-то действие прямо перед процессом Post и Commit Transactions, когда Oracle Forms определяет, что в форме есть изменения для посылки или фиксации.

Pre-Delete

Манипулируйте записью до ее удаления из базы данных во время процесса Post и Commit Transactions по умолчанию; например, для предотвращения удаления записи, если существуют определенные условия.

Pre-Insert

Манипулируйте записью до вставки ее в базу данных во время процесса Post и Commit Transactions по умолчанию.

Pre-Update

Проверяйте допустимость или модифицируйте запись перед обновлением ее в базе данных во время процесса Post и Commit Transactions по умолчанию.

 

Примечание: Это только частичный список доступных транзакционных триггеров. Многие из триггеров, здесь не показанных, являются триггерами On-Event, существующими прежде всего для тех прикладных программ, которые сталкиваются с не-ORACLE источником данных.

 

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

 

 

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

Триггер

 

Типичное использование

 

When-Validate-Item

Наращивайте проверку допустимости для элемента, имеющуюся по умолчанию.

When-Validate-Record

Наращивайте проверку допустимости для записи, имеющуюся по умолчанию.

 

Триггеры When-Event   When-event сигнализирует о точке, в которой вы можете нарастить обработку Oracle Forms по умолчанию дополнительными задачами или операциями. Например, триггер When-Validate-Item срабатывает сразу после того, как Oracle Forms произведет в элементе проверку допустимости данных.

Вы можете нарастить проверки допустимости по умолчанию, которые выполняет Oracle Forms, написанием программы дополнительной проверки в триггере When-Validate-Item. Большинство триггеров When-event могут включать вызовы ограниченных встроенных подпрограмм, описываемых далее в данной главе.

Триггеры On-Event   On-еvent сигнализирует о точке, в которой вы можете заменить обработку Oracle Forms по умолчанию. Например, триггер On-Logon срабатывает когда Oracle Forms готовится войти в ORACLE. Если ваша прикладная программа потребовала подсоединения к не-ORACLE источнику данных, то для передачи соответствующих параметров вхождения в не-ORACLE источник данных вы можете написать триггер On-Logon, полностью заменяя вхождение в ORACLE по умолчанию. Триггеры On-event могут включать в себя вызовы неограниченных встроенных подпрограмм.

Триггеры Pre-Event   Pre-event сигнализирует о точке прямо перед событием или When-event, или On-еvent. Для этих событий вы можете написать триггеры, которые подготавливают объекты или данные к наступающему событию. Триггеры Pre-event могут включать вызовы неограниченных встроенных подпрограмм.

Триггеры Key   Триггеры Key имеют однозначное отношение с определенными клавишами. То есть, этот триггер срабатывает когда оператор нажимает определенную клавишу или последовательность клавиш.

 

Помните, что большинство программ GUI предлагают операторам для выполнения команд более одного способа. Например, оператор может иметь возможность выполнить запрос щелчком кнопки, выбором команды меню или нажатием клавиши [Execute Query].

В таких ситуациях было бы ошибкой поместить всю логику вашей прикладной программы в клавишный триггер, который может никогда не сработать. Подобно этому, в любой прикладной программе с управлением мышью вы не можете полностью полагаться на клавишные триггеры для навигационных клавиш вроде {Next Item] и [Next Block]. Так как навигация может производиться операторами с помощью мыши, они могут избрать не пользоваться для навигации этими клавишами, и ассоциированные триггеры не сработают.

 

 

 

 

 

 

Forms на практике

 

Я бы хотел добавить в рассылку такой раздел, в котором я демонстрировал бы вам «куски» часто используемого в повседневной практике кода, а также ответы на интересующие вас вопросы, которые вы мне присылаете. Для кого-то может эти примеры покажется примитивными и не нужными, а кому-то и помогут, поэтому примеры буду давать абсолютно разные.

Как получить текущие настройки приложения, информацию о приложении:

 

Пример:

 

Рассмотрим пример получения информации о соединении:

 

Функция get_application_property возвращает значение типа varchar2, поэтому эту информацию можно получить следующим образом:

 

  

 

declare

 

      c_t varchar2(10)

 

   begin

 

       c_t:=get_application_property(CONNECT_STRING)

 

     select c_t into :block_name.item_name from Dual;

 

 end;

 

Остальные параметры функции и их значения:

 

 

APPLICATION_INSTANCE -получить значение указателя на ссылку экземпляра

 

BUILTIN_DATE_FORMAT -возвращает текущее значение формата даты Builtin

 

CALLING_FORM – возвращает имя текущей формы

 

CONNECT_STRING – возвращает строку подключения к БД

 

CURRENT_FORM – возвращает имя файла .FMX, текущей формы

 

CURRENT_FORM_NAME – возвращает имя текущей формы, указанное в поле Name

 

CURSOR_STYLE – возвращает style property текущей формы, опции: BUSY, CROSSHAIR, DEFAULT, HELP, and INSERTION

 

DATE_FORMAT_COMPATIBILITY_MODE-возвращает compatibility установки для этого свойства

 

DISPLAY_HEIGHT -возвращает высоту дисплея, в координатной системе модуля формы

 

DISPLAY_WIDTH -возвращает ширину дисплея, в координатной системе модуля формы

 

FLAG_USER_VALUE_TOO_LONG – возвращает текущее значение свойства ...если True or False, которые управляются транзакцией пользователя (возвращает True или False )

 

OPERATING_SYSTEM – возвращает имя текущей операционной системы

 

PASSWORD – возвращает пароль текущего оператора

 

PLSQL_DATE_FORMAT – возвращает маску формата даты PL/SQL

 

SAVEPOINT_NAME – возвращает имя последней точки сохранения

 

TIMER_NAME -возвращает время 'most recently expired timer'

 

USER_INTERFACE – возвращает имя интерфейса пользователя

 

USER_NLS_CHARACTER_SET – символьные характеристики пользовательского NLS

 

USER_NLS_LANG – возвращает полное текущее значение переменной окружения user_nls

 

USER_NLS_LANGUAGE – название языка в user_nls

 

USER_NLS_TERRITORY – название территории в user_nls

 

USERNAME – возвращает логин текущего пользователя Forms'a

 

 

Ну и, соответственно обратная ей функция – это функция установки параметров: set_application_property.

Как перейти к какому либо элементу?

 

Go_Item('block_name.item_name');

 

 

Как возвратить элемент из состояния invalid в valid, тоесть активизировать  его?

 

Set_item_property(name_in(‘system.current_item’),item_is_valid,property_true);

 

 

Как выбрать атрибут текущей записи?

 

Display_Item(‘item_name’,visual_attribute);

 

 

Как перерисовать окно?

 

Resize_Window (window_name, width, height);

 

 

Как закрыть окно?

 

Hide_Window(window_name);

 

 

Как можно программно замещать текущий вид заполнения окна?

 

Следующий пример замещает текущий вид заполнения окна видом заполнения с именем canvas1:

Replace_Content_View(‘window5’,’canvas1’);

 

 

Для программной прокрутки окна используйте процедуру SCROLL_VIEW. Следующий пример прокручивает вид-картинку заполнения окна горизонтально по координатам х,у соответственно 14 и 0:

   Scroll_View(‘my_content_view’,14,0);

 

Вы можете также программно прокручивать, устанавливая свойство Х или Y Position on                                                   Canvas с помощью процедуры SET_VIEW_PROPERTY:

Scroll_View_Property (‘my_content_view’,X_POS_ON_CANVAS,14);

 

Почему сообщение не появляется на экране?

 

message('...'); synchronize;

 

Примечание: также проверяйте свойство формы Console_Window, чтоб значение этого свойства было равно «ОКНО»

 

Можно ли .FMX запустить на другой платформе?

 

Нет, нельзя. Можно только .fmb. Для создания .fmx на другой платформе необходимо перекомпилировать форму.

 

Я надеюсь, вам понравится такая рубрика.

По вопросам и предложениям пишите на sqaimes@mail.ru


В избранное