三、调查表单的生成与结果分析
作 者 : 仙人掌工作室
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.write(“< tr>< td>” & _
“< td align=center width=300 bgcolor=””#ffff00″”>回答” & _
“< td align=right bgcolor=””#ffff00″”>n” & _
“< td align=right bgcolor=””#ffff00″”>%” & _
“< td width=200 bgcolor=””#ffff00″”> “)
if shownoop and objrs(“noopinion”) = “y” and itype < > “5” then
call writeresponse(“没有回答”, itemix, 0, “#ff0000”)
end if
select case itype
case “1” 是/否
call writeresponse(“是”, itemix, 1, “#00ff00”)
call writeresponse(“否”, itemix, 2, “#00ff00”)
case “2” 赞同程度
…略…
case “3” 语义区别
…略…
case “4” 多项选择
…略…
case “5” 允许复选
…略…
end select
response.write(“< tr>< td>< td align=right>总回答次数: ” & _
“< td align=right>” & n & “< td>< td>”)
response.write(“< tr>< td colspan=5> “)
if nomove then
nomove = false
elseif not objrs.eof then
objrs.movenext
end if
itemix = itemix + 1
loop
response.write(“< /table>”)
end sub main
统计投票次数
function count()
dim i, j
rname = “[r_” & pollname & “]”
set objrs = objconn.execute(“select responses from ” & rname)
if objrs.bof then 没有投票记录
exit function
end if
nanswers = len(objrs(“responses”)) 投票结果字符串的字符数
redim counts(nanswers-1, 26) 允许 + a 到 z
for i = 0 to nanswers-1 初始化统计数组
for j = 0 to 26
counts(i, j) = 0
next
next
nresponses = 0
do while not objrs.eof
responses = objrs(“responses”)
nresponses = nresponses + 1
nansthis = len(responses) 当前回答字符串中的字符数
if nansthis < > nanswers then
count = false
exit function
end if
for i = 0 to nansthis-1 统计各个问题的投票数
respltr = mid(responses, i+1, 1)
if respltr = ” ” then
counts(i,0) = counts(i,0) + 1
else
respix = asc(respltr) – 64 将字母转换为索引值
if respix > 0 and respix < 27 then
counts(i,respix) = counts(i,respix) + 1
end if
end if
next
objrs.movenext
loop
objrs.close
count = true
end function count()
输出一个表格行
sub writeresponse(respstr, itemix, ansix, barcolor)
response.write(“< tr>< td>< td>” & respstr & _
“< td align=right>” & counts(itemix, ansix) & “< td align=right>” & _
formatnumber(100*counts(itemix, ansix)/n, 1) & “< td>”)
call writebar(counts(itemix, ansix)/n, barcolor)
end sub writeresponse()
用嵌套表格的背景色显示统计直方图
sub writebar(percent, barcolor)
response.write(“< table cellspacing=0 cellpadding=0 width=””” & _
200*percent & “””>< tr>< td bgcolor=””” & barcolor & “””>” & _
iif(percent>0, ” “, “”) & “< /td>< /table>”)
end sub writebar()
…其它辅助函数,略…
%>
四、其它说明
⑴ 示例代码假定asp脚本放在服务器的/scripts目录下。如果放到了另外一个目录下,则需修改startup.html中pollmaker.asp文件的路径。所有的asp文件必须在同一目录下。
⑵ 示例代码中的poll.mdb是一个access数据库,应该为它创建一个odbc名字,即用windows控制面板中的“32位odbc数据源”为该数据库创建名为“poll”的系统dsn。整个系统只需一个数据库即可,这和调查项目的多少无关。
⑶ 支持itemmaker.asp编辑操作的javascript函数位于最上面的帧controlframe,但有时候被中间帧itemframe中的事件调用。因此,这些函数的引用必须包含文档模型的层次关系,如:parent.controlframe.saveitem()。如果不是通过startup.html,而是直接打开itemmaker.asp,由于帧结构不存在会出现javascript错误。
⑷ 在本实现中,当投票结果保存到r_表之后仍旧允许修改调查项目定义。这使得调查项目启用之后还可以改正提示文本上的问题,但也带来潜在的问题,即当问题被创建、删除或改变次序之后,它与已有的投票结果之间可能出现错误的对应关系。因此,对于已有投票结果的调查项目,执行上述操作之前应该使用图1中的“删除调查结果”按钮删除已有结果。
⑸ 从其它地方引用调查表单(pollwriter.asp)或结果分析页面(pollresult.asp)时,必须提供它们所要用到的表单变量(如pollname、shownoop、linktext、linkurl)。打开调查表单的完整url格式为:
http://ygroup01/scripts/pollwriter.asp?pollname=test+poll+1&linktext=return+to+home+page&linkurl=/
打开调查结果分析页面的完整url格式为:
http://ygroup01/scripts/pollresult.asp?pollname=test+poll+1&shownoop=true
⑹ 本文只提供了5种问题类型,在实际应用场合可能需要定义其它的问题类型。在已有的框架内增加新的问题类型需要扩展(修改)itemmaker.asp、pollwriter.asp、pollresult.asp这三个文件。
⑺ 如果要对投票结果作更为复杂的分析,可以使用那些支持从access导入数据的标准统计软件包,也可以先将access数据库导出为文本格式,然后再导入到其它软件。
用ASP技术开发WEB调查(投票)系统 (3)-ASP教程,ASP应用
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 用ASP技术开发WEB调查(投票)系统 (3)-ASP教程,ASP应用
相关推荐
-      ASP 简介
-      SQL注入天书 – ASP注入漏洞全接触
-      用.net 处理xmlHttp发送异步请求
-      asp.net创建文件夹的IO类的问题
-      如何实现ASP.NET网站个性化
-      关于ASP.NET调用JavaScript的实现
-      ASP利用Google实现在线翻译功能
-      Asp无组件生成缩略图