2015年3月10日 星期二

Asp的巢狀迴圈

若使用ASP抓取資料庫資料要做像樹狀結構的選單,
相信大家一定卡住很久…

當然Asp現在使用的人愈來愈少,
不過相信以前很多人都卡關過在這裡,
這邊提供一個比較偷吃步的方式給各位!

<請先自行將Access資料庫與連線自串設定好>

範例使用資料庫如下二圖:
















資料庫說明:
classOne資料表為第一層
classTwo資料表為第二層
classOne.ClassNum欄位為第一層順序
classTwo.Num欄位為第二層順序


1.index.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!--#include file="Connections/ConnTest.asp" -->

<!--以下部份為使用繫結產生-->
<%
Dim Recclassone
Dim Recclassone_cmd
Dim Recclassone_numRows

Set Recclassone_cmd = Server.CreateObject ("ADODB.Command")
Recclassone_cmd.ActiveConnection = MM_ConnTest_STRING
Recclassone_cmd.CommandText = "SELECT * FROM classOne ORDER BY ClassNum DESC" 
Recclassone_cmd.Prepared = true

Set Recclassone = Recclassone_cmd.Execute
Recclassone_numRows = 0
%>
<%
Dim Repeat1__numRows
Dim Repeat1__index

Repeat1__numRows = -1
Repeat1__index = 0
Recclassone_numRows = Recclassone_numRows + Repeat1__numRows
%>
<!--以上部份為使用繫結產生-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文件</title>
</head>

<body>

  <table border="0" cellspacing="1">

<!--重覆區域-->
    <% 
While ((Repeat1__numRows <> 0) AND (NOT Recclassone.EOF)) 
%>
  <tr>
    <td><%=(Recclassone.Fields.Item("ClassTitle").Value)%></td>

<!--載入a.asp頁面-->
    <td><!--#include file="a.asp" --></td>

  </tr>

  <% 
  Repeat1__index=Repeat1__index+1
  Repeat1__numRows=Repeat1__numRows-1
  Recclassone.MoveNext()
Wend
%>
<!--重覆區域結束-->

  </table>
  
</body>
</html>
<%
Recclassone.Close()
Set Recclassone = Nothing
%>


2.a.asp

<!--使用繫結產生語法,篩選器請選擇"應用程式變數"-->
<%
Dim RecClassTwo__MMColParam
RecClassTwo__MMColParam = (Recclassone.Fields.Item("ClassID").Value) '將這邊原本的"1"數字更改成index.asp撈回資料庫的ID做判別的索引
If (Application("classOneID") <> "") Then 
  RecClassTwo__MMColParam = Application("classOneID")
End If
%>
<%
Dim RecClassTwo
Dim RecClassTwo_cmd
Dim RecClassTwo_numRows

Set RecClassTwo_cmd = Server.CreateObject ("ADODB.Command")
RecClassTwo_cmd.ActiveConnection = MM_ConnTest_STRING
RecClassTwo_cmd.CommandText = "SELECT * FROM classTwo WHERE classOneID = ? ORDER BY Num ASC" 
RecClassTwo_cmd.Prepared = true
RecClassTwo_cmd.Parameters.Append RecClassTwo_cmd.CreateParameter("param1", 5, 1, -1, RecClassTwo__MMColParam) ' adDouble

Set RecClassTwo = RecClassTwo_cmd.Execute
RecClassTwo_numRows = 0
%>

<!--使用尋找與取代,將重覆的"Repeat1"全部改成"Repeat2",避免載入至index.asp的時候產生衝突-->
<%
Dim Repeat2__numRows
Dim Repeat2__index

Repeat2__numRows = -1
Repeat2__index = 0
RecClassTwo_numRows = RecClassTwo_numRows + Repeat2__numRows
%>

<% 
While ((Repeat2__numRows <> 0) AND (NOT RecClassTwo.EOF)) 
%>

<!--第二層標題-->
  <%=(RecClassTwo.Fields.Item("Title").Value)%>

  <% 
  Repeat2__index=Repeat2__index+1
  Repeat2__numRows=Repeat2__numRows-1
  RecClassTwo.MoveNext()
Wend
%>

<%
RecClassTwo.Close()
Set RecClassTwo = Nothing
%>


ASP的連線字串

為了避免我老人痴呆的個性,把連線字串寫在這兒,若需要使用再Copy修改即可!(也歡迎不小心逛到的朋友自行使用哦!)


//遠端連線
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("資料庫路徑+資料庫名稱.mdb")


//本地端連線
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=絕對路徑 + 資料庫名稱.mdb"