在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

010403b1.jpg
  圖1是運行此段程序後形成的樹形結構,該程序在Windows 98、PowerBuilder 6.5下運行通過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章