麻辣家族討論版版's Archiver

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

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

當我們在『自動化票選程式』之『管理介面』中,更動了票選項目,將影響我們票選『使用介面』的程式網頁顯示內容,為了因應管理介面對票選項目變動的可能性,我們在使用介面的程式設計時是不可以使用固定欄位抬頭的顯示方式!也就是說當我們要讀取資料庫資料時必須採用『Fields集合物件』的觀念來存取欄位資料。

 關於預防重複投票的方法我們乃是使用Cookies物件的方式來設計,預防重複投票的方法原理請參考筆者之前所發表之範例「線上票選」,本範例示範的重點為配合『管理介面』中更動票選項目後『使用介面』的程式網頁如何因應的程式設計方法!!

[color=DarkOrange][size=5][b]投票程式網頁[/b][/size][/color]
使用者介面的組成共分為二個部分!
vote3.asp:用來顯示目前的票選結果以及進行投票動作的程式機制,votesave3.asp:進行儲存新投票結果的程式機制,當然還有一個資料庫,不過這個資料庫與管理介面使用的是同一個。我們先來看看投票程式網頁程式設計的變動部分:

[color=Green][b][size=4] 計算總投票數 [/size][/b][/color]
 我們之前計算總投票數的方式是資料錄中所有的欄位值加總起來,而且是以欄位抬頭為讀取欄位值的依據,如下圖綠色部分程式敘述:

[attach]845[/attach]

可是現在我們的票選程式是可以隨時改變票選項目(也就是原來的欄位抬頭),同時資料庫的設計方式也由橫向格式改為直向的設計方式,如下圖!

[attach]846[/attach]

因此,我們要計算總投票數必須改用下列方式:
[list=1]
[*]先利用MoveFirst方法將作用中資料錄的位置移至第一筆資料上。
[*]設定一儲存總投票數的變數Votepeople,並將變數內資料值預設為"0"。
[*]利用藍色部分的For迴圈(外迴圈),加上MoveNext方法逐次移動作用中資料錄的位置。
[*]綠色部分的For迴圈(內迴圈),隨著作用中資料錄的位置改變,取出資料錄中第1個欄位(票數欄位)的資料值出來做總票數的累加計算。
[/list]

[attach]847[/attach]

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

[color=Green][size=4][b]設定票數長條圖圖片顯示寬度[/b][/size][/color]
 在得到總投票人數的數據資料後,接著就是進行票選圖形型的顯示寬度設定,如下圖所示。

[attach]848[/attach]

[list=1]
[*]利用MoveFirst方法將作用中資料錄的位置移至第一筆資料上。
[*]宣告建立一個儲存各票選項目目前得票數的陣列linelong。
[*]利用藍色部分的For迴圈(外迴圈),加上MoveNext方法逐次移動作用中資料錄的位置。
[*]綠色部分的For迴圈(內迴圈),隨著作用中資料錄的位置改變,取出資料錄中第1個欄位(票數欄位)的資料值出來做運算,但是在進行圖片寬度運算之前,我們必須先利用IF敘述判斷票選項目的票數是不是0!如果不是0我們才開始進行圖片寬度運算!運算所得的票選項目圖片寬度值再將其儲放置至陣列中。
[/list]

計算出各個票選項目圖片寬度值後,利用For--Next迴圈的方式配合HTML表格標籤敘述來建立票選按鈕、輸出票選項目名稱與得票圖形及目前票數,見下圖。

[attach]849[/attach]

[list=1]
[*]利用MoveFirst方法將作用中資料錄的位置移至第一筆資料上。
[*]利用藍色部分的For迴圈(外迴圈),加上MoveNext方法逐次移動作用中資料錄的位置。
[*]For迴圈內,隨著作用中資料錄的位置改變,建立各票選項目相對應的投票按鈕、取出各票選項目的名稱、顯示得票圖形及目前票數,並將各項資料置放於表格之中。
[/list]


[color=Red]提示: [/color]
[list]
[*]每當藍色部分的For迴圈執行一次之後,就必須利用MoveNext方法將作用中的資料錄往下移動一筆,這樣才能獲得下一個票選項目的名稱以及目前的得票數資料。
[*]『Response.Write Chr(10)』輸出一個換行符號,使程式執行後輸出的Html標籤敘述能整齊的排列。
[*]圖形的寬度乃是取出陣列linelong中相對應的元素資料值。
[/list]


Vote3.asp[code]<%
er=Request.Cookies("er")
IF err="" then err=empty
'建立資料庫連結物件
        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,1
       
'計算總投票數
Rs.MoveFirst       
VotePeople=0
For Itemline=0 To Rs.recordcount-1
      For Item=0 To Rs.Fields.Count-1
       VotePeople=Votepeople+Rs.Fields(1).Value
      Next
          Rs.MoveNext
          If Rs.Eof Then Exit For
Next          
'設定得票率圖表寬度
Rs.MoveFirst
Dim linelong(4)
For Itemline=0 To Rs.recordcount-1
      For Item=0 To Rs.Fields.Count-1
                        IF Votepeople+Rs.Fields(1).Value >0 Then
                                linelong(Itemline) = 500*Rs.Fields(1).Value/VotePeople
                        End If
      Next
