您的位置:首页 > 其它

ACCESS新手来看:如何设计表结构便于treeview显示?

2005-10-08 00:42 465 查看
新手来看:如何设计表结构便于treeview显示?
function addtitle(){
var straddtitle = "新手来看:如何设计表结构便于treeview显示?";
if (straddtitle.length!==0){
document.title=document.title + "《" + straddtitle + "》;专题号:75FABE1E12DC";
}
}

专题地址:

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 Function
Function RunTest()
'按 CTRL + G 后显示“立即窗口”
'将光标停在这里,按 F5 键,运行代码直接显示结果
Debug.Print ListSub_L(0, 0)
Debug.Print ListSub(0)
End Function
Function 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 Function
Function 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 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: