在PB中快速实现数据库树形结构

合集下载

PB树视图

PB树视图

树的遍历:函数TreeList(long handle)long ll_HandleTreeviewitem ltvi_Itemll_Handle = Tv_Tree.finditem(ChildTreeItem!,handle)do while ll_Handle <> -1Tv_Tree.Getitem(ll_Handle ,ltvi_Item)//根据ltvi_Item做相应的操作ltvi_Item即取出的节点,ltvi_Item.statepictureindex 节点状态,一般用来区分复选框ltvi_bel 节点标题ltvi_Item.data 节点创建时存放的数据TreeList(ll_Handle)ll_Handle = Tv_Tree.finditem(NextTreeItem!,ll_handle)looptreeviewname.ExpandItem ( itemhandle ) 树控件展开哪个节点treeviewname.ExpandAll ( itemhandle ) 树控件展开某个节点的所有子节点,一般用于根节点。

Treeviewname.finditem(firstviewvisibletreeitem,0) 这是获得可见树的第一个节点,一般用来,获取根节点,但是当节点过多时则根节点就会被隐藏,此时就不能得到根了,此时就要用到Treeviewname.selectitem(handle)Treeviewname.selectitem(handle) 当我们展开的节点多时,视觉就会移到下一页,此时用它则会将视觉焦点放到该节点。

treeviewname.InsertItemFirst ( handleparent, item ) 在父亲节点下插入第一个子节点。

treeviewname.SetItem ( itemhandle, item ) 它可以修改节点的属性,不是覆盖节点。

一种快速生成树结构的数据库设计方法

一种快速生成树结构的数据库设计方法

一种快速生成树结构的数据库设计方法专利名称:一种快速生成树结构的数据库设计方法技术领域:本发明涉及计算机技术领域,更具体的说,涉及应用系统中的数据库设计领域。

背景技术:目前,在传统的应用系统中,树形结构数据库的设计都是子节点记录父节点的ID,页面展现时采用递归的方式生产树形结构,这种设计方法使大数据量展现时严重影响系统效率,有可能导致整个应用系统处于假死状态。

发明内容本发明的目的是提供一种快速生成树结构的数据库设计方法,所述方法在所有的应用系统中生成树结构数据时采用直接排序的方式直接生成。

为了解决现有技术存在的困难,达到上述目的,本发明提供了一种快速生成树结构的数据库设计方法,所述方法包括如下步骤步骤一、在具有树状关系数据的数据库中创建二维表,包括树结构信息表,用于记录树结构中的节点信息;Sort表,与所述树结构信息表进行关联,用于记录树结构的节点之间的关系,每个节点具有一Sort ID值;步骤二、对所述树结构信息表中的节点信息进行修改时,将修改信息保存到所述树结构信息表中,并将修改信息在Sort表中进行关联,然后在同一事务中重新排序所述Sort表,以使修改后的树结构关系记录在所述Sort表中;步骤三、按Sort表中的字段ID值排序读取数据,查询树结构信息。

优选的是,所述节点信息包括节点ID、节点名称、其父节点ID及其其他属性值信息的描述。

优选的是,所述Sort表中包括Sort ID、节点ID及其父节点ID、排序类型、节点所属层级节点在所属层级的具体位置。

优选的是,步骤二中所述的节点信息的修改包括增加和删除子节点。

本发明的有益效果是本发明所述的快速生成树结构的数据库设计方法,使得在所有的应用系统中生成树结构数据时不采用递归方式,而采用直接排序的方式直接生成,提高了运行效率,节省了服务器资源;独特的数据库结构设计,把生成树时占用的资源进行合理分配,把部分资源占用转移到新增、删除节点时,来提高生成树结构效率;本发明所述方法大大简化了生成树结构的过程,用简单的Sql查询语句排序查询即可。

在PB中快速实现数据库树形结构

在PB中快速实现数据库树形结构

在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,currentnextint i,j,z,kstring city_bm,city_nametreeviewitem tvi//定义一个树形数据类型的变量tv_1.setredraw(false)dw_tree.settransobject(trooptrans) //连接数据库dw_tree.retrieve()i=dw_tree.rowcount()j=1//定义树形变量的属性,设置根目录的标签,若在编码表中有此根目录,则不用在此生成bel="城市"//生成根目录// 目录未打开时的图片索引,此图片可在树形控件中设定tvi.pictureindex=1//目录打开时的图片索引tvi.selectedpictureindex=3tvi_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 zcase 2bel=city_name//把编码值赋给tvitvi.data=city_bm tvi.pictureindex=2tvi.selectedpictureindex=3//以根项目为父项目,插入第二层项目,以后凡是检索到位数是二的,均在此生成二层目录tvi_root1=tv_1.insertitemlast(tvi_root,tvi)case 4//以后凡是检索到位数是四位,均生成第三层目录bel=city_nametvi.data=city_bmtvi.pictureindex=2tvi.selectedpictureindex=3tvi_next=tv_1.insertitemlast(tvi_root1,tvi)end choosej=j+1looptv_1.setredraw(true)currenthandle=tv_1.finditem(roottreeitem!,0)//查找根目录下的第一项目tv_1.expanditem(currenthandle) //缺省打开此项目图1图1是运行此段程序后形成的树形结构,该程序在Windows 98、PowerBuilder 6.5下运行通过。

springboot+mybatisplus实现树形结构查询

springboot+mybatisplus实现树形结构查询

springboot+mybatisplus实现树形结构查询⽬录背景使⽤场景设计思路递归模型实现代码注意事项总结背景实际开发过程中经常需要查询节点树,根据指定节点获取⼦节点列表,以下记录了获取节点树的操作,以备不时之需。

