在PB中快速實現數據庫樹形結構
2024-07-21 02:10:19
供稿:網友
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。在pb中快速實現數據庫樹形結構
(作者:阮曉華 2001年04月03日 17:23)
樹形結構在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下運行通過