随笔 - 571  文章 - 4  评论 - 253  阅读 - 72万

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

posted on   东方瀚海  阅读(1869)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

点击右上角即可分享
微信分享提示