使⽤场景可以⽤于系统部门组织机构、商品分类、城市关系等带有层级关系的数据结构;设计思路递归模型即根节点、枝⼲节点、叶⼦节点,数据模型如下:id code name parent_code110000电脑0220000⼿机0310001联想笔记本10000410002惠普笔记本1000051000101联想拯救者1000161000102联想⼩新系列10001实现代码表结构CREATE TABLE `tree_table` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',`code` varchar(10) NOT NULL COMMENT '编码',`name` varchar(20) NOT NULL COMMENT '名称',`parent_code` varchar(10) NOT NULL COMMENT '⽗级编码',PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='树形结构测试表';表数据INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10000', '电脑', '0');INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10001', '联想笔记本', '10000');INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10002', '惠普笔记本', '10000');INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000101', '联想拯救者', '10001');INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000102', '联想⼩新系列', '10001');实体@Data@TableName("tree_table")@EqualsAndHashCode(callSuper = false)@Accessors(chain = true)public class TreeTable {* 主键ID*/@TableId(type = IdType.AUTO)private Integer id;/*** 编码*/private String code;/*** 名称*/private String name;/*** ⽗级编码*/private String parentCode;/*** ⼦节点*/@TableField(exist = false)private List<TreeTable> childNode;}mybatismapperpublic interface TreeTableMapper extends BaseMapper<TreeTable> {/*** 获取树形结构数据** @return 树形结构*/public List<TreeTable> noteTree();}xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.springboot.example.mysqltree.mapper.TreeTableMapper"><resultMap id="BaseResultMap" type="com.springboot.example.mysqltree.model.entity.TreeTable"><result column="id" property="id"/><result column="code" property="code"/><result column="name" property="name"/><result column="parent_code" property="parentCode"/></resultMap><resultMap id="NodeTreeResult" type="com.springboot.example.mysqltree.model.entity.TreeTable"extends="BaseResultMap"><collection property="childNode" column="code" ofType="com.springboot.example.mysqltree.model.entity.TreeTable" javaType="java.util.ArrayList" select="nextNoteTree"></collection></resultMap><sql id="Base_Column_List">id,code,`name`,parent_code</sql><select id="nextNoteTree" resultMap="NodeTreeResult">select<include refid="Base_Column_List"/>from tree_tablewhere parent_code=#[code]</select><select id="noteTree" resultMap="NodeTreeResult">select<include refid="Base_Column_List"/>from tree_tablewhere parent_code='0'noteTree :获取所有⽗级节点数据;nextNoteTree:循环获取⼦节点数据,知道叶⼦节点结束;column:关联表的列名;ofType:返回类型启动类@Slf4j@Componentpublic class TreeTableCommandLineRunner implements CommandLineRunner { @Resourceprivate TreeTableMapper treeTableMapper;@Overridepublic void run(String... args) throws Exception {(JSONUtil.toJsonPrettyStr(treeTableMapper.noteTree()));}}最终效果[{"code": "10000","childNode": [{"code": "10001","childNode": [{"code": "1000101","childNode": [],"parentCode": "10001","name": "联想拯救者","id": 5},{"code": "1000102","childNode": [],"parentCode": "10001","name": "联想⼩新系列","id": 6}],"parentCode": "10000","name": "联想笔记本","id": 3},{"code": "10002","childNode": [],"parentCode": "10000","name": "惠普笔记本","id": 4}],"parentCode": "0","name": "电脑","id": 1}]注意事项使⽤mybatis时如加载不到mapper xml需在pom.xml添加以下配置:<resources><resource><directory>src/main/resources</directory><filtering>true</filtering><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>总结使⽤递归⽅式是⽐较常见的⽅式,优点是实现简单,直观的体现层级关系,但是数据量⼤的情况下效率会略低;欢迎使⽤其他⽅式的⼩伙伴分享⾃⼰的实现思路。

php 数组树状实现方法

php 数组树状实现方法

php 数组树状实现方法PHP是一种广泛应用于Web开发的编程语言,它提供了丰富的数据结构和函数库,使得开发人员能够轻松地处理各种数据。

在PHP 中,数组是一种非常常用的数据结构,它可以存储多个值,并且可以通过索引或关联键来访问这些值。

本文将介绍如何使用PHP数组来实现树状结构。

树状结构是一种层次化的数据结构,其中每个节点可以有多个子节点。

在PHP中,我们可以使用多维数组来表示树状结构,其中每个节点都是一个数组,包含子节点的数组。

我们需要定义一个包含节点和子节点的数组。

节点可以是任意类型的值,例如字符串、整数或对象。

子节点是一个包含其他节点的数组。

通过将子节点数组作为节点数组的元素,我们可以构建出树状结构。

下面是一个简单的示例,展示了如何使用PHP数组来表示一个树状结构:```php$tree = array('node1' => array('node1.1' => array(),'node1.2' => array('node1.2.1' => array(),'node1.2.2' => array())),'node2' => array('node2.1' => array(),'node2.2' => array()));```在上面的示例中,我们定义了一个包含两个节点的树状结构。

每个节点都是一个关联数组,其中键表示节点的名称,值表示子节点的数组。

通过这种方式,我们可以轻松地表示任意复杂度的树状结构。

要访问树状结构中的节点,我们可以使用数组索引或关联键。

例如,要访问节点1.2.1,我们可以使用以下代码:```php$node = $tree['node1']['node1.2']['node1.2.1'];```通过这种方式,我们可以在树状结构中快速定位到特定的节点,并对其进行操作。

问:如何能够在PB运行中得到任意表的结构

问:如何能够在PB运行中得到任意表的结构

减肥药哪种好:www.hogoo8.com1、问:如何能够在PB运行中得到任意表的结构?如域名,属性等。

谢谢!答:直接访问DBMS的系统表或系统视图。

以ORACLE为例.SYS.ALL_TAB_COLUMNS等视图中包含你要的信息。

2、PB + Sybase SQL Anywhere C/S配置问:本人用PB的SQL Anywhere 5,在局域网选一台pc用Network server安装,选另一pc用Network client安装。

