麻辣家族討論版版's Archiver

小誌 發表於 2010-5-23 23:48

(實戰專題) 自動化票選程式 票選管理介面篇

什麼叫做『自動化票選程式』?簡單的說:就是當我們完成票選程式的設計與撰寫後而進行票選活動,在此票選活動結束後若要接著進行另一項票選活動時,不必再開啟資料庫更改票選項目及內容資料,甚至連一個程式

網頁都不需變動的情況下而直接由網頁式的管理介面進行各項票選資料項目的維護即可。本範列因牽涉的相關知識非常多,故將之分隔成兩大部分。

[color=DarkOrange][size=5][b]票選管理介面[/b][/size][/color]
『管理介面』,顧名思義,乃是網站管理者或是票選活動的負責人進行票選資料維護之用。

[color=Green][size=4][b]For-Next迴圈利用[/b][/size][/color]
既然是自動化的程式,我們讀取資料錄的內容方式將做大幅的變動,因為我們的票選項目是可變動的,所以我們不能再利用『票選項目』為開啟資料錄的依循條件!

要讀取資料欄位的資料內容(Value),我們將不可以再利用下列方法:[code]RS("欄位抬頭") '列出欄位資料內容[/code] 我們不能使用上列的方法讀取資料錄欄位的內容,是因為我們的票選項目乃是可變動的,上列的方法只適用於讀取項目欄位抬頭固定不變的資料欄位,否則當我們的票選項目變更後,所有有讀取到這個欄位資料的程式網頁全部要進行修正的動作!對於資料欄位內容可能變動的項目我們將改採下列這種方法(RS為資料錄Recordset物件,i為變數):[code]RS(i).Value '列出欄位資料內容[/code] 利用上列的資料欄位讀取方式,再配合迴圈敘述 For--Next即可將資料錄內容全部讀出,不需再顧慮欄位抬頭的問題!
  
[color=Magenta]迴圈敘述 For--Next [/color]

[attach]832[/attach]

 什麼叫做迴圈敘述?迴圈就是讓某一條程式敘述或程式區塊(多條程式敘述)重複執行的敘述,使用迴圈敘述可使我們的程式更精簡更方便,For--Next敘述適用於知道"範圍"的重複敘述,也就是知道重複執行的敘述要做幾次(正常情況下),其格式如下列所示:[code]For 計次變數=初始值 To 終止值 Step 步進值
   程式敘述
Next 計次變數[/code]例如:[code]For N=0 To 9
Response.Write "第" & N & "次"
Next[/code] 上列這個範例中『Response.Write "第" & N & "次"』敘述總共會被重複執行幾次?如果你說九次就真該打屁股了!由0開始到9是十次喔!所以程式執行的結果會印出『第0次』、『第1次』.....『第9次』。



[color=Red]提示:[/color]
[list]
[*]假設我們未指定步進值則步進值為『1』,也就是說迴圈敘述每重複執行一次,我們的計次變數值就自動加一。
[*]迴圈敘述中,『計次變數』名稱可不用填寫,但若是多個迴圈覆合使用(迴圈中還有迴圈),請特別注意順序問題!
[/list]

小誌 發表於 2010-5-23 23:54

[color=Green][b][size=4]票選資料編修程式[/size][/b][/color]
了解For-Next迴圈敘述後,接著就來進行票選資料編修程式網頁的撰寫(本例為editvote.asp),在票選資料編修程式網頁中將會列出目前的票選項目及得票數,如下圖所示。

[attach]833[/attach]

票選項目及目前票數的各個資料欄位,我們都可以直接進行變更,在完成票選項目及目前票數資料後,直接按下『確認』按鈕,將更新後的資料交由更新程式editsave.asp,程式將相關資料更新至資料庫中!

 票選項目及目前票數的各個資料欄位都放置了一個表單的單行文字方塊元件,請注意!單行文字方塊元件並不是我們直接加上去的喔,他們都是由程式動態產生的,當程式未開始執行生效前所看的畫面是下圖這個樣子喔!

[attach]834[/attach]

在票選項目及目前票數的各個文字方塊中所見的資料內容都是從資料庫中讀取出來的,而我們讀取這些資料則是利用雙For--Next迴圈的方式來讀取,見下圖。

[attach]835[/attach]

