欢迎光临
我们一直在努力

用ASP技术开发WEB调查(投票)系统 (3)-ASP教程,ASP应用

建站超值云服务器,限时71元/月

三、调查表单的生成与结果分析
  作 者 : 仙人掌工作室
  
     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数据库导出为文本格式,然后再导入到其它软件。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 用ASP技术开发WEB调查(投票)系统 (3)-ASP教程,ASP应用
分享到: 更多 (0)