程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> 樹型結構在ASP中的簡單解決

樹型結構在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("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 " |"
response.write " "
next

'打印子層數據信息
response.write " |----"
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來控制縮進顯示格式。

  本文就樹型結構在數據設計、程序控制方面做簡單嘗試,目的在於拋磚引玉,希望讀者通過本文得到更多啟示。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved