|
ошибка: 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;