Rs.MoveNext
If Rs.Eof Then Exit For
Next               

'投票檢查
IF Request.Cookies("checkvote")="yes" then
msg="你已經投過票了!只能觀看投票結果!"
VoteButton="no"

ElseIF er="yes" Then
Response.Cookies("er")="no"
msg="之前的投票無效,請選擇一位候選人重新投票"
VoteButton="yes"

Else
Response.Cookies("checkvote")="yes"
msg="你的一票選模範生"
VoteButton="yes"
End IF
%>
<CENTER>
<P><img border="0" src="logo.gif"><br>
<font color="#0000FF"><%=msg%></font></P>
<form method="POST" action="votesave3.asp">
  <table border="1">
    <tr>
      <td bgcolor="#FF3399"><font color="#FFFFFF">圈票處</font></td>
      <td bgcolor="#FF3399"><font color="#FFFFFF">候選人</font></td>
      <td bgcolor="#FF3399"><font color="#FFFFFF">得票數</font></td>
    </tr>
     <%   

Rs.MoveFirst
For Itemline=0 To Rs.recordcount-1
      Response.Write "<TR>"
             Response.Write "<TD><input type=radio name=vote  value=" & Itemline & "></TD>"
             Response.Write chr(10)
             Response.Write "<TD>" & Rs.Fields(0).Value & "</TD>"
             Response.Write chr(10)
        Response.Write "<TD><img border=0 src=vote.gif Height=5 Width=" & linelong(Itemline) & ">"
             Response.Write chr(10)
        Response.Write Rs.Fields(1).Value & "票</TD>"
             Response.Write chr(10)
      Response.Write "</TR>"
          Rs.MoveNext
          'If Rs.Eof Then Exit For
Next          
   
    %>
  </table>
<%IF VoteButton="yes" then %>
<p><input type="submit" value="投下神聖的一票"></p>
<% End IF %>
</form>
</CENTER>[/code]

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

[color=DarkOrange][size=5][b]存取特定資料錄 [/b][/size][/color]
當我們開啟資料庫資料表後,目前作用中的資料錄位置就會是在第一筆資料上,那如果我們要讀取的資料位置在第50筆資料錄上,哪怎麼辦?基礎的解決方式是利用MoveNext方法將作用中的資料錄位置一筆一筆的往下移動,但是,有一個更簡便的方法:使用AbsolutePosition屬性,AbsolutePosition屬性可以立即將我們作用中的資料錄位置移動指定比數的資料上,其使用格式如下。

[attach]852[/attach]

[color=Red]注意:[/color]
[list]
[*]指定作用中的資料錄位置其位置編號是從"1"開始,也就是說上圖中的X值必須等於或大於"1"!當然,其最大值是必須小於或等於資料表中的資料總筆數!!
[*]建立資料庫存取的資料錄Recordset物件時其指定鎖定類型參數(參數4),不可指定為"1"開啟唯讀資料錄,否則將會引發下圖的錯誤訊息:
[attach]850[/attach]
[/list]

[color=DarkOrange][size=5][b]投票結果儲存程式[/b][/size][/color]
投票結果儲存程式『votesave3.asp』,在本程式中完全沒有網頁資料的顯示,本程式只負責將投票程式網頁中所傳送過來的投票資料資料更新到資料庫中,然後將連結轉向回投票程式網頁。

[attach]851[/attach]

將接收來自投票程式網頁中表單所傳送過來的投票資料值(vote變數的值),作為Select Case 敘述的比對依據。
[list=1]
[*]利用多執行路徑的 Select Case 敘述來決定目前的作種中資料錄位置應該移至哪一筆資料上。
[*]將作用中資料錄的第"1"個資料欄位(得票數)值加一,代表該票選項目獲得選票。
[*]利用Update方法將新的投票結果更新寫入到資料庫中。
[*]利用Response.Redirect "vote3.asp" 程式敘述轉向連結回投票程式網頁vote3.asp去顯示最新的投票結果。
[/list]


Votesave3.asp[code]<%
'判斷是否有正確投票
vote=Request("vote")
IF vote=empty then
Response.Cookies("er")="yes"
Response.Cookies("checkvote")="no"
Response.Redirect "vote3.asp"
Else
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
'更新投票結果        
Select case vote
        case 0
                 RS.absoluteposition=1
                 Rs(1)=Rs(1)+1
        case 1
                 RS.absoluteposition=2
                 Rs(1)=Rs(1)+1
        case 2
                 RS.absoluteposition=3
                 Rs(1)=Rs(1)+1
        case 3
                 RS.absoluteposition=4
                 Rs(1)=Rs(1)+1
    case 4
                 RS.absoluteposition=5
                 Rs(1)=Rs(1)+1
end Select
RS.UPdate
End If
Rs.Close
Conobject.Close
Response.Redirect "vote3.asp"

%>[/code]雖然這個程式可以執行,但是還是有一個缺點呦!這個缺點由您來發現,發現後寫個E-mail給小誌,還要告訴小誌你的解決辦法喔!第一個告訴小誌的,我會刊登在網站上,然後A一份禮物給你(因為小誌沒財力,所以只好……呵)。


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

頁: [1]

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