如果是SQL(ORACLE): SELECT * FROM TAB1 CONNECT BY PRIOR ID=PID START WITH ID=当前节点ID;如果是TTreeView p(TreeView1.Selected);produce p(ANode: TTreeNode) var n: TTreeNode; begin ANode := ANode.GetFirstChild(); while (ANode <> nil) begin ANode := ANode.GetNext(); p(ANode); end; end; 以上程序未验证过,但思路可以是这样的
一个表 字段如下: id(自动编号) fullname(文本) parentID(长整)parentid就是该种商品上一级的商品id三个字段即可: 读取它的父ID即可反映关系ID 名称 父ID —————————————————— 1 食品饮料类 0 2 饮料类 1 3 果汁类 2 4 山楂汁 3 5 柠檬汁 3 6 碳酸类 2 7 可口可乐 6 8 百事可乐 6 9 酒类 1 10 啤酒类 9 11 烟台啤酒 10 12 青岛啤酒 10 13 白酒类 9 14 茅台 13 15 五粮液 13 16 办公设备类 0 …… 顶层的类别的parentID为Null本方法层数是无穷的,但是统计起来麻烦 有网友问本方法生成的表在统计某个节点信息的时候不方便,其实写一个函数归递其自身就可以了。 以下代码显示了统计根节点信息的方法: Function CreateEgTable() '为本演示生成一个表 '将光标停在这里,按 F5 键,运行代码生成 TREE 表 Dim strSql(10) As String Dim i As Integer strSql(0) = "create table tree (id AUTOINCREMENT(1,1),fullname text(50),parentID long)" strSql(1) = "insert into tree(fullname,parentid) values('a',0)" strSql(2) = "insert into tree(fullname,parentid) values('a1',1)" strSql(3) = "insert into tree(fullname,parentid) values('b',0)" strSql(4) = "insert into tree(fullname,parentid) values('b1',3)" strSql(5) = "insert into tree(fullname,parentid) values('b2',3)" strSql(6) = "insert into tree(fullname,parentid) values('b2b',5)" strSql(7) = "insert into tree(fullname,parentid) values('b3',3)" strSql(8) = "insert into tree(fullname,parentid) values('b3a',7)" strSql(9) = "insert into tree(fullname,parentid) values('a1a',2)" strSql(10) = "insert into tree(fullname,parentid) values('a1a1',9)" For i = LBound(strSql) To UBound(strSql) CurrentProject.Connection.Execute strSql(i) Next End FunctionFunction RunTest() '按 CTRL + G 后显示“立即窗口” '将光标停在这里,按 F5 键,运行代码直接显示结果 Debug.Print ListSub_L(0, 0) Debug.Print ListSub(0) End FunctionFunction ListSub(ByVal lngID As Long, Optional ByVal strDelimiter) As String '本函数归递自身来查询对应 TREE 表中某个节点的所有子节点 '本函数的结果集和被用来查询子节点的统计结果,比如: 'dim strSQL as String 'strSQL="select * from tree where id in(" & ListSub(0) & ")" If IsMissing(strDelimiter) = True Then strDelimiter = "," End If
Dim strSql As String Dim rs As New ADODB.Recordset strSql = "select * from tree where parentid=" & lngID rs.Open strSql, CurrentProject.Connection, 1, 1 Do Until rs.EOF ListSub = ListSub & strDelimiter & rs("fullname") & ListSub(rs("id")) rs.MoveNext Loop
End FunctionFunction ListSub_L(ByVal lngID As Long, ByVal i As Long) As String '本函数归递自身来查询对应 TREE 表中某个节点的所有子节点 '并用简单的表示方法排列出所有层次关系 i = i + 1 Dim strSql As String Dim rs As New ADODB.Recordset strSql = "select * from tree where parentid=" & lngID rs.Open strSql, CurrentProject.Connection, 1, 1 Do Until rs.EOF ListSub_L = ListSub_L & vbCrLf & String(i, Chr(9)) & rs("fullname") & ListSub_L(rs("id"), i) rs.MoveNext Loop End Function 方法二: 一个表 字段如下: id(自动编号) fullname(文本) ProgramID(文本)programID是5位一段的数字,比如 食品饮料类:00001 饮料类:0000100001 果汁类:000010000100001 山楂汁:00001000010000100001 柠檬汁:00001000010000100002本方法层数是有限制的,字符串最大是 255,如果5位一层,最大层数只有 51 层,不过多数情况下已经够用了。用本方法在统计信息的时候非常方便: select * from table where ProgramID like '00001*' access911.net 原创文章,作者本人对文章保留一切权利。 如需转载必须征得作者同意并注明本站链接
(
节点ID
节点父ID(PID)
及其他字段
)
我的意思是如何根据id,或pid,或其他字段能select 查询节点本身,所有子节点数据。
SELECT *
FROM TAB1
CONNECT BY PRIOR ID=PID
START WITH ID=当前节点ID;如果是TTreeView
p(TreeView1.Selected);produce p(ANode: TTreeNode)
var
n: TTreeNode;
begin
ANode := ANode.GetFirstChild();
while (ANode <> nil)
begin
ANode := ANode.GetNext();
p(ANode);
end;
end;
以上程序未验证过,但思路可以是这样的
专题地址:
http://access911.net/?kbid;75FABE1E12DC
简述:
本文简述了如何设计表的结构才能方便的用 TREEVIEW 控件显示数据的层次关系。
阅读前需掌握:
难度等级:
等级未评定
问题:
新手来看:如何设计表结构便于treeview显示?食品饮料类
--饮料类
--果汁类
--山楂汁
--柠檬汁
--碳酸类
--可口可乐
--百事可乐
--酒类
--啤酒类
--烟台啤酒
--青岛啤酒
--白酒类
--茅台
--五粮液
办公设备类
--…………以此类推
请问该如何建表,便于用treeview显示,而且能反映他们之间的类别关系
回答:
方法一:
一个表
字段如下:
id(自动编号)
fullname(文本)
parentID(长整)parentid就是该种商品上一级的商品id三个字段即可:
读取它的父ID即可反映关系ID 名称 父ID
——————————————————
1 食品饮料类 0
2 饮料类 1
3 果汁类 2
4 山楂汁 3
5 柠檬汁 3
6 碳酸类 2
7 可口可乐 6
8 百事可乐 6
9 酒类 1
10 啤酒类 9
11 烟台啤酒 10
12 青岛啤酒 10
13 白酒类 9
14 茅台 13
15 五粮液 13
16 办公设备类 0
……
顶层的类别的parentID为Null本方法层数是无穷的,但是统计起来麻烦
有网友问本方法生成的表在统计某个节点信息的时候不方便,其实写一个函数归递其自身就可以了。
以下代码显示了统计根节点信息的方法:
Function CreateEgTable()
'为本演示生成一个表
'将光标停在这里,按 F5 键,运行代码生成 TREE 表 Dim strSql(10) As String
Dim i As Integer
strSql(0) = "create table tree (id AUTOINCREMENT(1,1),fullname text(50),parentID long)"
strSql(1) = "insert into tree(fullname,parentid) values('a',0)"
strSql(2) = "insert into tree(fullname,parentid) values('a1',1)"
strSql(3) = "insert into tree(fullname,parentid) values('b',0)"
strSql(4) = "insert into tree(fullname,parentid) values('b1',3)"
strSql(5) = "insert into tree(fullname,parentid) values('b2',3)"
strSql(6) = "insert into tree(fullname,parentid) values('b2b',5)"
strSql(7) = "insert into tree(fullname,parentid) values('b3',3)"
strSql(8) = "insert into tree(fullname,parentid) values('b3a',7)"
strSql(9) = "insert into tree(fullname,parentid) values('a1a',2)"
strSql(10) = "insert into tree(fullname,parentid) values('a1a1',9)"
For i = LBound(strSql) To UBound(strSql)
CurrentProject.Connection.Execute strSql(i)
Next
End FunctionFunction RunTest()
'按 CTRL + G 后显示“立即窗口”
'将光标停在这里,按 F5 键,运行代码直接显示结果
Debug.Print ListSub_L(0, 0)
Debug.Print ListSub(0)
End FunctionFunction ListSub(ByVal lngID As Long, Optional ByVal strDelimiter) As String
'本函数归递自身来查询对应 TREE 表中某个节点的所有子节点
'本函数的结果集和被用来查询子节点的统计结果,比如:
'dim strSQL as String
'strSQL="select * from tree where id in(" & ListSub(0) & ")" If IsMissing(strDelimiter) = True Then
strDelimiter = ","
End If
Dim strSql As String
Dim rs As New ADODB.Recordset
strSql = "select * from tree where parentid=" & lngID
rs.Open strSql, CurrentProject.Connection, 1, 1
Do Until rs.EOF
ListSub = ListSub & strDelimiter & rs("fullname") & ListSub(rs("id"))
rs.MoveNext
Loop
End FunctionFunction ListSub_L(ByVal lngID As Long, ByVal i As Long) As String
'本函数归递自身来查询对应 TREE 表中某个节点的所有子节点
'并用简单的表示方法排列出所有层次关系 i = i + 1
Dim strSql As String
Dim rs As New ADODB.Recordset
strSql = "select * from tree where parentid=" & lngID
rs.Open strSql, CurrentProject.Connection, 1, 1
Do Until rs.EOF
ListSub_L = ListSub_L & vbCrLf & String(i, Chr(9)) & rs("fullname") & ListSub_L(rs("id"), i)
rs.MoveNext
Loop
End Function
方法二:
一个表
字段如下:
id(自动编号)
fullname(文本)
ProgramID(文本)programID是5位一段的数字,比如
食品饮料类:00001
饮料类:0000100001
果汁类:000010000100001
山楂汁:00001000010000100001
柠檬汁:00001000010000100002本方法层数是有限制的,字符串最大是 255,如果5位一层,最大层数只有 51 层,不过多数情况下已经够用了。用本方法在统计信息的时候非常方便:
select * from table where ProgramID like '00001*' access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接
适用环境:
所有 Access 环境
关键字:
设计表结构,treeview >>>
相关文章
没有手动相关文章
关于产品名称、客户名称的表结构定义
新手来看:如何设计数据库结构
评论
没有相关评论
查看或发表更多的评论,请单击这里。
Access911.net | a9BBS | OTaA System |
建站日期:2000年4月2日 | 设计施工:陈格 ( access911 & cg1 )
Copyright © 2000 - 2003 COMET, 陈格 保留所有