亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle Form Builder中使用樹的心得

瀏覽:109日期:2023-11-22 09:26:08
一、樹的簡介Developer 6.0以上版本提供了hierarchy tree(層次樹)的概念,htree控件非常方便,只需要少量的編程即可實(shí)現(xiàn)顯示層次結(jié)構(gòu)的目的。樹的特有屬性中如下幾個(gè)較為重要: l 多項(xiàng)選擇(Multi-Selection):是否答應(yīng)一次選中樹的多個(gè)節(jié)點(diǎn)。假如不答應(yīng),那么;;;選中第二個(gè)節(jié)點(diǎn)時(shí),第一個(gè)被選中的節(jié)點(diǎn)會取消選擇。l 記錄組(Record Group):指定生成樹的記錄組的名字。簡單介紹一下跟樹相關(guān)的觸發(fā)子(Built-in):l FUNCTION GET_TREE_NODE_PROPERTY (item_name VARCHAR2, node NODE,property NUMBER);功能:取得樹節(jié)點(diǎn)的屬性其中property有如下幾種:NODE_STATE:EXPANDED_NODE(擴(kuò)展節(jié)點(diǎn))COLLAPSED_NODE(收縮節(jié)點(diǎn))LEAF_NODE(葉節(jié)點(diǎn))--注:不能展開或收縮NODE_DEPTH:既節(jié)點(diǎn)在樹中的層級。NODE_LABEL:節(jié)點(diǎn)的顯示文本NODE_ICON:節(jié)點(diǎn)的圖標(biāo)NODE_VALUE:節(jié)點(diǎn)的值。例子:DECLARE htree ITEM; node_value;VARCHAR2(100);BEGIN -- 得到樹 htree := Find_Item('tree_block.htree3'); -- 得到當(dāng)前選中節(jié)點(diǎn)的值 node_value := Ftree.Get_Tree_Node_Property(htree, :SYSTEM.TRIGGER_NODE, Ftree.NODE_VALUE); ;...END;注釋:其中: SYSTEM.TRIGGER_NODE指當(dāng)前選中的樹節(jié)點(diǎn)。l FUNCTION GET_TREE_PROPERTY (item_name VARCHAR2,property NUMBER);功能:取得樹的屬性其中property有如下幾種:DATASOURCERECORD_GROUPQUERY_TEXTNODE_COUNT:返回樹中節(jié)點(diǎn)的個(gè)數(shù)。SELECTION_COUNTALLOW_EMPTY_BRANCHESALLOW_MULTI-SELECTl PROCEDURE SET_TREE_NODE_PROPERTY (item_name VARCHAR2,node FTREE.NODE,property NUMBER,value VARCHAR2);功能:設(shè)置樹節(jié)點(diǎn)的屬性l PROCEDURE SET_TREE_PROPERTY (item_name VARCHAR2,property NUMBER, value VARCHAR2); PROCEDURE SET_TREE_PROPERTY (item_name VARCHAR2,property NUMBER, value RECORDGROUP);功能:設(shè)置樹的屬性l PROCEDURE POPULATE_TREE (item_name VARCHAR2);功能:清空樹中已有數(shù)據(jù),并根據(jù)記錄組或數(shù)據(jù)查詢重新生成樹。l PROCEDURE ADD_TREE_DATA (item_name VARCHAR2,node FTREE.NODE, offset_type NUMBER,offset NUMBER,data_source NUMBER,data VARCHAR2);功能:在指定節(jié)點(diǎn)下添加樹中數(shù)據(jù)注:使用比較麻煩。 l FUNCTION FIND_TREE_NODE(item_name VARCHAR2,earch_string VARCHAR2,search_type NUMBER,search_by NUMBER,search_root NODE,start_point NODE);功能:找到顯示文本或值符合search_string的節(jié)點(diǎn)。參數(shù):search_type:FIND_NEXT FIND_NEXT_CHILDSearch_by:NODE_LABEL NODE_VALUESearch_root:查詢的根節(jié)點(diǎn),一般是Ftree.ROOT_NODEStart_point:查找的開始節(jié)點(diǎn),一般是Ftree.ROOT_NODEl FUNCTION ADD_TREE_NODE(item_name VARCHAR2,node FTREE.NODE,offset_type NUMBER,offset NUMBER,state NUMBER,label VARCHAR2, icon VARCHAR2,value VARCHAR2);功能:添加樹節(jié)點(diǎn)。Offset_type:指定節(jié)點(diǎn)的分支類型,PARENT_OFFSET和SIBLING_OFFSETOffset:指定新節(jié)點(diǎn)的位置,PARENT_OFFSET:1..N ;;;;;;;LAST_CHILDSIBLING_OFFSET:NEXT_NODE ;;;;;;;PREVIOUS_NODEState:EXPANDED_NODE(擴(kuò)展節(jié)點(diǎn))COLLAPSED_NODE(收縮節(jié)點(diǎn))LEAF_NODE(葉節(jié)點(diǎn))l PROCEDURE DELETE_TREE_NODE(item_name VARCHAR2,node NODE);功能:刪除樹節(jié)點(diǎn)l FUNCTION GET_TREE_NODE_PARENT(item_name VARCHAR2,node NODE);功能:得到指定節(jié)點(diǎn)的父節(jié)點(diǎn)。l FUNCTION GET_TREE_SELECTION(item_name VARCHAR2,selection NUMBER);功能:得到處于選中狀態(tài)的節(jié)點(diǎn)。l PROCEDURE SET_TREE_SELECTION(item_name VARCHAR2,node NODE, selection_type NUMBER);功能:指定單個(gè)節(jié)點(diǎn)的選中狀態(tài)參數(shù):selection_type:SELECT_ON SELECT_OFF SELECT_TOGGLEFORM運(yùn)行態(tài)時(shí)有關(guān)的觸發(fā)器:l When-Tree-Node-Activated:用戶雙擊節(jié)點(diǎn)或在節(jié)點(diǎn)選中時(shí)按[ENTER]鍵時(shí)觸發(fā)。l When-Tree-Node-Expanded:節(jié)點(diǎn)展開或收縮時(shí)觸發(fā)l When-Tree-Node-Selected:當(dāng)節(jié)點(diǎn)選中或取消選擇時(shí)觸發(fā)二、生成樹的方式樹控件一般單獨(dú)放在一個(gè)控制塊中(注:不能放在數(shù)據(jù)塊中),在畫布(CANVAS)上放置樹很輕易,并且,如無必要,樹的屬性也不需要設(shè)置。生成樹的方式有幾種:l 運(yùn)行前通過設(shè)置記錄組或數(shù)據(jù)查詢屬性來生成l 通過ADD_TREE_DATA觸發(fā)子來實(shí)現(xiàn)l 運(yùn)行態(tài),通過ADD_TREE_NODE等觸發(fā)子來實(shí)現(xiàn)l 運(yùn)行態(tài),通過添加或刪除記錄組的數(shù)據(jù)元素來實(shí)現(xiàn)分析:一、 對樹直接操作描述:Find_Tree_Node找到指定節(jié)點(diǎn),Add_Tree_Node來添加其下級節(jié)點(diǎn)。 缺點(diǎn):編程較為復(fù)雜,操作不靈活,而且易出錯(cuò)。優(yōu)點(diǎn):可以對添加節(jié)點(diǎn)等過程進(jìn)行控制,實(shí)現(xiàn)一些非凡要求。例子: --dept_cur為取單位的CURSOR,emp_cur為取雇員的CURSOR htree := Find_Item('tree_view.tree_emp'); open dept_cur; loop fetch dept_cur into aa; exit when dept_cur%notfound; del_node := Ftree.Find_Tree_Node ( htree,aa.kjmc, Ftree.FIND_NEXT, Ftree.NODE_LABEL, Ftree.ROOT_NODE, Ftree.ROOT_NODE); -- 刪除單位節(jié)點(diǎn)及其子節(jié)點(diǎn) IF NOT Ftree.ID_NULL(del_node) then Ftree.Delete_Tree_Node(htree, del_node); END IF; end loop; close dept_cur; -- 根據(jù)用CURSOR取得的單位生成樹的第一層節(jié)點(diǎn) open dept_cur; loop fetch dept_cur into aa; exit when dept_cur%notfound; new_node := Ftree.Add_Tree_Node(htree, Ftree.ROOT_NODE, Ftree.parent_OFFSET, Ftree.LAST_CHILD, Ftree.EXPANDED_NODE, aa.dname, '', aa.deptno); end loop; close dept_cur; --根據(jù)雇員CURSOR生成樹的下層節(jié)點(diǎn) open emp_cur; loop fetch emp_cur into bb; exit when emp_cur%notfound; find_node := Ftree.Find_Tree_Node(htree, bb.kjbh, Ftree.FIND_NEXT, Ftree.NODE_value, Ftree.ROOT_node, Ftree.ROOT_NODE); new_node := Ftree.Add_Tree_Node(htree, find_node, Ftree.parent_OFFSET, Ftree.LAST_CHILD, Ftree.EXPANDED_NODE, bb.ename, '', bb.empno); end loop; close emp_cur; -- 得到樹的根節(jié)點(diǎn) ss := Ftree.get_tree_property(htree,FTREE.NODE_COUNT); -- 循環(huán),直到樹的所有節(jié)點(diǎn)都展開 for j in 1..ss LOOP exp_node; := Ftree.Find_Tree_Node(htree, ''); state := Ftree.Get_Tree_Node_Property(htree, j, Ftree.NODE_STATE); IF state = Ftree.COLLAPSED_NODE THEN Ftree.Set_Tree_Node_Property(htree, j, Ftree.NODE_STATE, Ftree.EXPANDED_NODE); END IF; END LOOP;二、 動態(tài)記錄組層次樹所使用記錄組的數(shù)據(jù)格式: +; — Car -; — Airplane — Boeing — Boeing初始狀態(tài)層數(shù)顯示文本圖標(biāo)值-1(收縮節(jié)點(diǎn))1‘Car’''‘car’0(葉節(jié)點(diǎn))2'Honda''''civic'1(展開節(jié)點(diǎn))1'Airplane''''plane'02'Boeing''''747'02'Boeing''''757'生成記錄組的方式又分為兩種。 1、; 從查詢生成記錄組描述:利用樹的查詢語句(connect by…prior…start with…)生成記錄組,設(shè)置樹的屬性來生成。優(yōu)點(diǎn):編程簡單,方便。缺點(diǎn):只適用于可以構(gòu)造出樹狀查詢語句的情況下。例子: v_ignore;;;;number; rg_emps;;;;;recordgroup;begin ;;rg_emps := find_group('EMPS'); --假如非空,則清空數(shù)據(jù) ;;if not id_null(rg_emps) then ;delete_group(rg_emps); ;;end if; ;;--構(gòu)造記錄組 ;;rg_emps := create_group_from_query('EMPS', 'select 1, level, ename, NULL, to_char(empno) ' 'from emp ';;; 'connect by prior empno = mgr ';;; 'start with job = ''PRESIDENT'''); v_ignore := populate_group(rg_emps); ftree.set_tree_property('tree_view.tree_emp', ftree.record_group, rg_emps);end;2、; 用行列數(shù)據(jù)直接構(gòu)造記錄組描述:記錄組一般為行列結(jié)構(gòu),以循環(huán)方式直接向記錄組中添加單元數(shù)據(jù)。優(yōu)點(diǎn):可直接控制記錄組的樣式。缺點(diǎn):對多層結(jié)構(gòu),編程也較為復(fù)雜。例子:--單位CURSOR cursor cursor_dept is selectdname, deptno from dept order by dname; --雇員CURSOR cursor cursor_emp(p_dno number) is select ;;ename, empno from emp where deptno = p_dno order by ename; v_i;number; v_ignore;;;;number; rg_emps;;;;;recordgroup; rg_depts;;;;recordgroup; v_init_stategroupcolumn; v_level;;;;;groupcolumn; v_label;;;;;groupcolumn; v_icon groupcolumn; v_value;;;;;groupcolumn;beginrg_depts := find_group('DEPTS');--如有數(shù)據(jù),則清空記錄組 if not id_null(rg_depts) then ;;;;delete_group(rg_depts); end if; rg_depts := create_group('DEPTS'); --這里自定義你需要的記錄組中列的數(shù)據(jù)類型和長度 --初始狀態(tài)(指展開、收縮還是葉節(jié)點(diǎn)) v_init_state := add_group_column(rg_depts, 'init_state', number_column); --所在層數(shù) v_level;;;:= add_group_column(rg_depts, 'level', number_column); --顯示文本 v_label;;;:= add_group_column(rg_depts, 'label', char_column, 40); --圖標(biāo) v_icon;;;;:= add_group_column(rg_depts, 'icon', char_column, 20); --值 v_value;;;:= add_group_column(rg_depts, 'value', char_column, 5); v_i := 1; for deptrec in cursor_dept loop ;;;add_group_row(rg_depts, v_i); set_group_number_cell(v_init_state, v_i, 1); set_group_number_cell(v_level;;, v_i, 1); set_group_char_cell; (v_label;;, v_i, deptrec.dname); set_group_char_cell; (v_icon;;;, v_i, NULL); set_group_char_cell; (v_value;;, v_i, to_char(deptrec.deptno)); v_i := v_i + 1; for emprec in cursor_emp(deptrec.deptno) loop ;;add_group_row(rg_depts, v_i); ;;set_group_number_cell(v_init_state, v_i, 1); ;;set_group_number_cell(v_level;;, v_i, 2); ;;set_group_char_cell; (v_label;;, v_i, emprec.ename); ;;set_group_char_cell; (v_icon;;;, v_i, NULL); ;;set_group_char_cell; (v_value;;, v_i, to_char(emprec.empno)); v_i := v_i + 1; end loop; end loop; ftree.set_tree_property('tree_view.tree_org', ftree.record_group, rg_depts);end;結(jié)論:進(jìn)行數(shù)據(jù)庫設(shè)計(jì)時(shí)盡量把父子結(jié)構(gòu)放在一張表,這樣,使用查詢生成記錄組再生成樹的方式最簡單實(shí)用。 假如不能實(shí)現(xiàn),那么直接構(gòu)造記錄組也可生成樹。如無非凡要求,一般不采取對樹直接操作的方式。附注:作者一般將生成樹的程序放在Form Builder的“程序單元”中,在需要的地方調(diào)用來實(shí)時(shí)刷新樹。參考:Developer 6.0自帶的PL/SQL程序庫:navigate.pll三、遺留問題由于developer簡化了樹的設(shè)計(jì),那么一些對樹的轉(zhuǎn)移、拷貝等操作就不太輕易實(shí)現(xiàn)。這個(gè)課題還需要繼續(xù)研究。
標(biāo)簽: Oracle 數(shù)據(jù)庫
主站蜘蛛池模板: 欧洲三级在线观看 | 国产成a人片在线观看视频99 | 六度国产福利午夜视频黄瓜视频 | 亚洲国产精品91 | 国产91小视频 | 丁香六月婷婷在线 | 国产片毛片 | 欧美一区福利 | 日韩精品视频在线播放 | 黄页网站18以下禁止观看 | 青青久久网 | 亚洲欧美手机在线观看 | 在线免费看影视网站入口 | 国产精品一在线观看 | 久久久精品免费热线观看 | 91综合国产| 欧美扩阴 | 一级毛片日韩a欧美 | 亚洲国产综合网 | 欧美成人午夜精品一区二区 | 国产欧美日韩综合精品二区 | 精品免费视在线视频观看 | 亚洲性一级理论片在线观看 | 污污美女网站 | 久久久久久久久久免免费精品 | 第一福利在线观看 | 午夜精品久久久久久久爽 | 手机看片日韩高清国产欧美 | 你懂的在线免费视频 | 一区二区在线看 | 色综合网站国产麻豆 | 极品美女国产精品免费一区 | 青青久操视频 | 国产一区二区免费在线 | 色婷婷亚洲综合五月 | 哦哦哦用力视频在线观看 | 九月丁香婷婷 | 96免费精品视频在线观看 | 亚洲精品三区 | 国产午夜精品久久久久免费视小说 | 点击进入毛片免费观看 |