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 - 鲍新建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?