藍色部分的For迴圈(外迴圈),其作用是變更作用中的資料錄位置,那外迴圈會重複執行幾次呢?有幾筆資料錄就執行幾次!我們利用資料錄的recordcount屬性來得知總共有幾筆資料,同時利用recordcount屬性值來作為外迴圈的終止值,當迴圈每執行一次我們就將作用中的資料錄位置以MoveNext方法移至下一資料。

 紅色部分的For迴圈(內迴圈),其作用是輸出資料中各個資料欄位的值(Value),當然也包含了輸出表單元件『單行文字方塊』的HTML敘述,那內迴圈會重複執行幾次呢?有資料錄中有幾個資料欄位就執行幾次!我們利用資料錄的Fields.count屬性來得知總共有幾個資料欄位,同時利用Fields.count屬性值來作為內迴圈的終止值。


[color=Red]提示: [/color]
[list]
[*]每當藍色部分的For迴圈(外迴圈)執行一次之後,就必須利用MoveNext方法將作用中的資料錄往下移動一筆,這樣才能獲得下一個票選項目的名稱以及目前的得票數資料。
[*]其實,當我們For迴圈的計次變數終止值設定為『recordcount-1』其實作用中資料錄就不會有移出最後一筆資料錄的錯誤發生,因此『If Rs.Eof Then Exit For』這一條預防性的判斷敘述是可以省略的。
[/list]



當我們的程式網頁開始執行後,我們所設定的雙For迴圈敘述將會把資料庫資料表中所有的欄位資料取出來,然後放置在單行文字方塊中,程式執行所輸出之Html標籤敘述內容下圖:

[attach]836[/attach]

[color=Red]提示:[/color]
其實我們的程式執行後所輸出之Html標籤敘述並不會如上圖那般的整齊!還記得我們在程式增加了一行敘述『Response.Write Chr(10)』嗎?這個『Chr(10)』其實就是一個換行符號,如果沒有增加輸出這個換行符號,則上圖中藍色部分排列整齊的Html標籤敘述就會全部串接成一行了呦!!

[attach]837[/attach]

editvote.asp[code]<%
'建立資料庫連結物件
        Set conobject = Server.CreateObject("ADODB.Connection")
        DBPath = Server.MapPath("vote.mdb")
'連結資料庫       
        conobject.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ="&DBPath
'建立資料庫存取物件       
        Set RS=Server.CreateObject("ADODB.Recordset")
'打開資料表       
        RS.Open "Select * from student",conobject,1,3
%>
<CENTER>
<P><img border="0" src="elogo.gif"><br>
<font color="#0000FF">請依序填入或修改項目</font></P>
<form method="POST" action="editsave.asp">
  <table border="1">
    <tr>
      <td bgcolor="#FF3399">
        <p align="center"><font color="#FFFFFF">票選項目</font></p>
      </td>
      <td bgcolor="#FF3399">
        <font color="#FFFFFF">目前票數</font>
      </td>
    </tr>
    <tr>
<%   
Num=0
For Itemline=0 To Rs.recordcount-1
      Response.Write "<TR>"
     For Item=0 To Rs.Fields.Count-1
             Response.Write "<TD><input type=text name=" & Num & _
                            " value=" & Rs.Fields(Item).Value & "></TR>"
             Response.Write chr(10)
                Num=Num+1
     Next
      Response.Write "</TR>"
          Rs.MoveNext
          If Rs.Eof Then Exit For
Next          
   
    %>
  </table>
<p><input type="submit" value="確認"></p>
</form>
</CENTER>[/code]

小誌 發表於 2010-5-23 23:57

[color=Green][size=4][b]陣列的使用[/b][/size][/color]
陣列是什麼?陣列就是變數啦!是用來儲存資料的啦,但是我們一般所使用的變數祇能儲存一筆資料而已,但是陣列就不同了,陣列可儲放很多筆的資料,換言之,陣列其實就是一個變數集合!

[color=Magenta] 使用陣列請先宣告[/color]

使用陣列必須先經過宣告的程序,宣告陣列的格式如下:[code]Dim 陣列名(最後一個陣列元素的編號)[/code]例如:我們宣告一個陣列如下[code]Dim myarr(3)[/code] 代表我們建立了一個名為『myarr』的陣列,請問這個陣列可以放幾筆資料?三筆?錯!『3』是最後一個陣列元素的編號,而陣列元素的起始編號則是『0』,因此這個陣列可以儲放四筆資料。

