首页 > 开发 > 综合 > 正文

在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下运行通过
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表