在服务器上创建数据库及一表后,在客户端配置ODBC 时,在database file 选Network方式,系统不认!在服务器端启动数据库后,在客户端点击DB Profile-ODBC- 选Database server-connect 后,系统显示:SQLSTATE=08001[sybase][ODBC]unable to connect to database server:unable to start database engine.请问高手,我该如何解决?非常感谢!答:请教高手?Sorry,其实我只是PB菜鸟。

记得大概半个多月前我在这儿发过一个贴子,里面谈及我的C/S配置,可适没人回应。

我的做法如下:(1)环境:NT4.0+sql anywhere5.5+PB6.5(2)服务器以server方式安装sql anywhere,用dbsrv50启动数据库服务(3)客户机以client方式安装sql anywhere,新建odbc数据源(名称与下面ini 文件内的配置一致,数据库为服务器上的数据库,选择network方式)(4)客户机安装PB开发之应用软件,包括:exe文件,pbd动态链接库,dll支持库,一个ini用户配置文件(内有[database]配置)(5)在客户机桌面上建立程序之快捷方式,点击图标,数十秒后程序成功启动。

其实我也不清楚这是否算是一个合理的C/S应用,Kokuc在电脑报上发表的文章相信你也看过,相当有用,可作参考。

浅谈如何利用PB实现树型列表动态半透明提示

浅谈如何利用PB实现树型列表动态半透明提示

浅谈如何利用PB实现树型列表动态半透明提示4、创建用户函数wf_maketrans,用于实现半透明效果:Long hDCscr,bhandle,hdest,frmdc,BlendLng,copywidth,copyheight,copyleft,copytop,retlong copywidth2,copyheight2,copyleft2,copytop2,mledcLong xDeviation,yDeviationblendfunction BlendWindow lw_tmp//BlendLng = 11796480Blend.SourceConstantAlpha = char(trans)CopyMemory2(BlendLng, Blend, 4)lw_tmp=frm.getparent()//lw_tmp.setredraw(true)copywidth = UnitsToPixels(frm.Width, XUnitsToPixels!)copyheight = UnitsToPixels(frm.Height, YUnitsToPixels!)copywidth2 = UnitsToPixels(mle.Width, XUnitsToPixels!)copyheight2 = UnitsToPixels(mle.Height, YUnitsToPixels!)//上述代码用于坐标体系转换frm.x = xposfrm.y = yposIf lw_tmp.Border <> false ThenyDeviation = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) xDeviation = GetSystemMetrics(SM_CXFRAME)ElseyDeviation = 0xDeviation = 0End Ifif trim(lw_tmp.menuname) <> "" thenyDeviation = yDeviation + GetSystemMetrics(SM_CYMENU)end if//也可以用CLIENTTOSCREEN进行转换copyleft = UnitsToPixels((lw_tmp.x + xpos), XUnitsToPixels!) + xDeviationcopytop = UnitsToPixels((lw_tmp.y + ypos), YUnitsToPixels!) + yDeviationcopyleft2 = UnitsToPixels(mle.x, XUnitsToPixels!)copytop2 = UnitsToPixels(mle.y, YUnitsToPixels!)//上述代码用于坐标体系转换hDCscr = GetDC(0)//获取屏幕的设备句柄hdest = CreateCompatibleDC(hDCscr)bhandle = CreateCompatibleBitmap(hDCscr, copywidth, copyheight)ret = SelectObject(hdest,bhandle)frmdc = getdc(handle(frm))mledc = getdc(handle(mle))//此句可加可不加,主要是起清除原来图象目的,防止图象重叠,VB中此处必须要.cls,因为它具有AUTOREDRAW能力//frm.setredraw(true)//mle.setredraw(true)//'此处一定要等待一段时间,否则窗体来不及hide,就已经被重新抓屏了Sleep(100)ret = BitBlt(hdest, 0, 0, copywidth, copyheight, hDCscr, copyleft , copytop , 13369376)//上述代码即将屏幕的截图拷贝到内存缓存区域//VB中FORM具有AUTOREDRAW的属性可以自动重画,PB无此能力,只好在此处就得显示出来if ib_first thenwf_setrgn(frm)end iffrm.Visible = Trueif ib_first thenwf_setrgn(frm)ib_first = falseend ifret = AlphaBlend(frmdc, 0, 0, copywidth, copyheight, hdest, 0, 0, copywidth, copyheight, BlendLng)ret = AlphaBlend(mledc, 0, 0, copywidth2, copyheight2, hdest, copyleft2 , copytop2, copywidth2, copyheight2, BlendLng)//上述代码将内存缓存区域中的截图拷贝到气泡UO和其上的MLE_1控件的HDC//setnewrgn frmwf_setrgn(frm)ret = ReleaseDC(0, hDCscr)ret = ReleaseDC(handle(frm), frmdc)ret = ReleaseDC(handle(mle), mledc)ret = DeleteDC(hdest)ret = DeleteObject(bhandle)//最后释放或删除获取的内存对象四、气泡形状效果实现1、声明本地外部函数:Function ulong CreateRectRgn(ulong X1,ulong Y1,ulong X2,ulong Y2) LIBRARY "gdi32.dll"Function ulong CreateRoundRectRgn(ulong X1,ulong Y1,ulong X2,ulong Y2,ulong X3,ulong Y3) LIBRARY "gdi32.dll"Function ulong CreatePolygonRgn(ref POINTAPI lpPoint[],ulong nCount,ulong nPolyFillMode) LIBRARY "gdi32.dll"Function ulong CombineRgn(ulong hDestRgn,ulong hSrcRgn1,ulong hSrcRgn2,ulong nCombineMode) LIBRARY "gdi32.dll"Function ulong CreateSolidBrush(ulong crColor) LIBRARY "gdi32.dll"Function ulong FrameRgn(ulong hdc,ulong hRgn,ulong hBrush,ulong nWidth,ulong nHeight) LIBRARY "gdi32.dll"Function ulong SetWindowRgn(ulong hWnd,ulong hRgn,boolean bRedraw) LIBRARY "user32.dll"2、创建用户函数wf_setrgn,用于创建气泡形状控件,该函数在上一小节的用户函数wf_maketrans中予以调用:long rgn_1,rgn_2,myrgn,hhbr,w,h,retPOINTAPI shapev[]//初始化长、宽边距w = UnitsToPixels(frm.Width, XUnitsToPixels!)h = UnitsToPixels(frm.Height, YUnitsToPixels!)//初始化右下脚三角顶点坐标shapev[1].X = w * (1 / 8)shapev[1].Y = h - 30shapev[2].X = 0shapev[2].Y = hshapev[3].X = w * (3 / 8)shapev[3].Y = h - 30//开始创建指定图形区域myrgn = CreateRectRgn(0, 0, 0, 0)rgn_1 = CreateRoundRectRgn(0, 0, w, h - 20, 20, 20) //创建椭圆角矩形区域rgn_2 = CreatePolygonRgn(shapev[],3,1)//创建任意多边形区域//合并最终图形ret = CombineRgn(myrgn, rgn_1, rgn_2, 2)// 创建用户自定义颜色刷子hhbr = CreateSolidBrush(16479614)//对最终图形画边框ret = FrameRgn(getdc(handle(frm)), myrgn, hhbr, 1, 1)//设置当前窗体使用此区域ret = SetWindowRgn(handle(frm), myrgn, True)//释放各对象ret = DeleteObject(myrgn)ret = DeleteObject(rgn_1)ret = DeleteObject(rgn_2)ret = DeleteObject(hhbr)2、利用上述代码可以轻松实现任务栏右下脚提示效果,如图:至此,树型列表动态半透明效果提示全部完成,效果图见:。

