web|投票|投票 三、調查表單的產生與結果分析
作 者 : 仙人掌工作室
PollWriter.asp先檢查表單變數,包括調查項目名字PollName以及(可選的)字串LinkText和LinkURL,LinkText和LinkURL描述了使用者提交其投票結果之後顯示的URL。接下來指令碼建立並執行從指定調查項目的S_表和A_表提取記錄集的SQL命令,然後遍曆這個記錄集格式化選項按鈕、複選框以及其它提示文本,最後輸出該調查項目的HTML表單。表單中問題的名字為“CHOICE”加問題序號。當這個表單被提交的時,它的ACTION將裝載PollMaker.asp(這裡的函數saveResponses()從CHOICE表單元素提取投票結果,然後更新資料庫,代碼略)。表單中的其它隱藏變數用於將PollName、OpType、LinkText、LinkURL傳遞給PollMaker.asp:
< %
' 從S_表和A_表讀取調查項目定義
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "poll"
SQLCommand = "Select " & SName & ".ID, " & _
"IType, NoOpinion, Stem, ALabel, Answer FROM " & SName & "LEFT JOIN " & _
AName & " ON " & SName & ".ID = " & AName & ".ID ORDER BY " & _
SName & ".ID, ALabel"
Set objRS = objConn.Execute(SQLCommand)
' 向調查表單輸出各個問題
Do While Not objRS.EOF
Response.Write("< TR>< TD>" & objRS("ID") & ".< TD BGCOLOR=""#ffff00"">" & _
objRS("Stem"))
Response.Write("< TR>< TD>< TD>")
ckNoOpinion = IIf(objRS("NoOpinion") = "Y", "", "Checked")
noMove = False
' 除"允許複選",其它各類問題均需檢查是否允許不回答問題
ansName = """CHOICE" & objRS("ID") & """"
Select Case objRS("IType")
Case "1" ' 是/否
If ckNoOpinion = "" Then
Response.Write(" < INPUT TYPE=radio NAME=" & ansName & _
" VALUE="" "" Checked>暫不回答 ")
End If
Response.Write("< INPUT TYPE=radio NAME=" & ansName & _
" VALUE=""A"" " & ckNoOpinion & ">是")
Response.Write("< INPUT TYPE=radio NAME=" & ansName & _
" VALUE=""B"">否")
Case "2" ' 贊同程度
...略...
Case "3" ' 語義區分
...略...
Case "4" ' 多項選擇
...略...
Case "5" ' 允許複選
...略...
End Select
If NoMove Then
NoMove = False
ElseIf Not objRS.EOF Then
objRS.MoveNext
End If
Loop
%>
PollResult.asp使用與PollWrite.asp同樣的SQL命令從A_表(答案)和S_表(問題)提取記錄集,接著從對應的R_表讀取使用者回答結果,用一個二維數組Counts統計投票結果。預設時結果分析中不包含“沒有回答”,如果要包含,則需給出表單變數ShowNoOp並指定其值為True,請參見圖4中顯示投票結果的URL。
< %
'Globals
Dim PollName
Dim Counts() ' 使用者回答的統計數組
Dim nResponses
Dim N ' 使用者回答數量,可能不包含"沒有回答"選項
Dim objConn
Dim objRS
nResponses = 0
Call Main
Sub Main
Dim likert
Dim i
Likert = Array("強烈反對","反對", "不確定","同意","完全贊成")
PollName = Request("PollName")
ShowNoOp = IIf(UCase(Request("ShowNoOp"))="TRUE", True, False)
' 從A_表和S_表讀取調查項目定義
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "poll"
SName = "[S_" & PollName & "]"
AName = "[A_" & PollName & "]"
If Count() = False Then
Response.Write("< BR>此調查項目沒有投票結果")
Exit Sub
End If
SQLCommand = "Select " & SName & ".ID, " & _
"IType, NoOpinion, Stem, ALabel, Answer FROM " & SName & _
"LEFT JOIN " & AName & " ON " & SName & ".ID = " & AName & _
".ID ORDER BY " & SName & ".ID, ALabel"
Set objRS = objConn.Execute(SQLCommand)
Response.Write("< TABLE>")
... 輸出表單標題,略 ...
Response.Write("< TR>< TD COLSPAN=5> ")
itemIx = 0 ' 問題序號
Do While Not objRS.EOF
IType = objRS("IType")
NoMove = False
N = IIf(ShowNoOp Or IType=5, nResponses, nResponses-Counts(itemIx, 0))
N = IIf(N=0, 1, N)
Response.Write("< TR>< TH ALIGN=right>" & objRS("ID") & _
".< TH ALIGN=left COLSPAN=4 BGCOLOR=""#ffff00"">" & objRS("Stem"))
Response.Wr