|
ошибка: FRM47337 Tree node label can not be null при выполнении скрипта DECLARE |
Элемент дерево (Tree view)
Элемент Tree View является специфичным не только потому, что требует особых условий и настройки свойств, а еще и потому, что для управления этим элементом в Oracle Forms создан специальный встроенный пакет FTREE. Элемент дерево является очень функциональным, так как позволяет скоординировать и компактно отобразить большой набор данных, разбивая его на логические единицы - узлы. Вы можете заполнять деревья статически и динамически данными из таблиц. В дереве вы можете реализовать отношение Мастер-Деталь, выбирая в качестве родительского узла запись таблицы Мастер, а в качестве дочернего - запись из таблицы Деталь. Вы также можете использовать дерево как навигатор вашего приложения, в котором перечислены все блоки и элементы. Пакет FTREE содержит довольно небольшой объем процедур и функций, которые перечислены ниже:
- ADD_TREE_DATA ;
- ADD_TREE_NODE ;
- DELETE_TREE_NODE ;
- FIND_TREE_NODE ;
- POPULATE_GROUP_FROM_TREE ;
- POPULATE_TREE ;
- SET_TREE NODE_PROPERTY.
Создание Tree View
Tree View представляет собой прямоугольную область, в которой отображается иерархическое дерево. Для того чтобы создать дерево, выполните следующие действия:
- Создайте новую форму и сохраните ее как TREE.
- Находясь в навигаторе объектов, создайте два небазовых блока. Первый блок назовите " TREE ", а второй " CONTR ".
- Находясь в редакторе разметки, создайте одну канву. Разместите на канве элемент Tree View и две кнопки.
- Установите для элемента TREE VIEW блок TREE, а все остальные элементы ассоциируйте с блоком " CONTR ".
В этом примере мы создали дополнительный управляющий блок данных "CONTR" для последующего использования в примерах.
Прежде чем построить дерево, рассмотрим основные методы пакета FTREE, которые нам для этого понадобятся.
Функция ADD_TREE_NODE
ADD_TREE_NODE (item_id [item_id] ITEM, node NODE,
offset_ type NUMBER, offset NUMBER, state NUMBER,
label VARCHAR2, icon VARCHAR2, value VARCHAR2)
RETURN FTREE.NODE- добавляет новый элемент в дерево.
Следующий пример описывает процесс добавления нового элемента в существующее дерево.
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;
Листинг
3.1.
Добавление элемента к дереву
Процедура DELETE_TREE_NODE
DELETE_TREE_NODE (item_name [item_id] VARCHAR2, node FTREE.NODE) - эта процедура выполняет действие, обратное ADD_ TREE_NODE, то есть удаляет элемент дерева.
Следующий пример описывает процесс удаления вершины и всех ее детей.
DECLARE
Itree item := find_item('tree_block.tree_item ');
del_node Ftree.Node;
i_value VARCHAR2(30);
BEGIN
del_node := Ftree.Find_Tree_Node(Itree, i_value,
Ftree.FIND_NEXT, Ftree.NODE_LABEL,
Ftree.ROOT_NODE, Ftree.ROOT_NODE);
IF NOT Ftree.ID_NULL(del_node) then
Ftree.Delete_Tree_Node(Itree, del_node);
END IF;
END;
Листинг
3.2.
Удаление элемента дерева
Функция FTREE.GET_TREE_NODE_PARENT
FTREE.GET_TREE_NODE_PARENT (item_name [item_id] VARCHAR2, node FTREE.NODE) - возвращает родителя указанной вершины дерева.
Следующий пример описывает процесс получения родителя указанного элемента.
DECLARE
Itree item := find_item('tree_block.tree_item ');
par_node FTREE.NODE;
BEGIN
par_node := Ftree.Get_Tree_Node_Parent(Itree,
:SYSTEM.TRIGGER_NODE);
...
END;
Листинг
3.3.
Получение родителя элемента дерева. Триггер WHEN-TREE-NODE-SELECTED
Функция FTREE.GET_TREE_NODE_PROPERTY
FTREE.GET_TREE_NODE_PROPERTY (item_name [item_id] VARCHAR2, node NODE, property NUMBER) RETURN VARCHAR2 - возвращает значение свойства указанной вершины дерева.
Следующий пример проверяет состояние указанной вершины, и если она не раскрыта, то есть NODE_STATE установлено в COLLAPSED_ NODE, то вершина автоматически раскрывается, то есть NODE_STATE устанавливается в EXPANDED_NODE.
DECLARE
Itree item := find_item('tree_block.tree_item ');
BEGIN
IF Ftree.Get_Tree_Node_Property(Itree,
:SYSTEM.TRIGGER_NODE, Ftree.NODE_STATE)=Ftree.COLLAPSED_NODE
THEN
ftree.set_tree_node_property(Itree,
:SYSTEM.TRIGGER_NODE, ftree. node_state, ftree.expanded_node);
END IF;
END;
Листинг
3.4.
Получение значения свойства элемента дерева. Триггер WHEN-TREE-NODE-SELECTED
Используйте функцию FTREE.GET_TREE_NODE_PROPERTY для получения значения вершины.
DECLARE
Itree item := find_item('tree_block.tree_item ');
BEGIN
Ftree.Get_Tree_Node_Property(Itree, :SYSTEM.TRIGGER_NODE,
Ftree.NODE_VALUE);
...
END;
Листинг
3.5.
Получение значения элемента дерева. Триггер WHEN-TREE-NODE-SELECTED
Функция FTREE.GET_TREE_PROPERTY
FTREE.GET_TREE_PROPERTY (item_name [item_id] VARCHAR2, property NUMBER) RETURN VARCHAR2 - возвращает значение свойства указанного элемента дерева.
| Метод | Параметр | Тип | Значение |
|---|---|---|---|
| FUNCTION GET_TREE_PROPERTY (параметры) RETURN VARCHAR2 | itemname [idname] | VARCHAR2 [FORMS4C.ITEM] | Определяет имя элемента или его идентификатор |
| property | NUMBER | Возвращает значение одного из перечисленных свойств: DATASOURCE, RECORD_GROUP, SET_TREE_PROPERTY, QUERY_TEXT, NODE_COUNT, SELECTION_COUNT, ALLOW_EMPTY_BRANCHES, ALLOW_MULTI-SELECT |
Следующий пример описывает процесс получения количества вершин указанного дерева.
DECLARE
Itree item := find_item('tree_block.tree_item ');
node_cnt NUMBER;
BEGIN
node_cnt := Ftree.Get_Tree_Property(Itree,
Ftree.NODE_COUNT);
Message('Количество вершин дерева: '||node_cnt);
END;
Листинг
3.6.
Получение значения свойства дерева. Триггер WHEN-TREE-NODE-SELECTED
Функция FTREE.GET_TREE_SELECTION
GET_TREE_SELECTION (item_name [item_id] VARCHAR2, selection NUMBER) RETURN Ftree.NODE - возвращает выделенную вершину дерева.
Следующий пример описывает процесс получения выделенных элементов указанного дерева. Все элементы, помеченные как выделенные, будут удалены, причем удалять элементы нужно в обратном порядке, как показано в примере.
DECLARE
Itree item := find_item('tree_block.tree_item ');
Select_cnt NUMBER;
del_node FTREE.NODE;
BEGIN
Select_cnt:= Ftree.Get_Tree_Property(Itree,
Ftree.SELECTION_COUNT);
FOR i IN REVERSE 1..select_cnt LOOP
del_node := Ftree.Get_Tree_Selection(Itree, i);
Ftree.Delete_Tree_Node(Itree, del_node);
END LOOP;
END;
Листинг
3.7.
Получение выделенной вершины
Процедура FTREE.SET_TREE_NODE_PROPERTY
SET_TREE_NODE_PROPERTY (item_name [item_id] VARCHAR2 [FORMS4C.ITEM], node FTREE.NODE, property NUMBER, value NUMBER [VARCHAR2]) - устанавливает свойства элемента дерева.
Следующий пример описывает процесс поиска корневого узла и его развертывания.
DECLARE
Itree item := find_item('tree_block.tree_item ');
branch_node Ftree.NODE;
i_value varchar2(30);
begin
select_node := Ftree.Find_Tree_Node(Itree, i_value,
Ftree.FIND_NEXT, Ftree.NODE_VALUE,
Ftree.ROOT_NODE, Ftree.ROOT_NODE);
ftree.set_tree_node_property(Itree, select_node,
ftree.node_state, ftree.expanded_node);
END;
Листинг
3.8.
Установка значения свойства элемента дерева
С помощью процедуры SET_TREE_NODE_PROPERTY вы можете менять иконку узла в зависимости от какого-либо условия, как показано в листинге 3.8.
DECLARE
Itree item := find_item('tree_block.tree_item ');
BEGIN
IF Ftree.Get_Tree_Node_Property(Itree,
:SYSTEM.TRIGGER_NODE, Ftree.NODE_STATE)=Ftree.COLLAPSED_NODE
THEN Ftree.Set_Tree_Node_Property(Itree, :SYSTEM.TRIGGER_NODE, Ftree.NODE_ICON, 'Close');
ELSIF
Ftree.Get_Tree_Node_Property(Itree, :SYSTEM.TRIGGER_NODE,
Ftree.NODE_STATE)= Ftree.EXPANDED_NODE
THEN
Ftree.Set_Tree_Node_Property(Itree, :SYSTEM.TRIGGER_NODE,
Ftree.NODE_ICON, 'Open');
END IF;
END;
Листинг
3.9.
Установка новой иконки для элемента дерева