ошибка: FRM47337 Tree node label can not be null при выполнении скрипта DECLARE |
Эффективное программирование в PL/SQL. Встроенные подпрограммы, функции, процедуры и пакеты
В Oracle Forms для работы с элементами в режиме выполнения существуют три основные разновидности встроенных подпрограмм пакета STANDARTS:
- процедуры SET_ - служат для установки свойств объектов;
- функции GET _ - служат для получения свойств объектов;
- функции FIND _ - служат для поиска идентификаторов объектов.
Процедуры установки свойств объектов
Процедуры установки значений предназначены для установки свойств объекта во время выполнения программы. В Oracle Forms существуют следующие разновидности процедур установки:
- SET_BLOCK_PROPERTY ;
- SET_CANVAS_PROPERTY ;
- SET_FORM_PROPERTY ;
- SET_ITEM_PROPERTY ;
- SET_LOV_PROPERTY ;
- SET_MENU_ITEM_PROPERTY ;
- SET_PARAMETER_ATTR ;
- SET_RADIO_BUTTON_PROPERTY ;
- SET_RECORD_PROPERTY ;
- SET_RELATION_PROPERTY ;
- SET_VIEW_PROPERTY ;
- SET_WINDOW_PROPERTY.
Синтаксис процедуры SET _ имеет достаточно много вариаций, поэтому перечислим только основные.
SET_ITEM_PROPERTY (item_id ITEM, property NUMBER, value VARCHAR2); SET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER, value VARCHAR2);
Каждая процедура в зависимости от объекта, с которым она ассоциирована, может принимать в качестве значений константы и различные переменные подстановки. Например, рассмотрим функцию SET_ RECORD_PROPERTY.
SET_RECORD_PROPERTY (rec_num NUMBER, block_name VARCHAR2, property NUMBER, value NUMBER)
- устанавливает свойства записи.
Параметры:
record_number - номер записи;
block_name - имя блока, содержащего целевую запись. Тип данных - VARCHAR2 ;
property - свойство, значение которого собираемся изменить, - это константа STATUS ;
value - используйте возможное значение:
- CHANGED_STATUS ;
- INSERT_STATUS ;
- NEW_STATUS ;
- QUERY_STATUS.
"Установка свойства WHERE Clause блока" BEGIN Set_Record_Property (:system.cursor_record, 'EMP', STATUS, INSERT_STATUS); END;
Область применения этой процедуры очень большая, поэтому вы будете часто использовать ее в своих программах. Ниже приведено несколько примеров, в которых рассмотрены возможные способы применения этой процедуры.
- "Замена группы записей для LOV " - в этом примере проверяется текущая группа ( group_name1 ), на которой основан LOV, и если данная группа записей пустая, то мы подменяем ее другой группой ( group_name2 ).
Пример 1. "Замена группы записей для LOV "
DECLARE lov_id LOV; rg_id RecordGroup; BEGIN rg_id:= Find_Group ('groupe_name1'); IF Get_Group_Row_Count( rg_id )=0 THEN lov_id:= Find_LOV('LOV1'); IF Get_LOV_Property(lov_id,GROUP_NAME) = 'group_name1' THEN Set_LOV_Property(lov_id,GROUP_NAME,'group_name2'); END IF; END IF; END;
- "Установка свойства WHERE Clause блока" - в этом примере показано, как с помощью процедуры SET _ можно ограничить выборку. После того как свойство будет установлено, количество записей, которое может выбрать пользователь командой EXECUTE QUERY, ограничивается до десяти.
Пример 1. "Замена группы записей для BLOCK"
Set_Block_Property(block_name,DEFUALT_WHERE ,'rownum<=10');
- "Стиль перемещения" - в этом примере показано, как, изменяя атрибут Navigation_Style, можно управлять обработкой следующего или предыдущего элемента, когда фокус находится в первом или доступном последнем элементе.
Пример 3. "Стиль перемещения"
Set_Block_Property('pzak',navigation_style,change_block);
- "Сделать элемент недоступным" - используя константу ENABLED процедуры SET _, вы можете сделать элемент недоступным, то есть запретить перемещать фокус ввода и выполнять навигацию к нему.
Пример 4. "Сделать элемент недоступным"
IF :system.form_status='ENTER QUERY' THEN Set_item_Property('item_name',enabled, property_false); END IF; ...
Функции получения свойств объектов
Функции GET _ предназначены для получения значений свойств объекта во время выполнения программы. В Oracle Forms существуют следующие разновидности рассматриваемых функций:
- GET_BLOCK_PROPERTY.
- GET_CANVAS_PROPERTY.
- GET_FORM_PROPERTY.
- GET_ITEM_PROPERTY.
- GET_LOV_PROPERTY.
- GET_MENU_ITEM_PROPERTY.
- GET_MESSAGE.
- GET_PARAMETER_ATTR.
- GET_RADIO_BUTTON_PROPERTY.
- GET_RECORD_PROPERTY.
- GET_RELATION_PROPERTY.
- GET_VIEW_PROPERTY.
- GET_WINDOW_PROPERTY.
Синтаксис функции, как и в предыдущем случае, имеет достаточно много вариаций, поэтому перечислим основные.
GET_ITEM_PROPERTY (item_id ITEM, property NUMBER) RETURN VARCHAR2; GET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER) RETURN VARCHAR2;
Использование функций типа GET _ дает возможность узнать текущие значения элементов в ходе выполнения программы, позволяя вам контролировать состояние объекта. Ниже приведены различные примеры применения этой функции.
BEGIN Go_block(Get_Form_Property(curform,FIRST_BLOCK)); END;
Вы можете использовать функцию Get_Record_Property вместо системной переменной - :system.record_status.
BEGIN IF Get_Record_Property(1,'item_name',STATUS) = 'NEW' THEN Message('Введите запись'); RAISE Form_trigger_Failure; END IF; END;
Вы можете получить значение сообщения, отображающегося в статусной строке формы, используя функцию GET_MESSAGE.
DECLARE mes VARCHAR2(200); BEGIN mes := Get_Message; END;
Поиск идентификаторов объектов
FIND _ - эта функция предназначена для поиска идентификатора объекта, который характеризует внутреннее значение объекта, использующееся в Forms как внутреннее средство управления объектами.
Идентификатор - это значение, связываемое с объектом при его создании. Также стоит отметить, что использование идентификаторов объектов повышает производительность приложения.
Возвращаемое значение функции FIND _ зависит от класса искомого элемента (объекта). Ниже приведена табл. 18.1, где показаны все возможные вариации этой функции в зависимости от класса объекта, с которым она используется.
Используя функцию поиска FIND _, вы можете присвоить полученный идентификатор переменной, который можете применять для управления объектом, не обращаясь к нему по имени. Ниже приведен пример, который демонстрирует использование этой функции.
DECLARE id_var WINDOW; BEGIN id_var:=Find_Window('my_window'); END;
В следующем примере показано, как с помощью функции FIND _ мы проверяем существование редактора; если таковой существует, то он будет отображен процедурой Show_Editor на экран.
"Поиск идентификатора редактора"
DECLARE ed_id Editor; status BOOLEAN; BEGIN ed_id := Find_Editor('Happy_Edit_Window'); IF NOT Id_Null(ed_id) THEN Show_Editor(ed_id, NULL, :emp.comments, status); ELSE Message('Editor not found'); RAISE Form_trigger_Failure; END IF; END;
В этом примере перед отображением списка значений ( LOV ) на экран проверяется его существование.
DECLARE lv_id LOV; status BOOLEAN; BEGIN lv_id := Find_LOV('My_Shared_LOV'); IF Id_Null(lv_id) THEN lv_id := Find_LOV('My_Private_LOV'); END IF; status := Show_LOV(lv_id,10,20); END;