选择显示字体大小

asp教程 - 树型结构在asp中的简单解决 -

树型结构在我们应用程序中还是很常见的,比如文件目录,bbs,权限设置,部门设置等。这些数

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

结构问题该如何处理呢?

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

  首先,要将层次型数据模型转化为关系型数据模型。也就是说如何在我们的access,sql server

oracle等关系型数据库中设计这个数据结构。
  拿个实例来讲吧,譬如下面一个数据:

文档管理 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(&quot;adodb.connection&quot;)
conn.open &quot;driver={sql server};server=chaiwei;database=chaiwei;uid=sa;pwd=&quot;

'打开所有父层数据
set rs=server.createobject(&quot;adodb.recordset&quot;)
rs.open &quot;select * from powers where belongid is null order by powerid&quot;,conn,1,3

'层次数表态变量赋初值
format_i=1

'列表主程序段
do while not rs.eof

'打印父层数据信息
response.write &quot;<a href='powerlist.asp?selfid=&quot; & rs(&quot;powerid&quot;) & &quot;&belongid=&quot; & rs(&quot;belongid&quot;) & &quot;'>&quot; & rs(&quot;powername&quot;) & &quot;</a>&quot;
response.write &quot;<br>&quot;

'子程序调用,子层数据处理
call listsubpower(rs(&quot;powerid&quot;))

rs.movenext

loop

'关闭父层数据集
rs.close
set rs=nothing


'子层数据处理子程序
sub listsubpower(id)

'打开隶属于上层 powerid 的所有子层数据信息
set rs_sub=server.createobject(&quot;adodb.recordset&quot;)
rs_sub.open &quot;select * from powers where belongid=&quot; & id & &quot; order by powerid&quot;,conn,1,3

'列子层数据
do while not rs_sub.eof

'层次数表态变量递进累加
format_i=format_i+1

'循环缩进格式控制,因为顶层与二层不需要缩进,所以从第三层开始引用此程序段
for i=format_i to 3 step -1
response.write &quot; &quot;
response.write &quot; &quot;
next

'打印子层数据信息
response.write &quot; ----&quot;
response.write &quot;<a href='powerlist.asp?selfid=&quot; & rs_sub(&quot;powerid&quot;) & &quot;&belongid=&quot; & rs_sub(&quot;belongid&quot;) &&quot;'>&quot; & rs_sub(&quot;powername&quot;) & &quot;</a>&quot;
response.write &quot;<br>&quot;

'递归调用子程序本身,对子层数据进行逐渐处理
listsubpower(rs_sub(&quot;powerid&quot;))

rs_sub.movenext

loop

'层次数表态变量递退累减
format_i=format_i-1

'关闭子层数据集
rs_sub.close
set rs_sub=nothing
end sub
%>

  powerlist.asp程序中,我们先打开顶层数据,在循环中显示出来;然后又设计一个子程序listsubpower,通过递归算法在循环中调用,以此来打开子层数据信息,并且在子程序内部循环中又反复调用自己,以此来逐层展开深层数据。
  另外,在程序中还用了一个静态变量format_i来控制缩进显示格式。

  本文就树型结构在数据设计、程序控制方面做简单尝试,目的在于抛砖引玉,希望读者通过本文得到更多启示。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons