日期:2014-02-07  浏览次数:20976 次

一、说明
大多数最终用户都要求他们的Web方案能够提供某种报表能力。使用HTML和ASP,可以很容易地提供在表格中列出记录以及逐条浏览它们的能力。但用户往往要求能够通过下拉列表框(或其它选择方式)选择某一类别的记录,或者说,他们希望能够使用某种“查询界面”来建立和执行查询,而不必直接使用SQL。本文演示运用ASP技术建立可选择的记录过滤界面的一种方法。虽然这里讨论的解决方法相当简单,但使用类似的技术可以在任何Web页面提供复杂的查询能力。
在为任何一个解决方法编码之前,都应该充分理解并记录最终用户的需求。对于本例来说,用户要求能够用指定类别名字的方法获取指定表的一组记录,他既可以选择所有的类别也可以选择某个特定的类别。为实现这个功能,我们使用一个“递归的”ASP页面,它所提供的选择表单中包含了来自数据库的类别列表,根据表单所发送的数据提取结果记录集,结果记录将以表格的形式显示以方便用户察看。

二、构造过滤条件
对于这种数据库应用,首先应该了解所涉及的数据库表结构以及连接数据库系统所必须的连接参数。连接参数的指定方法在Microsoft的ASP联机文档中有很详细的说明,本文不再赘述。本例要用到的两个表为:Document_Category,它包含供用户选择的唯一的类别名字Category_Name;Documents,它包含对应于类别名字的其它数据,字段包括Category_Name、File_Name、Comments、Date_Submitted等。
选择表单中的类别列表来自于类别表Document_Category的Category_Name字段,构造类别下拉列表框的代码如下,请注意这里要用到VBScript ADO包含文件:


 <!-- #Include file = "ADOVBS.INC" -->
 <%
 ConnString = "DSN=LocalUpload;"
 Set conn = Server.CreateObject("ADODB.Connection")
 conn.Open ConnString,,,adOpenForwardOnly
 Set rs = SERVER.CreateObject("ADODB.Recordset")
 ' 首先获取用来填充下拉列表框的类别记录
 ' 设置SQL语句
 strSQL = "SELECT * FROM Document_Category ORDER BY category_name"
 
 rs.Open strSQL,conn, adOpenStatic
 %>
 
 <FORM name="formCategory">
 
 <SELECT NAME="qryCategory"
>
 <OPTION selected>请选择一个类别:
 <% Do While Not rs.EOF
  Response.Write ("<OPTION value='" & rs("Category_Name") & "'>" _
& rs("Category_Name"))
  rs.MoveNext
 Loop
 rs.Close
 Set rs=Nothing
 %>
 </OPTION>
 </SELECT><BR>
 </FORM>

SELECT标记中的OnChange用来提交HTML表单。当下拉列表框的值改变,JavaScript函数getFilter就会执行。使用类似的方法,可以将数据库表的记录用多个不同表单元素来描述(如第二个下拉列表框,单选按钮或复选框等等)。用户所选择的类别值将用来构造从数据库提取记录的SQL SELECT语句。

三、提交表单
这里我们要用到两个JavaScript函数来完成表单信息提交任务。getFilter函数用来将用户选择的类别值提交给页面本身,而getListValue函数则用来获取用户所选择的类别值。选用JavaScript实现这两个函数使得脚本能够在不同的浏览器上运行:
 <SCRIPT language="JavaScript">
 function getFilter(listitem){
  var object = "";
  var listValue = getListValue(listitem);
  document.formCategory.submit(listValue);
 }
 function getListValue(list){
  var listValue="";
  if (list.selectedIndex != -1) {
  listValue = list.options[list.selectedIndex].value;
  }
  return (listValue);
 }
 </SCRIPT>

四、显示结果
   最后要做的就是构造查询并显示查询结果了。首先,查询的构造依赖于用户在下拉列表框中所选择的类别名字,这个查询只需一个简单的SQL SELECT语句,在WHERE子句中指定用户所选择的类别即可。构造好查询之后就可以执行它了,如果没有符合要求的记录,则向用户显示一个提示信息;否则就显示这些记录。下面是完成上述任务的VBSCript代码:
 <%
 If Request.QueryString("qryCategory") = "" Then
  Response.Write("请从列表中选择一个类别.")
 Else
  ' 构造查询
  Set rs = SERVER.CreateObject("ADODB.Recordset")
  ' 设置SQL语句
  strSQL = "SELECT Documents.File_Name, Documents.Comments,"
strSQL = strSQL & "Documents.Date_Submitted "
  strSQL = strSQL & "FROM Documents "
  strSQL = strSQL & "WHERE ((Documents.Category_Name) = '" _&
Request.QueryString("qryCategory") & "')"
 
  ' 打开Recordset对象
  rs.Open strSQL,conn,adOpenStatic
 
  If rs.RecordCount = 0 Then
  Response.Write("没有发现指定类别的记录" _ &
Request.QueryString("qryCategory"))
  Else
  Response.Write("<H3>给定类别含以下记录: " _ &
Request.QueryString("qryCategory") & "</H3>")
 
  ' 在表格中显示查询结果
  Response.Write("<TABLE CELLSPACING=2 COLS=3 WIDTH=500>")
  Response.Write("<TR>")
  Response.Write("<TD ALIGN=CENTER VALIGN=TOP WIDTH=20%")
  Response.Write(" BGCOLOR=#C8C8FF><B>名称</B></TD>")
  Response.Write("<TD ALIGN=CENTER VALIGN=TOP WIDTH=65% ")
  Response.Write("BGCOLOR=#C8C8FF><B>说明</B></TD>")
  Response.Write("<TD ALIGN=CENTER VALIGN=TOP WIDTH=15% ")
  Response.Write("BGCOLOR=#C8C8FF><B>日期</B></TD>")
  Response.Write("</TR>")
 
  Do While Not rs