樹形結構在windows環境中被普遍應用,它以簡捷的介面深受使用者喜愛。但在資料庫開發中面對層次多、結構複雜的資料,如何快速地構造樹形目錄呢?
實現關鍵技術
在powerbuilder所提供的控制項中包含了treeview控制項,但樹的具體形成還需使用者編寫指令碼實現,即它的列表項要在程式中動態新增,而這些列表資料通常由使用者已錄入在資料庫中,並作為資料庫維護的一項內容。
為了能快速實現資料庫的樹形結構,我們可以採用編碼法,即利用編碼表來實現。
編碼表的基本字段包括編碼和編碼名稱,其編碼規則是以數字、字母的位數來區分不同層次,同一層編碼位數相同,層次按位數遞增,程式通過判斷編碼位數來決定所在層數。
例如:第一層為10~99兩位,第二層為1010~1099四位,使用者需要做的是先要設計樹的結構和對應編碼,並把相應名稱進行錄入,然後程式在讀取這些資料時形成樹。
編碼法的優點是可以適應任何複雜的層次資料,實現方法簡單,且樹內容有變動時,無需更改程式**。
範例程式與主要**分析
我們以建立乙個城市名稱的樹形結構為例,來說明編碼法的應用。
首先建立編碼表:city_tab(行政編碼、行政名稱),其對應的資料視窗是dw_tree(處於隱藏狀態),對應樹控制項為tv_1。
接著在錄入介面下輸入各城市名稱、區域名稱及對應編碼,最後在視窗的open事件上輸入以下**:
long tvi_root,tvi_next,tvi_next1,tvi_next2,tvi_root1,currenthandle,currentnext
int i,j,z,k
string city_bm,city_name
treeviewitem tvi
//定義乙個樹形資料型別的變數
tv_1.setredraw(false)
dw_tree.settransobject(trooptrans) //連線資料庫
dw_tree.retrieve()
i=dw_tree.rowcount()
j=1
//定義樹形變數的屬性,設定根目錄的標籤,若在編碼表中有此根目錄,則不用在此生成
tvi.label="城市"
//生成根目錄
// 目錄未開啟時的索引,此可在樹形控制項中設定
tvi.pictureindex=1
//目錄開啟時的索引
tvi.selectedpictureindex=3
tvi_root=tv_1.insertitemlast(0,tvi)
do while j<=i
//從隱含的編碼資料視窗檢索資料,第一行開始取區域內碼,因為編碼表按編碼序排,所以可自動按序建層次
city_bm=dw_tree.getitemstring(j,"city_bm")
city_name=dw_tree.getitemstring(j,"city_name")
//取區域名稱
k=len(city_bm)
z=int(k)//取內碼的位數
choose case z
case 2
tvi.label=city_name
//把編碼值賦給tvi
tvi.data=city_bm tvi.pictureindex=2
tvi.selectedpictureindex=3
//以根專案為父專案,插入第二層專案,以後凡是檢索到位數是二的,均在此生成二層目錄
tvi_root1=tv_1.insertitemlast(tvi_root,tvi)
case 4
//以後凡是檢索到位數是四位,均生成第三層目錄
tvi.label=city_name
tvi.data=city_bm
tvi.pictureindex=2
tvi.selectedpictureindex=3
tvi_next=tv_1.insertitemlast(tvi_root1,tvi)
end choose
j=j+1
loop
tv_1.setredraw(true)
currenthandle=tv_1.finditem(roottreeitem!,0)
//查詢根目錄下的第一專案
tv_1.expanditem(currenthandle) //預設開啟此專案
圖1圖1是執行此段程式後形成的樹形結構,該程式在windows 98、powerbuilder 6.5下執行通過。
樹形結構在關聯式資料庫中的設計
在程式設計中,經常以樹形結構表示資料的層次關係,如選單的結構 商品的分類等。這樣的層次結構在關聯式資料庫中難以直觀地表示。常見的一種做法是用乙個字段指向上級節點來表示記錄的上下級關係。fidpid fname 1 food 21 fruit32 red4 3cherry52 yellow65 ban...
資料庫版 樹形生成結構
測試資料 declare t table id char 3 pid char 3 name nvarchar 10 insert t select 001 null 山東省 union all select 002 001 煙台市 union all select 004 002 招遠市 unio...
資料庫儲存樹形結構的資料
最近接觸樹形結構資料非常的多,幾乎超過了過去8年多,開發所有系統的總和.本來嘛,一般的遞迴就可以解決了,可是這個系統中總是需要頻繁的訪問樹結點,及父結點,子結點,動不動就要遞迴,且樹的使用非常之多,做的多了搞的人都要嘔吐了,下面在網上找到幾篇比較有用的資料,記錄彙總一下.首先,資料庫不一定要用傳統的...