急求一个算法

xsxz05wxj 2006-01-05 09:14:48
我在数据库中设计的表,主要用来存放机构,机构能实现无限级分类,结构如下:
TableName:Orgen
字段如下:OrgID,OrgName,OrgClass,ParentOrgID,其中OrgClass表示机构属于第几层,如1表示第一级机构,2表示第二级机构,ParentOrgID表示它的上级机构的机构标识OrgID。
现在我想按机构的分类顺序输出,怎么实现?
如表中存放的记录如下:
1,org1,1,0
2,org2,1,0
3,org3,2,1
4,org4,2,1
5,org5,3,3
6,org6,2,2
7,org7,2,2
8,org8,3,4
则输出如下:
org1
org3
org5
org4
org8
org2
org6
org7

那位高手提供个算法,也欢迎提供类似的解决方法,谢谢啦
...全文
105 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenjay2003 2006-01-05
  • 打赏
  • 举报
回复
转自superdullwolf

树型结构在我们应用程序中还是很常见的,比如文件目录,BBS,权限设置,部门设置等。这些数据信息都采用层次型结构,而在我们现在的关系型数据库中很难清淅表达。那么要在程序中遇到树型结构问题该如何处理呢?

最近笔者通过一个ASP权限管理的程序轻松解决了一这问题,现在将其整理出来以飨读者。
  首先,要将层次型数据模型转化为关系型数据模型。也就是说如何在我们的ACCESS,SQL SERVER
拿个实例来讲吧,譬如下面一个数据:

文档管理 1
|----新建文档 2


|----文档修改 3


|----文档归档 4


| |----查看归档信息 5


| |----删除归档信息 6


| | |----删除历史文档 7


| | |----删除正式文档 8
|----系统管理 9


|----用户管理 10
人事管理 11
行政管理 12
财务管理 13
这是一个很典型的层次型结构数据,那么大家想一想,如何将其通过二维表的形式来表达呢?初
看上去很难,是吧。可是仔细推敲一番还是有门路可钻的。
  可以这样,将上面所有的权限视为一个权限字段,那么这个权限字段肯定是要有一个ID值的。我
们再给这个关系型数据表再强行加一个字段——隶属ID字段,也就是表明这个权限是属于哪一级权限之下的,即这个ID值隶属于哪一个ID值。比如:“查看归档信息”权限ID值为“5”,它是隶属于“文档归档”权限之下的,那么它的隶属ID字段的值就应该是“4”。OK,如果这一点能理解的话,那么我们的关系转化工作也就算基本完成了。
 下面我们就开始设计这张关系型数据表(以Sql Server 7.0 为例):


+-----------+-----------+-----------+-----------+----------+


  | 字段名 | 字段含义 | 字段类型 | 字段大小 | 字段属性 |
+-----------+-----------+-----------+-----------+----------+

| SelfID | 权限ID | Int | 4 | PK |
| PowerName | 权限名  | Varchar | 50 | Not Null |

| PowerInfo | 权限信息 | Varchar | 500 | |

| BelongID | 隶属ID | Int | 4 | |

+-----------+-----------+-----------+-----------+----------+


  好了,结构设计好你就可以轻松输入你的测试数据了。


  然后,我们就针对如何在网页中模仿层次结构显示这功能的ASP程序,这也是最关键的一步了。
程序清单:powerlist.asp
<%
'数据库连接
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'打开所有父层数据
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "select * from powers where belongid is null order by powerid",conn,1,3
'层次数表态变量赋初值
format_i=1
'列主程序段
do while not rs.eof
'打印父层数据信息
response.write "< a href='powerlist.asp?SelfID=" & rs("powerid") & "& BelongID=" &
rs("belongid") & "'> " & rs("powername") & "< /a> "
response.write "< br> "
'子程序调用,子层数据处理
Call ListSubPower(rs("powerid")) rs.movenext
loop
'关闭父层数据集
rs.close
set rs=nothing
'子层数据处理子程序
Sub ListSubPower(id)
'打开隶属于上层 powerid 的所有子层数据信息
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powers where belongid=" & id & " order by
powerid",conn,1,3
'列子层数据
do while not rs_sub.eof '层次数表态变量递进累加
format_i=format_i+1
'循环缩进格式控制,因为顶层与二层不需要缩进,所以从第三层开始引用此程序段

for i=format_i to 3 step -1
response.write "& nbsp;& nbsp;|"
response.write "& nbsp;& nbsp;& nbsp;"
next
'打印子层数据信息
response.write "& nbsp;& nbsp;|----"
response.write "< a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "& BelongID=" & rs_sub("belongid") & "'> " & rs_sub("powername") &
"< /a> "
response.write "< br> "

'递归调用子程序本身,对子层数据进行逐渐处理
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
loop
'层次数表态变量递退累减
format_i=format_i-1
'关闭子层数据集
rs_sub.close
set rs_sub=nothing
End Sub
%>
powerlist.asp程序中,我们先打开顶层数据,在循环中显示出来;然后又设计一个子程序ListSubPower,通过递归算法在循环中调用,以此来打开子层数据信息,并且在子程序内部循环中又反复调用自己,以此来逐层展开深层数据。
  另外,在程序中还用了一个静态变量format_i来控制缩进显示格式。
本文就树型结构在数据设计、程序控制方面做简单尝试,目的在于抛砖引玉,希望读者通过本文得到更多启示。
KimSoft 2006-01-05
  • 打赏
  • 举报
回复
递归调用。用HTML生成树形结构。
xsxz05wxj 2006-01-05
  • 打赏
  • 举报
回复
层数主要是用来控制输出格式,直接读取数据就可以了,否则拿到一个机构还得去算它的层数?
mrshelly 2006-01-05
  • 打赏
  • 举报
回复
还要层数这个字段干嘛?????
去下载一个无限级树形菜单就会了。

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