树形目录在PB中的实现与应用

树形目录在PB中的实现与应用

树形目录在PB中的实现与应用1.引言在管理信息系统的开发中,经常需要获取本地计算机中的树形目录结构和相应的文件信息,如进行目录的选择和特殊文件的选取,在PB中并没有提供专门的树形目录对象,这样就需要程序开发人员自己来实现相应的树形目录。

本文针对这种情况,提供了一种用纯PB代码实现树形结构的方法。

2.PB中树形目录的实现方法PB中的ListBox列表框控件提供了显示目录和文件的能力。

在程序中可以利用PB的树形控件TreeView动态生成树形目录结构。

我们使用ListBox控件的函数DirList来实现,函数DirList以满足条件的文件名填充列表框的列表项,其使用方法如下:listboxname.DirList(文件模式,文件类型)其中文件类型的值如下所示:在程序中可将几种类型的值相加以获取相应的文件或目录信息。

下面结合一个实例介绍树形目录的实现方法。

通过树形目录可以获取计算机中的任意目录,然后显示需要显示的文件(本例中显示浏览器可以查看的文件类型:htm,html,swf,gif,jpg,txt等)。

程序中主要使用的控件如下所示:程序具体实现分成以下几个步骤:第一步:在tv_dir的constructor事件中生成所有驱动器信息,代码如下:String ls_DriverTypelb_dir.DirList("",16384)li_count = lb_dir.totalitems()IF li_count > 0 thenfor i = 1 to li_countltvi_bel = lb_dir.Text(i)ltvi_New.Data = i -1ltvi_New.Children = TRUE//根据驱动器类型设置图标ls_DriverType=uf_drivetype(lb_dir.Text(i))//函数uf_drivetype用来获取驱动器类型,根据类型设置图标Choose case ls_DriverTypecase "REMOVABLE"ltvi_New.PictureIndex = 5ltvi_New.SelectedPictureIndex =5CASE "FIXED"ltvi_New.PictureIndex = 1ltvi_New.SelectedPictureIndex =2CASE "CDROM"ltvi_New.PictureIndex = 6ltvi_New.SelectedPictureIndex =6END CHOOSEThis.InsertItemlast(0, ltvi_New)nextThis.selectitem(1)End if第二步,在tv_dir的itempopulate事件中生成相应目录的下级目录信息:For li_i=1 to li_numls_Data=lb_dir.Text(li_i)If Mid(ls_data,1,1)="[" Thenltvi_bel =mid(ls_data,2,len(ls_data) -2 )ltvi_New.Data = 1LB_next.dirlist(ls_driver+":\"+ltvi_bel,16+32768)if lb_next.totalitems()>1 Thenltvi_New.Children = TRUEelseltvi_New.Children = FalseEnd ifltvi_New.PictureIndex = 3ltvi_New.SelectedPictureIndex =4tv_dir.InsertItemlast(handle, ltvi_New)End ifNextEnd IfIF li_level>=2 Then //选择目录树中的子目录ls_driver=uf_get_dir(li_level,tv_dir,handle,ltvi_bel)lb_dir.DirList(ls_Driver,16+32768) //显示当前目录子目录信息li_num=lb_Dir.totalitems()For li_i=1 to li_numls_Data=lb_dir.Text(li_i)If Mid(ls_data,1,1)="[" and mid(ls_data,2,2)<>".." Thenltvi_bel =mid(ls_data,2,len(ls_data) -2 )ltvi_New.Data = 1LB_next.dirlist(ls_driver+"\"+ltvi_bel,16+32768)if lb_next.totalitems()>1 Thenltvi_New.Children = TRUEelseltvi_New.Children = FalseEnd ifltvi_New.PictureIndex = 3ltvi_New.SelectedPictureIndex =4tv_dir.InsertItemlast(handle, ltvi_New)End ifNextEnd If第三步:当用户单击某一具体目录时,显示该目录中满足条件的文件名,代码如下:Int li_num,li_i,li_long,iTreeViewItem ltvi_curString ls_dir,ls_dataString Filetype[8]//设定需要显示的文件类型filetype[1]=".htm"filetype[2]=".html"filetype[4]=".swf"filetype[5]=".gif"filetype[6]=".jpg"filetype[7]=".shtml"filetype[8]=".txt"li_long=8this.GetItem(handle,ltvi_cur)If ltvi_cur.level=1 thenls_dir=mid(ltvi_bel,3,1)+":\"elsels_dir=uf_get_dir(ltvi_cur.level,this,handle,ltvi_bel)end ifis_dir=ls_dirLb_next.DirList(ls_dir+"\*.*",0+1+2+4+32) //显示所有文件li_num=lb_Dir.totalitems()lb_file.Reset()//将指定文件显示在列表框中For li_i=1 to li_numls_Data=lb_next.Text(li_i)For i=1 to li_longif match(lower(Right(ls_data,len(FileType[i]))),Filetype[i]) then lb_file.addItem(ls_data)NextNext第四步:在OLE控件中显示所选文件的内容,主要代码如下:其中程序中使用的uf_get_dir为用户自定义函数,该函数用来获取所选定目录的完整路径。

mysql生成树形结构知识点

mysql生成树形结构知识点

mysql生成树形结构知识点
生成树形结构是指根据某个表中的数据,构建出一个树状的结构,其中每个节点都有一个或多个子节点。

在MySQL中,可以使用以下几种方法来生成树形结构:
1. 递归查询:使用递归查询可以直接从表中查询出树形结构。

一般使用WITH RECURSIVE语法来实现,可以不断地迭代查询,直到找到根节点为止。

2. 嵌套集模型(Nested Set Model):嵌套集模型是一种将树状结构表示为一系列的左右值的方法。

根据左右值可以方便地查询到某个节点的所有子节点,以及该节点的父节点。

3. 路径枚举模型(Path Enumeration Model):路径枚举模型是一种将树状结构表示为路径字符串的方法。

每个节点都有一个路径字符串,包含了从根节点到该节点的路径。

可以通过匹配路径字符串来查询子节点和父节点。

4. 存储过程:使用存储过程来逐层构建树形结构。

可以通过循环迭代查询,并逐层插入数据到结果表中,最终构建出树形结构。

以上是一些常见的方法,每种方法都有其适用的场景和使用方式。

选择合适的方法取决于具体的需求和数据结构。

PB中树形视图的实现与数据库表结构的设计

PB中树形视图的实现与数据库表结构的设计

PB中树形视图的实现与数据库表结构的设计
周咏梅
【期刊名称】《金融科技时代》
【年(卷),期】2004(012)001
【摘要】树形视图控件最适合显示具有层次关系的数据,类似于 Windows 的资源管理器,有关信息项如文件和文件夹 (子目录 )等等呈树状层次结构,能更清晰地表现主、细目关系,操作非常方便,因而在多种开发工具中,都有该控件.在 Powerbuilder 中,将树形视图与 Datawindow或 Datastore配合使用,是管理大量数据的好方法,因为用户只需简单地点击鼠标就可以选择、操纵自己需要的数据.
【总页数】4页(P50-53)
【作者】周咏梅
【作者单位】中国人民银行黄山市中心支行
【正文语种】中文
【中图分类】TP3
【相关文献】
1.航天器电测数据库表结构的设计与实现 [J], 张海祥;何晓宇;李鹏;吕伟
2.Delphi中快速实现数据库树形结构并实现Treeview导航表数据 [J], 王毅;陈立亮;刘瑞祥
3.基于树表结构的Delphi数据库动态分类构件的设计与实现 [J], 袁裕辉
4.基于关系型数据库的树形结构设计与实现 [J], 吕刚;蒋勇铭;王军
5.基于C#的数据库表结构报表系统的设计与实现 [J], 欧微;程岚;陈圣荣
因版权原因,仅展示原文概要,查看原文内容请购买。

PB下使用TreeView控件实现多级分类检索

PB下使用TreeView控件实现多级分类检索

PB下使⽤TreeView控件实现多级分类检索PB下使⽤TreeView控件实现多级分类检索2006-07-01 11:15:12 作者:来源:浏览次数:168 ⽹友评论0条⽂字⼤⼩:【⼤】【中】【⼩】评分等级:0PowerBuilder 中的TreeView 控件为树状列表,其特点是信息项呈树状层次结构,且形式灵活,可展开也可回缩,使⽤⿏标进⾏控制,操作简便。

因此在应⽤中,可将其与DataWindow 配合,⼀个提供信息的分类体系,⼀个提供具体信息,实现信息的多级分类检索,这样可⼤⼤地⽅便查询,提⾼系统的实⽤性。

---- 在PowerBuilder 下,TreeView 控件的开发技术⼀般较为复杂,但如果将它的构成机制及主要事件、函数领会清楚,掌握它并不困难。

下⾯就是使⽤TreeVi ew 控件实现多级分类检索涉及的主要开发技术。

⼀、TreeView 控件的信息构成及创建---- TreeView 控件的基本信息单位是TreeViewItem 项,它们按树状层次结构进⾏组织(如图1 所⽰),每个TreeViewItem 项⼀般具有下列主要属性:---- Data:Any 类型数据,该项对应的内部值。

---- Label:String 型数据,该项对应的显⽰⽂字。

---- Children:Boolean 型数据,为Ture 时表⽰该项还有下⼀层(如图1 中项item1),为False 时表⽰该项没有下层,不能被展开(如项item111)。

---- PictureIndex:Integer 型数值,该项对应的正常图标在图标队列中的编号。

---- SelectedPictureIndex:Integer 型数值,该项对应的选中图标在图标队列中的编号。

---- 通过TreeView 控件查阅信息,⾸先要将信息转化成相应的Tre eViewItem 项,插⼊到TreeView 控件中。

这个⼯作可借助PB提供的函数来完成。

pb实验步骤

pb实验步骤

1.建立数据库。

启动powerbuilder(pb)——单击database图标按钮——Select Tables 的Cancel——file——create database(数据库名:employee。

Browse为数据库的存储路径)——ok。

