在PB中快速實現數據庫樹形結構
在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下運行通過
(作者:阮曉華 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下運行通過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.