Form_Form树形结构HTree的开发(案例)
2014-06-09 Created By BaoXinjian
一、摘要
Oracle Developer 6.0以上版本提供了hierarchy tree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。
1. 树的特有属性中如下几个较为重要
(1). 多项选择(Multi-Selection)
是否允许一次选中树的多个节点。如果不允许,那么选中第二个节点时,第一个被选中的节点会取消选择。
(2). 记录组(Record Group)
指定生成树的记录组的名字。
2. 开发Tree的方式如下
Step1. 创建目录结构存放表
Step2. 创建目录数据
Step3. 创建一个数据块,命名为:BXJTREE
Step4. 查看所创建Tree组件
Step5. 创建一个记录组,命名为BXJTREERG,记录组查询代码如下:(记得别加任何Order by)
Step6. 查看所创建TreeRG
Step7.修订Tree ITEM 属性
Step8. 创建Trigger: WHEN-NEW-FORM-INSTANCE
Step9. Form已经可以预览了,这一步的目的是对tree的一些操作的简单代码,可以自己摸索,本例到此为止。
Step10. 创建Trigger的选中触发器WHEN-TREE-NODE-SELECTED
Step11. 其他的Trigger类型
二、解析
Step1. 创建目录结构存放表
CREATE TABLE bxj_menu
(
menu VARCHAR2 (100),
submenu VARCHAR2 (100),
menu_function VARCHAR (100),
attribute1 VARCHAR2 (240),
attribute2 VARCHAR2 (240),
attribute3 VARCHAR2 (240),
attribute4 VARCHAR2 (240),
attribute5 VARCHAR2 (240)
)
Step2. 创建目录数据
BEGIN
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('0', 'SCM_DEPT_MENU', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('0', 'FIN_DEPT_MENU', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('SCM_DEPT_MENU', 'PO_MENU', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('SCM_DEPT_MENU', 'INV_MENU', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('FIN_DEPT_MENU', 'GL_MENU', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('FIN_DEPT_MENU', 'AP_MENU', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('AP_MENU', 'AP_FORM', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('PO_MENU', 'PR_FORM', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('PO_MENU', 'PO_FORM', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('PO_MENU', 'PO_QUOTATION', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('PO_QUOTATION', 'QUOTATION_FORM', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('INV_MENU', 'ONHAND_FORM', '');
INSERT INTO bxj_menu (menu, submenu, menu_function)
VALUES ('INV_MENU', 'TRANSACTION_FORM', '');
END;
Step3. 创建一个数据块,命名为:BXJTREE
在画布上创建一个文本项,命名为TREELIST,打开属性选项板,项类型选择:层次树
Step4. 查看所创建Tree组件
Step5. 创建一个记录组,命名为BXJTREERG,记录组查询代码如下:(记得别加任何Order by)
SELECT -1 state,
LEVEL,
a.submenu,
NULL Icon,
a.submenu
FROM apps.bxj_menu a
WHERE a.submenu IS NOT NULL
START WITH a.menu = '0'
CONNECT BY PRIOR a.submenu = a.menu
Step6. 查看所创建TreeRG
Step7.修订Tree ITEM 属性
打开ITEM:BXJTREE的属性选项板,选择其记录组为BXJTREELIST
Step8. 创建Trigger: WHEN-NEW-FORM-INSTANCE
DECLARE
HTREE ITEM;
v_ignore NUMBER;
rg_emps RECORDGROUP;
BEGIN
HTREE := FIND_ITEM('BXJTREE.TREELIST');
FTREE.POPULATE_TREE(HTREE);
rg_emps := FIND_GROUP('NEWTREE');
IF NOT ID_NULL(rg_emps) THEN
DELETE_GROUP(rg_emps);
END IF;
rg_emps := CREATE_GROUP_FROM_QUERY('rg_emps','select -1 state, level, a.submenu, null Icon, submenu
from apps.bxj_menu a
where a.submenu is not null
start with a.menu = ''0''
connect by prior a.submenu = a.menu'
);
-- Populate the record group with data.
v_ignore := POPULATE_GROUP(rg_emps);
Ftree.Set_Tree_Property(HTREE, Ftree.RECORD_GROUP, rg_emps);
END;
Step9. Form已经可以预览了,这一步的目的是对tree的一些操作的简单代码,可以自己摸索,本例到此为止。
Step10. 创建Trigger的选中触发器
创建Trigger: WHEN-TREE-NODE-SELECTED
DECLARE
htree ITEM;
node_value VARCHAR2 (100);
BEGIN
htree := FIND_ITEM ('BXJTREE.TREELIST');
--node_value := Ftree.Get_Tree_Node_Property(htree, :SYSTEM.TRIGGER_NODE, Ftree.NODE_VALUE);
--node_value := Ftree.Get_Tree_Node_Property(htree, :SYSTEM.TRIGGER_NODE, Ftree.NODE_STATE);
--node_value := Ftree.Get_Tree_Node_Property(htree, :SYSTEM.TRIGGER_NODE, Ftree.NODE_DEPTH);
node_value := Ftree.GET_TREE_NODE_PROPERTY (htree,:SYSTEM.TRIGGER_NODE,Ftree.NODE_VALUE);
/*
其中property有如下几种:
NODE_STATE:EXPANDED_NODE(扩展节点)
COLLAPSED_NODE(收缩节点)
LEAF_NODE(叶节点)--注:不能展开或收缩
NODE_DEPTH:既节点在树中的层级。
NODE_LABEL:节点的显示文本
NODE_ICON:节点的图标
NODE_VALUE:节点的值。
*/
MESSAGE ('Node:' || node_value);
--Message('Node:'||node_value);
END;
Step11. 其他的Trigger类型
Thanks and Regards
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建