(密码和用户名要知道)2.建立数据库中的表。

Table图标——写明字段名、类型、长度、是否为空。

——save(保存,table name:emp)——ok——close定义关键字:右键表emp——property——primary key——点击emp_id——ok(设置sex编辑风格等)数据的装入:DB Administration——输入:insert into emp values('101','刘然','01','吉林','女',//或者0,1'1970/09/02','副经理',3200,'出生于吉林市,93年参加工作,毕业于人民大学。

');——exceute图标——也可以保存表save图标。

——return按钮返回。

还可以利用data manipulation(grid)等3个图标进行手动添加,删除,插入信息。

3 创建应用。

单击application图标——file——new新建应用保存路径,名字:pbtutor。

——no Window图标——new新建——标题设为“welcome”,类型:response——拖拽三个静态文本框(static text)两个单行编辑器(single line edit)两个按钮(commond button):其中:文本框名字:st_welcome,st_userid,st_passwd.。

两个编辑器名:sle_userid,sle_passwd。

两个按钮名:cb_ok,cb_cancel。

数据库数据转树形结构的两种方式

数据库数据转树形结构的两种方式

数据库数据转树形结构的两种⽅式通常数据库存储树形数据⼀般采取这种形式:我们会创建⼀个对应的实体类package cn.kanyun.build_tree;import java.util.List;/*** 节点类* 部分字段添加transient关键字是为了,在Json序列化时不序列化该字段** @author KANYUN**/public class Node {private Long id;private Long parentId;private String name;private transient String parentName;private transient boolean isDir;private transient String path;private List<Node> children;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getParentId() {return parentId;}public void setParentId(Long parentId) {this.parentId = parentId;}public String getName() {return name;}public void setName(String name) { = name;}public String getParentName() {return parentName;}public void setParentName(String parentName) {this.parentName = parentName;}public boolean isDir() {return isDir;}public void setDir(boolean isDir) {this.isDir = isDir;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public List<Node> getChildren() {return children;}public void setChildren(List<Node> children) {this.children = children;}@Overridepublic String toString() {return "Node [id=" + id + ", parentId=" + parentId + ", name=" + name + "]"; }}第⼀种处理⽅式:递归package cn.kanyun.build_tree;import java.sql.SQLException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.atomic.AtomicInteger;import com.google.gson.Gson;import cn.hutool.db.Db;import cn.hutool.db.Entity;import cn.hutool.db.sql.Condition;/*** 递归构建树深度优先遍历(DFS)** @author KANYUN**/public class Recursion2Tree {/*** 定义根节点*/static Node root = new Node();/*** 所有的节点数据*/static List<Node> nodeList = new ArrayList();public static void main(String[] args) throws Exception {// TODO Auto-generated method stublong startTime = System.currentTimeMillis();Recursion2Tree tree = new Recursion2Tree();// 从数据库中获取数据,并进⾏类型转换开始List<Entity> result = e().query("SELECT * FROM daasfolder_copy1");for (Entity entity : result) {Node node = new Node();node.setId(entity.getLong("id"));node.setParentId(entity.getLong("parentid"));node.setPath(entity.getStr("path"));node.setName(entity.getStr("name"));nodeList.add(node);}// 从数据库中获取数据,并进⾏类型转换结束// 初始化根节点的childrenroot.setChildren(new ArrayList<Node>());// 构建根节点tree.buildRoot(nodeList);// 递归⼦节点tree.buildChildren();// 完成打印Gson gson = new Gson();System.out.println(gson.toJson(root.getChildren()));System.out.println("耗时:" + (System.currentTimeMillis() - startTime));}/*** 构建顶级树,即找到根节点下的数据** @param nodeList*/private void buildRoot(List<Node> nodeList) {Iterator<Node> iterator = nodeList.iterator();while (iterator.hasNext()) {Node node = iterator.next();if (node.getParentId() == 0) {// 找到根节点下的数据,将其添加到root下,并将该节点从所有的节点列表中移除root.getChildren().add(node);iterator.remove();}}}/*** @return void* @throws Exception* @Author 赵迎旭* @Description 构建⼦节点* @Date 14:48 2020/9/18* @Param []**/private void buildChildren() throws Exception {// 如果元数据没有被删除完,说明还有数据没有挂到相应的节点上,则继续循环while (nodeList.size() > 0) {Iterator<Node> iterator = nodeList.iterator();build: while (iterator.hasNext()) {Node node = iterator.next();// 是否找到⽗节点,(注意这⾥使⽤的是原⼦类型,因为原⼦类型是引⽤类型)AtomicBoolean isFind = new AtomicBoolean(false);// 从根节点下的所有⼀级⼦节点开始递归遍历DFSfor (Node pNode : root.getChildren()) {recursion(node, pNode, iterator, isFind);if (isFind.get()) {continue build;}}// 如果该node在上⾯的递归中没有找到⽗节点// 出现这种问题⼀般是两个原因:// 1.就是数据的顺序是乱的,即当前遍历的节点的⽗节点还没有挂到树上处理⽅法:跳过该Node继续遍历 // 2.当前节点的⽗节点,不存在(除⾮当前节点是根节点下的节点) 处理⽅法:抛出异常if (!isFind.get()) {// 则看剩下的Node集合中是否存在该node的⽗节点for (Node pNode : nodeList) {if (pNode.getId().equals(node.getParentId())) {// 如果存在则继续外层遍历循环continue build;}}// 否则抛出异常throw new Exception("当前Node节点找不到⽗节点:" + node.toString());}}}}/*** @return boolean* @Description 递归添加* @Date 14:49 2020/9/18* @Param [bean, beanList]**/private void recursion(Node node, Node pNode, Iterator<Node> iterator, AtomicBoolean isFind) {Long id = pNode.getId();Long parent_id = node.getParentId();if (parent_id.equals(id)) {if (pNode.getChildren() == null) {List<Node> children = new ArrayList<>();pNode.setChildren(children);}pNode.getChildren().add(node);iterator.remove();isFind.set(true);;return;}if (pNode.getChildren() != null) {for (Node currentPNode : pNode.getChildren()) {recursion(node, currentPNode, iterator, isFind);}}}}可见递归构造树形数据分两步:1.构建根节点下的所有⼀级⼦节点2.未挂载的节点开始循环遍历递归尝试挂载到根节点下的⼀级⼦节点下第⼆种⽅式:我们尝试更改⼀下数据库的结构,增加每个节点的路径,如图所⽰:那么我们就可以得到另⼀种处理树形结构的⽅法:package cn.kanyun.build_tree;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import com.google.gson.Gson;import cn.hutool.db.Db;import cn.hutool.db.Entity;/*** 循环构建树⼴度优先遍历(BFS)** @author KANYUN**/public class FlatPath2Tree {/*** 同⼀层级的数据放在Map中,层数为key。

数据库应用系统开发工具(PB)

数据库应用系统开发工具(PB)

5
第9章 数据库应用系统开发工具—PB
9.1.1 C/S体系结构
C/S结构具有以下优点:
(1)采用该体系结构可缩短软件系统的开发周期。
C/S体系结构将处理权力下放到客户端,因此客户端用户拥 有强大的处理能力,这在很大程度上激发了终端用户的积极性, 提高了工作效率。 (2)提高系统性能。 在该体系结构下,处理是分布式的,由众多的CPU参与处理, 从而提高了整个系统的效率。 (3)采用该体系结构开发的系统具有柔性。 从组织运营和技术两方面提高了组织的柔性。
4
第9章 数据库应用系统开发工具—PB
9.1.1 C/S体系结构
C/S体系结构将整个系统划分为两层:一层驻留在 客户端,一般由应用程序及相应的数据库连接程序构成, 另一层安装在服务器端,通常是某个数据库系统,包括 数据库和服务器组件。客户端软件的主要功能是处理与 用户的交互、按照某种业务逻辑进行处理以及与数据库 进行交互,服务器端数据库系统根据客户端的请求进行 数据库操作,然后将结果传送给客户端。客户端与服务 器端(数据库)软件之间的交互通过SQL语句进行。
16
第9章 数据库应用系统开发工具—PB
9.1.1 C/S体系结构
③ 视图允许用户以不同的方式查询同样的数据。 ④ 安全性。通过视图用户只能查询或修改他们所能见到 的数据。通过使用视图和有选择的授权,用户可被限制 在使用数据的不同子集上。 ⑤ 逻辑数据独立性。视图可帮助用户屏蔽真实表结构带 来的影响,使应用程序和数据库结构相互独立,互不影 响。
C/S应用程序是传统开发人员普遍采用的应用程序 体系结构。随着INTERNET和INTRANET的不断普及和应用 程序业务逻辑的复杂化,C/S体系结构的应用程序带来 一些问题。为解决这些问题,分布式和WEB体系结构应 运而生。

pb中无限制添加Tree节点

pb中无限制添加Tree节点

pb中无限制添加Tree节点这是3个问题:1、如何遍历,取出要添加到树型结构中的数据。

2、添加到什么位置上。

需要我们事先确定好父节点。

3、如何向已经存在的Tree结构中的指定父节点添加新节点。

上面3个问题中,第3个问题最简单。

只要了解一下Tree的相关属性和函数就可以解决。

我们先解决最简单的。

一、如何向已经存在的Tree结构中的指定父节点添加新节点。

定义一个TreeViewItem类型的变量,设置该变量的相关属性后,使用函数InsertItem向指定的Tree控件的指定位置插入即可。

下面的例程在跟节点之下插入一个节点,例程如下:TreeViewItem ltvi_Itemlong ll_handleltvi_bel = '内容标签'ltvi_Item.data = '内容标签--数据'ltvi_Item.pictureindex = 1ltvi_Item.selectedpictureindex = 5ltvi_Item.children = Truell_handle = tv_1.FindItem(RootTreeItem!, 0)if ll_handle > 0 thenll_handle=tv_1.InsertItemLast(0, ltvi_Item)elseMessagebox('错误','没有节点')end if二、添加到什么位置上接上一篇文章,我们继续讨论如何确定要添加节点的位置。

这实际上是一个树型结构的遍历问题。

树型结构的遍历通常使用递归程序来实现,所以本节给出一个按照内容查找,对树型结构进行遍历,如果和要查找的内容相等,则返回该节点的Handle。

插入在返回后完成,使用上一篇文章中介绍的知识就可以实现。

函数如下:/*-----------------------------------------------------------------------------* 函数名称:long wf_reader(long al_handle,string as_target)* 函数作用:遍历树型结构,找到指定内容的节点。

PB中TreeView控件使用技巧

PB中TreeView控件使用技巧

PB中TreeView控件使用技巧PowerBuilder中的TreeView 控件为树状游览,类似于WINDOWS的资源管理器,其特点是信息项呈树状层次结构,能更清晰地表现主、细目关系,操作非常方便。

在应用中可将其与DataWindow 配合使用,一个提供信息的分类体系,一个提供具体信息,达到珠连碧合的奇妙效果。

它特别适用于多级信息的分类检索,是多级菜单所无法比似的,它的表现形式深受程序设计人员和广大用户的喜爱,在许多应用软件中都能看到她的英姿。

在PowerBuilder下,TreeView 控件的应用较其它控件要复杂得多,刚接触它时往往有些不知所措。

但如果将它的机理搞清楚,掌握它也不是很难的事。

下面我结合长白公司图书分类检索的实例,把TreeView 控件的使用方法和大家探讨一下。

一、应用TreeView 控件的一般步骤1、建立一个应用,并设好与数据库的接口,这是操作数据库的前提。

2、在应用中建一应用窗口W_1,在其上加入二个名为dw_3和dw_4的datawindow控制对象和一个名为TV_1的TreeView对象。

3、修改DW_3属性General:把Datawindow object name填写一个已存在的名为DW_date的datawindow(注意:它与datawindow控制对象是不同的),用于生成树视图项,将其Visible项设为不可见。

4、修改DW_4属性General:把Datawindow object name填写一个已存在的名为DW_TS的datawindow对象,用于显示查询出的具体内容。

5、编辑TV_1的属性TreeView的树视图项不能直接编辑,必须在Script中编写程序。

Picture:在Picture Name中加入四个不同的图标,用于代表树视图中的两个层次(一、二级)、两种状态(未选、选中)。

General:可根据具体应用设定是否选中,其中:Delete Items:运行中是否允许删除表项。

Treeview控件在PB中的使用

Treeview控件在PB中的使用

bmdm bmm c bmord
Tre eVie w 是 PB 中的一个标准控件# 在 Tree Vie w 控件中包含若
干个节点# 其中最上层的节点称为$ 根% 节点# $ 根% 节点的下层节点 称为$ 孩 子 ! Childre n " % 节点& 每个节点可用来存放数据库中的一条 记录的部分内容# 在 Tre e ve w 中称为一个数据项 ! Tree Vie w Item " ,
以 上的 版 本中 都 提供 了 标 准控 件 T reeView# 从 而可 以 比较 方 便快 捷 地生 成 树状 结 构 的数 据 表示 & 针对 这 一点 将 介绍 了 在 PB 中使 用 T reeview 控 件的 方法 和技 巧&
[关 键词] 1 引言
数据 库应 用;Powerbuilder treeview;T reeview 控 件
View Item 中 的 Data 和 Label 属 性 # 而 部门 级 次(bmord)用 来 存放
该 数据 节点 在 Tre e View 中的 层次 & 可 通过自 定义 函 数 F_fill_tv 生 成 Tree Vie w & 该 函数首 先 用 SQ L 语句 提 取数 据库 中 的信 息生 成 datastore # 再 根 据 datas tore 中 的 有 关 信 息生 成 $ 树 % 节 点的 数 据 项 (Tree -
treeviewitemtreeviewitem是一个结构类型的数据其主要属性如下从上表可知data属性和label属性一般存放数据内容data属性的内容不显示用户所看见的是label属性的内容因此要产生一个树的节点的主要工作是先给上述有关属性赋值从而得到一个数据项treeviewitem然后把该数据项加入到treeview某个位置上3treeview中插入数据节点的基本方法pb中把一个数据项加入到treeview中是通过插入数据项函数来实现的可用的函数有4个insertiteminsertitemfirstinsertitemlastinsertitemsort其用法类似以insertitem为例语法结构如下treeviewnameinsertitemhandleparenthandleafteritem该句法中各项含义为treeviewnametreeview控件名称handleparent要插入的节点的父节点句柄handleafter要插入的节点的同一层的前一个节点句柄item存放在treeviewitem中的数据项内容4数据的组织与treeview的生成下面我们来看一个根据学院机构信息得到一个树状结构例子假设某学院机构设置数据如下其中部门级次用来反映部门之间的隶属关系每层用2位数来表示为存储上述机构信息可在数据库中定义一个表tabdwdm其结构如下为生成treeview通常方法是用sql查询语句中提取数据库中有关数据到一个datastore中再依次取出datastore中的记录内容生成treeviewitem信息加到treeview中一般来说需要提供的数据有三项代码名称级次并按级次排序在本例中的sql语句为selectbmdmbmmcbmordfromtabdwdmorderbybmord其中部门代码bmdm部门名称bmmc分别对应于treeviewitem中的data和label属性而部门级次bmord用来存放该数据节点在treeview中的层次可通过自定义函数ffilltv生成treeview该函数首先用sql语句提取数据库中的信息生成datastore再根据datastore中的有关信息生成树节点的数据项treeviewitem并逐项加到树中5treeview生成后的利用treeview控件的主要触发事件是selectionchanged

易用为本——利用PB的树形及列表控件编程

易用为本——利用PB的树形及列表控件编程

易用为本——利用PB的树形及列表控件编程
韩彦锋;夏跃伟
【期刊名称】《电脑知识与技术》
【年(卷),期】2007(003)016
【摘要】树形和列表控件是Windows操作系统中经常使用的信息表达方式.它们表达信息直观,层次清楚,特别适用于比较复杂的结构.从典型的管理系统入手,利用PowerBuilder(后文简称PB)探讨这两类控件的编程方法.
【总页数】2页(P1061-1062)
【作者】韩彦锋;夏跃伟
【作者单位】漯河职业技术学院,计算机工程系,河南,漯河,462002;漯河职业技术学院,计算机工程系,河南,漯河,462002
【正文语种】中文
【中图分类】TP311
【相关文献】
1.利用MapBasic编程实现CDMA网络PN码规划和优化 [J], 史晔
2.利用MapBasic编程实现CDMA网络PN码规划和优化 [J], 史晔;
3.利用PB编程轻松排考场 [J], 吴涛
4.易用为本——利用PB的树形及列表控件编程 [J], 韩彦锋;夏跃伟
5.树形控件和列表控件在"新闻稿处理编程"中的应用 [J], 胡为欣
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在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
//定义树形变量的属性,设置根目录的标签,若在编码表中有此根目录,则不用在此生成
bel="城市"
//生成根目录
// 目录未打开时的图片索引,此图片可在树形控件中设定
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
bel=city_name
//把编码值赋给tvi
tvi.data=city_bm tvi.pictureindex=2
tvi.selectedpictureindex=3
//以根项目为父项目,插入第二层项目,以后凡是检索到位数是二的,均在此生成二层目录
tvi_root1=tv_1.insertitemlast(tvi_root,tvi)
case 4
//以后凡是检索到位数是四位,均生成第三层目录
bel=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下运行通过。

相关文档
最新文档