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 2015-01-15 10:22  东方瀚海  阅读(1857)  评论(0编辑  收藏  举报