在PB中快速实现数据库树形结构 树形结构在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) //缺省打开此项目
该程序在Windows 98、PowerBuilder 6.5下运行通过。

（阮晓华）