加载中...
查看文章
  • 树型结构在ASP中的简单解决
  • 作者:chaiwei 来源:开发者俱乐部 添加时间:2002年12月12日 字体:
  • 80496  树型结构在我L0bK4Vo们应用程序中还是很常见的,比如文件目录,BBS,权限设置,部门设置等。这些数

    L0bK4Vo

    L0bK4Vo据信息都采用层次型结构,而在我L0bK4Vo们现在的关系型数据库中很难清淅表达。那么要在程序中遇到树型

    L0bK4Vo

    L0bK4Vo结构问题该如何处理呢?

    L0bK4Vo

    L0bK4Vo  最近笔者通过一个ASP权限管理的程序轻松解决了一这问题,现在将其整理出来以飨读者。

    L0bK4Vo

    L0bK4Vo  首先,要将层次型数据模型转化为关系型数据模型。也就是说如何在我L0bK4Vo们的ACCESS,SQL SERVER

    L0bK4Vo

    L0bK4Vo,ORACLE等关系型数据库中设计这个数据结构。

    L0bK4Vo  拿个实例来讲吧,譬如下面一个数据:

    L0bK4Vo

    L0bK4Vo文档管理 1

    L0bK4Vo|----新建文档 2

    L0bK4Vo|----文档修改 3

    L0bK4Vo|----文档归档 4

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

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

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

    L0bK4Vo| | |----删除正式文档 8

    L0bK4Vo|----系统管理 9

    L0bK4Vo|----用户管理 10

    L0bK4Vo人事管理 11

    L0bK4Vo行政管理 12

    L0bK4Vo财务管理 13

    L0bK4Vo

    L0bK4Vo  这是一个很典型的层次型结构数据,那么大家想一想,如何将其通过二维表的形式来表达呢?初

    L0bK4Vo

    L0bK4Vo看上去很难,是吧。可是仔细推敲一番还是有门路可钻的。

    L0bK4Vo

    L0bK4Vo  可以这样,将上面所有的权限视为一个权限字段,那么这个权限字段肯定是要有一个ID值的。我L0bK4Vo

    L0bK4Vo

    L0bK4Vo们再给这个关系型数据表再强行加一个字段——隶属ID字段,也就是表明这个权限是属于哪一级权限

    L0bK4Vo

    L0bK4Vo之下的,即这个ID值隶属于哪一个ID值。比如:“查看归档信息”权限ID值为“5”,它是隶属于“文

    L0bK4Vo

    L0bK4Vo档归档”权限之下的,那么它的隶属ID字段的值就应该是“4”。OK,如果这一点能理解的话,那么我L0bK4Vo

    L0bK4Vo

    L0bK4Vo们的关系转化工作也就算基本完成了。

    L0bK4Vo

    L0bK4Vo  下面我L0bK4Vo们就开始设计这张关系型数据表(以Sql Server 7.0 为例):

    L0bK4Vo

    L0bK4Vo+-----------+-----------+-----------+-----------+----------+

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

    L0bK4Vo+-----------+-----------+-----------+-----------+----------+

    L0bK4Vo| SelfID  | 权限ID   | Int    | 4      | PK    |

    L0bK4Vo| PowerName | 权限名  | Varchar  | 50     | Not Null |

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

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

    L0bK4Vo+-----------+-----------+-----------+-----------+----------+

    L0bK4Vo

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

    L0bK4Vo

    L0bK4Vo  然后,我L0bK4Vo们就针对如何在网页中模仿层次结构显示这功能的ASP程序,这也是最关键的一步了。

    L0bK4Vo

    L0bK4Vo程序清单:powerlist.asp

    L0bK4Vo

    L0bK4Vo<%

    L0bK4Vo'数据库连接

    L0bK4Voset conn=Server.CreateObject("ADODB.Connection")

    L0bK4Voconn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="

    L0bK4Vo

    L0bK4Vo'打开所有父层数据

    L0bK4Voset rs=Server.CreateObject("ADODB.Recordset")

    L0bK4Vors.Open "select * from powers where belongid is null order by powerid",conn,1,3

    L0bK4Vo

    L0bK4Vo'层次数表态变量赋初值

    L0bK4Voformat_i=1

    L0bK4Vo

    L0bK4Vo'列表主程序段

    L0bK4Vodo while not rs.eof

    L0bK4Vo

    L0bK4Vo'打印父层数据信息

    L0bK4Voresponse.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "</a>"

    L0bK4Voresponse.write "
    L0bK4Vo"

    L0bK4Vo

    L0bK4Vo'子程序调用,子层数据处理

    L0bK4VoCall ListSubPower(rs("powerid"))

    L0bK4Vo

    L0bK4Vors.movenext

    L0bK4Vo

    L0bK4Voloop

    L0bK4Vo

    L0bK4Vo'关闭父层数据集

    L0bK4Vors.close

    L0bK4Voset rs=nothing

    L0bK4Vo

    L0bK4Vo

    L0bK4Vo'子层数据处理子程序

    L0bK4VoSub ListSubPower(id)

    L0bK4Vo

    L0bK4Vo'打开隶属于上层 powerid 的所有子层数据信息

    L0bK4Voset rs_sub=Server.CreateObject("ADODB.Recordset")

    L0bK4Vors_sub.Open "select * from powers where belongid=" & id & " order by powerid",conn,1,3

    L0bK4Vo

    L0bK4Vo'列子层数据

    L0bK4Vodo while not rs_sub.eof

    L0bK4Vo

    L0bK4Vo'层次数表态变量递进累加

    L0bK4Voformat_i=format_i+1

    L0bK4Vo

    L0bK4Vo'循环缩进格式控制,因为顶层与二层不需要缩进,所以从第三层开始引用此程序段

    L0bK4Vofor i=format_i to 3 step -1

    L0bK4Voresponse.write " |"

    L0bK4Voresponse.write " "

    L0bK4Vonext

    L0bK4Vo

    L0bK4Vo'打印子层数据信息

    L0bK4Voresponse.write " |----"

    L0bK4Voresponse.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "</a>"

    L0bK4Voresponse.write "
    L0bK4Vo"

    L0bK4Vo

    L0bK4Vo'递归调用子程序本身,对子层数据进行逐渐处理

    L0bK4VoListSubPower(rs_sub("powerid"))

    L0bK4Vo

    L0bK4Vors_sub.movenext

    L0bK4Vo

    L0bK4Voloop

    L0bK4Vo

    L0bK4Vo'层次数表态变量递退累减

    L0bK4Voformat_i=format_i-1

    L0bK4Vo

    L0bK4Vo'关闭子层数据集

    L0bK4Vors_sub.close

    L0bK4Voset rs_sub=nothing

    L0bK4VoEnd Sub

    L0bK4Vo%>

    L0bK4Vo

    L0bK4Vo  powerlist.asp程序中,我L0bK4Vo们先打开顶层数据,在循环中显示出来;然后又设计一个子程序ListSubPower,通过递归算法在循环中调用,以此来打开子层数据信息,并且在子程序内部循环中又反复调用自己,以此来逐层展开深层数据。

    L0bK4Vo  另外,在程序中还用了一个静态变量format_i来控制缩进显示格式。

    L0bK4Vo

    L0bK4Vo  本文就树型结构在数据设计、程序控制方面做简单尝试,目的在于抛砖引玉,希望读者通过本文得到更多启示。80493
  • 返回页面顶端
  • 上一篇:远程获取内容,并将内容存在本地电脑上,包括任何文件
  • 下一篇:asp作品保护方案
  • 返回上一页 打印本文 加入收藏
  • 页面最后更新时间:2010年3月10日