|
|
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
Пишу документ для себя. Может кому пригодиться. Или кто-то захочет дополнить/изменить. Документ регламентирует написание текста триггеров в Oracle Developer 1 Проверка вводимых значений Осуществляется в обработчиках для событий WHEN-VALIDATE-ITEM, WHEN-VALIDATE-RECORD. 2 Инициализация локальных переменных Блок локальных переменных формы должен называться VARS. Инициализация его item-ов осуществляется в обработчике события PRE-FORM (а не WHEN-NEW-FORM-INSTANCE т.к WHEN-NEW-FORM-INSTANCE срабатывает после WHEN-CREATE-RECORD). Надо не забывать, что блок локальных переменные формы очищается по ключу Shift+F т.е его надо переинициализировать после этого. 3 Установка значений по умолчанию WHEN-CREATE-RECORD 4 Установления свойств для item PRE-RECORD 5 Установление свойст для field Post-query 6 Начитывание связных значений Для базовых WHEN-VALIDATE-ITEM Для небазовых POST-CHANGE Для неотображаемых элементов POST-CHANGE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2003, 18:35 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
Пара замечаний и советов: > 2 Инициализация локальных переменных > Блок локальных переменных формы должен называться VARS. иногда можно завести пакет и там хранить свои локальные переменные, но не всегда удобно. > Инициализация > его item-ов осуществляется в обработчике события PRE-FORM (а не > WHEN-NEW-FORM-INSTANCE т.к WHEN-NEW-FORM-INSTANCE срабатывает > после WHEN-CREATE-RECORD). А в моем понимании все работает так: PRE-FORM -> WHEN-NEW-FORM-INSTANCE -> /* Go_Block(First Navigation Block или user_speciefied_block) */ WHEN-NEW-BLOCK-INSTANCE -> WHEN-NEW-RECORD-INSTANCE -> WHEN-NEW-ITEM-INSTANCE > Надо не забывать, что блок локальных переменные формы очищается по > ключу Shift+F т.е его надо переинициализировать после этого. если имеется ввиду очистка, формы, то стандартный кдюч Shift+F7, а чтобы запретить эту возможность для пользователя в триггере уровня формы KEY-CLRFRM надо прописать NULL; или можно заводить переменные в пакете. > 3 Установка значений по умолчанию > WHEN-CREATE-RECORD если значения по умолчанию (то есть статус записи NEW), то все-таки WHEN-NEW-RECORD-INSTANCE при этом твоя запись уже не будет NEW, хотя смотри комент к 4. > 4 Установления свойств для item > PRE-RECORD у элементов для этого есть свойство Initial Value, и твоя запись останется NEW. > 5 Установление свойст для field > Post-query в Post-query обычно выбирается значение небазового видимого поля (текст, описания) для базового невидимого поля (идентификатор, абрревиатура ...) или производятся какие либо преобразования или вычисления. > 6 Начитывание связных значений > Для базовых > WHEN-VALIDATE-ITEM > Для небазовых > POST-CHANGE > Для неотображаемых элементов > POST-CHANGE что ты здесь хотел сказать, без бутылки не разберешь, но не растраивайся Forms-ы достаточно своеобразная штука, так что все зависит в большинстве только от опыта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2003, 19:09 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
мои сорри, в некоторых местах не понял, >> 3 Установка значений по умолчанию >> WHEN-CREATE-RECORD > если значения по умолчанию (то есть статус записи NEW), то все-таки > WHEN-NEW-RECORD-INSTANCE при этом твоя запись уже не будет NEW, хотя > смотри комент к 4. Как я думаю, значения по-умолчанию могут быть разными: - начальными (для новой записи, обычно видимые поля), то это свойство Initial Value или триггер WHEN-NEW-RECORD-INSTANCE . - значения полей блока, невидимые, но заносимый в базу данных при вставке данных или при обновлении записи, то это обычно триггеры PRE-INSERT или PRE-UPDATE. Если же поле видимо, но недоступно для редактирования пользователям, то здесь либо-либо в зависимости от цели. >> 4 Установления свойств для item >> PRE-RECORD > у элементов для этого есть свойство Initial Value, и твоя запись останется > NEW. Обычно триггерами PRE-RECORD, PRE-ITEM, PRE-BLOCK пользоваться не рекомендую, из-за сложностей с обработкой ошибок (незаконченная навигация) >> 6 Начитывание связных значений >> Для базовых >> WHEN-VALIDATE-ITEM >> Для небазовых >> POST-CHANGE >> Для неотображаемых элементов >> POST-CHANGE > что ты здесь хотел сказать, без бутылки не разберешь, но не растраивайся > Forms-ы достаточно своеобразная штука, так что все зависит в большинстве > только от опыта допер, в принципе правильно, но непонятно для чего (привел бы пример) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2003, 19:41 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
Проверил (Oracle Developer 6i). Написал Messag в триггерах. На экран мессаги шли в таком порядке. Pre-Form When-Create-Record When-New-Form-Unstance. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2003, 20:18 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
Да, что-то на меня нашло вчера. Программная нестандартная инициализация полей записи действительно осуществляется в When-Create-Record, а в When-New-Record-Instance я обычно разрешаю запрещаю различные элементы в зависимости от значений определенных полей и другие вещи подобного рода. (спутал прямой угол с температурой кипения воды :)). Ну и по поводу срабатывания триггеров, ты прав, то есть : Pre-Form -> When-Create-Block (для всех блоков формы) -> When-New-Form-Instance (посмотрел я и действительно - удивительно, удивительно :)) Об этом написано и в Default Processing -> Initialization: /* Form Builder initializes a form by creating a null record in each block of the form. Each item of a null record is null. Form builder replaces the null record with an initialized record the first time it enters the block. At that time it gives initial values to some items. An item's Initial Value property specifies the item's initial value. */ Но все равно, переменный лучше инициализировать в When-New-Form-Instance (догадайся с 3 раз почему :)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2003, 11:18 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
Не могу догодаться ) Вчера правили такую ошибку: ПРи вызове формы LOV счетов не начитываеться. Как было. Мне понадобаилось вызывать некую форму. Попросил чтобы в ней сделали параметр ( счет по умолчанию). Параметр передал. Форма поднялась. Счет подставился. LOV Пустые. Оказалось. В When-Create-Record было :BLOCK1.ITEM1 := VARS.ITEM1; Далеев Record_Group в запросе select .. from .. where item1 = :BLOCK1.ITEM1 а на моент When-Create-Record в VARS.ITEM1 был null Т.к он просто еще не проинициализировался так как инициализировался он в WHEN-NEW-FORM-INSTANCE . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2003, 11:54 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
> Не могу догодаться ) Первоначальное срабатывание When-Create-Record обусловлено созданием начальных нулевых записей в каждом блоке: /* Form Builder initializes a form by creating a null record in each block of the form. Each item of a null record is null. */ Причем этот триггер после создания формы будет срабатывать по одному разу для каждого блока или же, если он определен на уровне формы то = кол-ву блоков в форме. Поэтому это не самый хороший вариант. Основное назначение этого триггера - выполнение каких-либо действий при попытке создания новой записи пользователем в блоке: /* Use a When-Create-Record trigger to perform an action every time Form Builder attempts to create a new record. */ Если же ты дошел до тригегера When-New-Form-Instance, то ты приконнектился, инициализировал все свои блоки нулевыми записями и готов к инициализации блоков (управляющего - control - vars) ненулевыми значениями. Этот триггер должен обязательно срабатывать при первом запуске формы. Если у тебя приложение многоформное (то есть светится несколько форм одновременно), то триггер When-New-Form-Instance может в некоторых случаях не сработать (но уже форма светится): /* In a multiple-form application, this trigger does not fire when focus changes from one form to another. */ В триггере Pre-Form сами Forms рекомендуют проводить инициализацию глобальных переменных (:GLOBAL.var_name) /* Use a Pre-Form trigger to perform the following tasks: assign unique primary key from sequence restrict access to a form initialize global variables */ То есть ты занимался шаманством - применением вещи для целей, которым она не предназначена. > ПРи вызове формы LOV счетов не начитываеться. > Как было. Мне понадобаилось вызывать некую форму. Попросил чтобы в ней сделали > параметр ( счет по умолчанию). Параметр передал. Форма поднялась. > Счет подставился. LOV Пустые. > Оказалось. > В When-Create-Record было > :BLOCK1.ITEM1 := VARS.ITEM1; :BLOCK1.ITEM1 := :VARS.ITEM1; > Далее в Record_Group в запросе > select .. from .. where item1 = :BLOCK1.ITEM1 > а на моент When-Create-Record в VARS.ITEM1 был null Т.к он просто еще не > проинициализировался так как инициализировался он в WHEN-NEW-FORM-INSTANCE. 1 вариант Убей этот свой триггер When-Create-Record. Для элемента BLOCK1.ITEM1 установи свойство Initial Value = :VARS.ITEM1; Предполагается, что 'VARS.ITEM1' проинициализирован в WHEN-NEW-FORM-INSTANCE каким-либо способом. 2 вариант Если счет у тебя не зависит от номера записи, то просто перепиши запрос на группу записей: select .. from .. where item1 = :VARS.ITEM1 и убери вообще 'BLOCK1.ITEM1' 3 вариант если ты счет передаешь как параметр, то он у тебя должен быть в блоке PARAMETER. соответственно нет смысла и в 'VARS.ITEM1' перепиши запрос select .. from .. where item1 = :PARAMETER.COUNT_NUMBER Дальше сам. Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2003, 12:42 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
все самое последнее, предложенный вариант 1 работать тоже не будет. Твоя проблема в том, что ты входишь в пустой, еще не заполненный ничем, блок. Соответственно Forms и не пытается изменить твою нулевую запись. Обычно в When-New-Form-Inatance в конце прописывают: Go_Block('BLOCK_NAME'); Do_Key('EXECUTE_QUERY'); И потом при добавлении записей в блок все работает как надо, то есть :block.item1 := :vars.item1 (!= null); Если тебе так уж хочется сохранить свое поведение блока, то можно либо как ты использовать WHEN-CREATE-RECORD либо в триггере WHEN-NEW-RECORD-INSTANCE блока прописать нечто вроде IF (:SYSTEM.RECORD_STATUS = 'NEW') THEN IF (:b.item1 IS NULL) THEN :b.item1 := :vars.item1; END IF; END IF; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2003, 13:11 |
|
||
|
Написание обработчиков событий в Oracle Developer
|
|||
|---|---|---|---|
|
#18+
что-то меня за живое задело: Задача как инициализировать переменную управляющего блока (vars.item1), перейти в базовый блок (block), не запрашивать его, и чтобы в поле базового блока (block.item1) было значение поля управляющего блока и обойтись без When-Create-Record: Решение 1) Для элемента block.item1 устанавливаешь свойство Initial Value в :VARS.ITEM1 2) В триггере <When-New-Form-Instance> прописываешь: -- установить поле управляющего блока :vars.item1 := :GLOBAL.COUNT_NUMBER; -- или еще что -- установить поле базового блока :block.item1 := :vars.item1; -- при этом статус блока block = CHANGED, -- а статус записи - INSERT 3) После заполнения/сохранения/удаления/очистки первой записи блока block, все вновь создаваемые записи будут иметь статус NEW, так как значение поля block.item1 будет браться из Initial Value, а соответсвенно значение block.item1 будет равно значению vars.item1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2003, 15:01 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=2817&tid=1992088]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 311ms |

| 0 / 0 |