[attach]838[/attach]

將資料從陣列元素中取出:

[attach]839[/attach]


[color=Red] 提示[/color]
利用Dim宣告陣列則陣列的大小是固定的,若希望陣列的大小是可增減的,則必須使用『ReDim』敘述來宣告陣列。

小誌 發表於 2010-5-24 00:00

[color=Green][b][size=4]資料庫更新程式[/size][/b][/color]
當我們在『票選資料編修程式網頁』中編修票選項目及目前票數的各個資料欄位後,直接按下『確認』按鈕後,則表單中的各個文字欄位資料將以"Post"的方式送交更新程式editsave.asp,程式將相關資料更新至資料庫中!因此資料庫更新程式第一件要做的事就是接取來自『票選資料編修程式網頁表單』的各項資料:

[attach]840[/attach]

首先,透過Dim敘述宣告建立一個含有十個元素的陣列,接著利用For迴圈敘述將票選資料編修程式網頁表單所傳來的資料儲放到陣列中。

 你一定覺得很奇怪!接取表單資料的Request物件所指定的變數怎麼會是I呢?看了下圖你就知道了(下圖為票選資料編修程式網頁中的Html標籤敘述輸出程式段):

[attach]841[/attach]

請觀察上圖這段程式敘述,我們的單行文字方塊欄位的命名方式乃是採用數字編號,當第一個單行文字方塊欄位被建立時,它的名稱(name)就被定為"0",而後序建立的單行文字方塊欄位其名稱就依序的定為"1"、"2".....,在本例中,共有十個單行文字方塊欄位被建立,因此它們的名稱就被依序的定為"0"到"9",而我們的For迴圈計次變數也是從0到9,所以我們就直接取用計次變數值來當作Request物件變數使用。

完成表單資料的接取動作後,緊接著就必須將相關資料更新至資料庫中!

[attach]842[/attach]

上圖中的程式區段是不是很眼熟啊?我們之前是利用雙For迴圈敘述將資料庫中的資料讀取出來,現在則是利用雙For迴圈敘述將資料寫入到資料庫中。

 藍色部分的For迴圈(外迴圈),其作用同樣是變更作用中的資料錄位置;而紅色部分的For迴圈(內迴圈),則是將表單欄位資料寫入資料庫中各個資料欄位,同樣的程式原理,小誌就不再重複解說了!


editsave.asp[code]<%
'讀入項目名稱及票數
Dim Item(9)  '宣告可儲放十筆資料的陣列Item
For I=0 To 9   '利用For迴圈將表單中的資料存入陣列
Item(I)=Request(I)
Next

Response.Cookies("checkvote")="yes"
'建立資料庫連結物件
        Set conobject = Server.CreateObject("ADODB.Connection")
        DBPath = Server.MapPath("vote.mdb")
'連結資料庫       
        conobject.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ="&DBPath
'建立資料庫存取物件       
        Set RS=Server.CreateObject("ADODB.Recordset")
'打開資料表       
        RS.Open "Select * from student",conobject,1,3
'更新投票結果
Num=0        
For Itemline=0 To Rs.recordcount-1
      For Itemnum=0 To Rs.Fields.Count-1
              Rs.Fields(Itemnum).Value=Item(Num)
             Num=Num+1
     Next
          Rs.MoveNext
          If Rs.Eof Then Exit For
Next          

Response.Redirect "editvote.asp"

%>[/code]

小誌 發表於 2010-5-24 00:03

[color=Green][size=4][b]變更資料庫結構[/b][/size][/color]
因為加上了票選內容的管理介面,可進行票選項目及得票數的編修,因此我們的資料庫資料表的設計不再使用標準的橫向格式,而改用直向的設計方式喔!如下圖:

[attach]843[/attach]

『自動化票選程式』的『管理介面』範例至此暫告一個段落,至於『使用介面』的部份將於下一節介紹,請你先仔細的回顧For迴圈敘述的使用,因為在使用者票選的『使用介面』中將採用相同的方式來讀取資料庫資料喔!


[color=RoyalBlue][size=4][b](實戰專題) 自動化票選程式 票選管理介面篇完整範例壓縮檔:[/b][/size][/color][attach]844[/attach]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供