Опубликован: 25.09.2009 | Уровень: специалист | Доступ: платный
Лекция 4:

Эффективное программирование в PL/SQL. Встроенные подпрограммы, функции, процедуры и пакеты

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Аннотация: В этой лекции слушатель научится создавать гибкий код, используя системные переменные и встроенные подпрограммы. В лекции также рассматривается создание пользовательских функций, процедур и пакетов.

В Oracle Forms для работы с элементами в режиме выполнения существуют три основные разновидности встроенных подпрограмм пакета STANDARTS:

  1. процедуры SET_ - служат для установки свойств объектов;
  2. функции GET _ - служат для получения свойств объектов;
  3. функции 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 _

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;

Область применения этой процедуры очень большая, поэтому вы будете часто использовать ее в своих программах. Ниже приведено несколько примеров, в которых рассмотрены возможные способы применения этой процедуры.

  1. "Замена группы записей для 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;
  2. "Установка свойства WHERE Clause блока" - в этом примере показано, как с помощью процедуры SET _ можно ограничить выборку. После того как свойство будет установлено, количество записей, которое может выбрать пользователь командой EXECUTE QUERY, ограничивается до десяти.

    Пример 1. "Замена группы записей для BLOCK"

    Set_Block_Property(block_name,DEFUALT_WHERE ,'rownum<=10');
  3. "Стиль перемещения" - в этом примере показано, как, изменяя атрибут Navigation_Style, можно управлять обработкой следующего или предыдущего элемента, когда фокус находится в первом или доступном последнем элементе.

    Пример 3. "Стиль перемещения"

    Set_Block_Property('pzak',navigation_style,change_block);
  4. "Сделать элемент недоступным" - используя константу ENABLED процедуры SET _, вы можете сделать элемент недоступным, то есть запретить перемещать фокус ввода и выполнять навигацию к нему.

Пример 4. "Сделать элемент недоступным"

IF :system.form_status='ENTER QUERY'
THEN
 Set_item_Property('item_name',enabled, property_false); 
END IF; 
...

Функции получения свойств объектов

Функции GET _ предназначены для получения значений свойств объекта во время выполнения программы. В Oracle Forms существуют следующие разновидности рассматриваемых функций:

  1. GET_BLOCK_PROPERTY.
  2. GET_CANVAS_PROPERTY.
  3. GET_FORM_PROPERTY.
  4. GET_ITEM_PROPERTY.
  5. GET_LOV_PROPERTY.
  6. GET_MENU_ITEM_PROPERTY.
  7. GET_MESSAGE.
  8. GET_PARAMETER_ATTR.
  9. GET_RADIO_BUTTON_PROPERTY.
  10. GET_RECORD_PROPERTY.
  11. GET_RELATION_PROPERTY.
  12. GET_VIEW_PROPERTY.
  13. GET_WINDOW_PROPERTY.

Синтаксис функции, как и в предыдущем случае, имеет достаточно много вариаций, поэтому перечислим основные.

Синтаксис процедуры GET _

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, где показаны все возможные вариации этой функции в зависимости от класса объекта, с которым она используется.

Таблица 4.1. Варианты функции FIND
Объект Функция Возвращаемый тип
Alert FIND ALERT ALERT
Block FIND BLOCK BLOCK
Canvas FIND CANVAS CANVAS
Record Group Column FIND_COLUMN GROUP COLUMN
Editor FIND EDITOR EDITOR
Form FIND FORM FORM MODULE
Record Group FIND GROUP RECORDGROUP
Item FIND ITEM ITEM
List of Values FIND LOV LOV
Menu Item FIND MENU ITEM MENU ITEM
Pa rameter List GET_PAR A METER _LIST PA R AMLIST
Relation FIND RELATION RELATION
Timer FIND TIMER TIMER
View FIND VIEW VIEWPORT

Используя функцию поиска 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 ) на экран проверяется его существование.

"Поиск идентификатора 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;
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет
Андрей Кошелев
Андрей Кошелев
Россия, Москва, Московская Финансово-Юридическая Академия
Артем Чуйко
Артем Чуйко
Россия, Самара