在PB中快速实现数据库树形结构
- 格式:docx
- 大小:17.63 KB
- 文档页数:3
树的遍历:函数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中快速实现数据库树形结构树形结构在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实现树形结构查询⽬录背景使⽤场景设计思路递归模型实现代码注意事项总结背景实际开发过程中经常需要查询节点树,根据指定节点获取⼦节点列表,以下记录了获取节点树的操作,以备不时之需。
使⽤场景可以⽤于系统部门组织机构、商品分类、城市关系等带有层级关系的数据结构;设计思路递归模型即根节点、枝⼲节点、叶⼦节点,数据模型如下: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是一种广泛应用于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'];```通过这种方式,我们可以在树状结构中快速定位到特定的节点,并对其进行操作。
减肥药哪种好: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实现树型列表动态半透明提示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中的实现与应用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中,可以使用以下几种方法来生成树形结构:
1. 递归查询:使用递归查询可以直接从表中查询出树形结构。
一般使用WITH RECURSIVE语法来实现,可以不断地迭代查询,直到找到根节点为止。
2. 嵌套集模型(Nested Set Model):嵌套集模型是一种将树状结构表示为一系列的左右值的方法。
根据左右值可以方便地查询到某个节点的所有子节点,以及该节点的父节点。
3. 路径枚举模型(Path Enumeration Model):路径枚举模型是一种将树状结构表示为路径字符串的方法。
每个节点都有一个路径字符串,包含了从根节点到该节点的路径。
可以通过匹配路径字符串来查询子节点和父节点。
4. 存储过程:使用存储过程来逐层构建树形结构。
可以通过循环迭代查询,并逐层插入数据到结果表中,最终构建出树形结构。
以上是一些常见的方法,每种方法都有其适用的场景和使用方式。
选择合适的方法取决于具体的需求和数据结构。
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中快速实现数据库树形结构
树形结构在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下运行通过。