使用复选框将结果返回给SQL Server

时间:2014-07-31 16:24:15

标签: sql-server checkbox asp-classic

我在ASP Classic中有以下代码:

<%
dim prac_id
prac_id = Request.Form("Practice_ID")
dim surname_id
surname_id = Request.Form("clientsurname")

If prac_id <> "" And IsNumeric(prac_id) AND surname_id <>"" then
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open "claims","username","password"
strSQL = "SELECT * FROM (Claim_Status INNER JOIN PI_Agents ON Claim_Status.Agent_ID =  PI_Agents.Agent_ID) INNER JOIN Statuses on Claim_Status.Status_ID = Statuses.Status_ID WHERE Practice_ID = '"&prac_id&"' AND Client_Surname LIKE '%" & surname_id & "%'"

set rs = Conn.Execute (strSQL)

%>
<html>
<head>
<title>PI Accepts - Results</title>
</head>

<body>
<a href="default.asp" title="Home Page">Home Page</a>
<form method="POST" action="result.asp" name="form1">
<td width="10">
<select name="Practice_ID" size="1" ID="Prac">
     <option value="0">Select Practice</option>
     <option value="1">HCL</option>
     <option value="2">Silverbeck</option>
     <option value="3">TPF</option>
 <option value="4">Express</option>
</select>

</td>
<p> Client Surname </p>
<input type="text" name="clientsurname" value="" />

<tr>
  <td>&nbsp;</td>
  <td colspan="2"><input type="submit" name="Submit" value="Submit"></td>
</tr> 
</form>

<table border="1">
<form>
<tr><th>Claim ID</th><th>Date</th><th>Agent</th><th>Client First Name</th><th>Client Surname</th><th>Client Number</th><th>Current Status</th><th>Accepted</th><th>Rejected</th></tr>
<% DO WHILE NOT rs.EOF %>
<tr><td><% Response.Write rs("ID_Ref") %></td><td><% Response.Write rs("Date_Passed") %></td><td><% Response.Write rs("Agent_Name") %></td><td><% Response.Write rs("Client_First_Name") %></td><td><% Response.Write rs("Client_Surname") %></td><td><% Response.Write rs("Main_Number") %></td><td><% Response.Write rs("Status") %></td>
<td><input type="checkbox" name="accepted" id="<%= rs("ID_Ref")%>" value="1"></td><td> <input type="checkbox" name="rejected" id="<%= rs("ID_Ref")%>" value="2"></td><td><input type="submit" name="editclaim" value="Submit"></td></tr>
</form>
<%
rs.MoveNext
Loop
%>
</table>
if request.form("accepted") <>""then
update Claim_Status SET Status_ID=1 WHERE ID_Ref=

<%
conn.Close
Set conn = Nothing
End IF
%>

</body>
</html>

我要做的是,使用两个复选框(接受和拒绝),如果选择其中一个并按下“提交”,则返回值(接受1或拒绝2)到'Claim_Status'表中的'Status_ID'列,其中所选择的索赔的ID_Ref与数据库中索赔的ID_Ref匹配(例如,如果搜索了Smith并且它提出了编号为1,2,3的索赔, 4,有人选择编号为3的那个,然后它只会更新数据库中的那个)

页面工作正常,复选框显示正常(当页面首次显示时,它们都需要取消勾选)但是我无法弄清楚最后一点编码,以便根据勾选的相关复选框获取状态更新。 / p>

任何帮助表示感谢...谢谢!!

1 个答案:

答案 0 :(得分:2)

这里有一些问题。循环外面有FORM打开标记,但循环内有FORM close标记。您希望用户一次提交多行还是一次提交一行。我假设您在每行中都有一个提交按钮,您希望用户一次提交一行。

如果是这种情况,那么你应该在循环中移动FORM open标签并添加一个隐藏字段来标识该行。

<% DO WHILE NOT rs.EOF %>
<form method="POST" action="result.asp">
<input name="idref" value="<%= rs("ID_Ref") %>">
<tr>
  <td><% Response.Write rs("ID_Ref") %></td>
  <td><% Response.Write rs("Date_Passed") %></td>
  <td><% Response.Write rs("Agent_Name") %></td>
  <td><% Response.Write rs("Client_First_Name") %></td>
  <td><% Response.Write rs("Client_Surname") %></td>
  <td><% Response.Write rs("Main_Number") %></td>
  <td><% Response.Write rs("Status") %></td>
  <td><input type="checkbox" name="accepted" id="<%= rs("ID_Ref")%>" value="1"></td>
  <td><input type="checkbox" name="rejected" id="<%= rs("ID_Ref")%>" value="2"></td>
  <td><input type="submit" name="editclaim" value="Submit"></td>
</tr>
</form>
<%
rs.MoveNext
Loop
%>

然后在页面上,表单发布到(results.asp?),您可以检索refid字段的值(Request.Form("refid")),检查选中了哪个复选框并进行数据库更新。

上面的代码可能存在一些问题,这些代码在TABLE结构中以这种方式使用,但它仍然有用。

但是,如果您希望用户能够一次提交多个行,那么您可以将FORM标记移动到TABLE之外并循环,并以不同方式命名每个复选框,以便您可以识别单击哪个。您还可以更改为一个提交按钮。然后在您发布给您的页面上可以再次打开记录集并循环查看复选框的状态,或循环访问Request.Form集合以查找已选中的复选框。

<form method="POST" action="result.asp">
<table border="1">
<tr><th>Claim ID</th><th>Date</th><th>Agent</th><th>Client First Name</th><th>Client Surname</th><th>Client Number</th><th>Current Status</th><th>Accepted</th><th>Rejected</th>    
</tr>
<% DO WHILE NOT rs.EOF %>
<tr>
  <td><% Response.Write rs("ID_Ref") %></td>
  <td><% Response.Write rs("Date_Passed") %></td>
  <td><% Response.Write rs("Agent_Name") %></td>
  <td><% Response.Write rs("Client_First_Name") %></td>
  <td><% Response.Write rs("Client_Surname") %></td>
  <td><% Response.Write rs("Main_Number") %></td>
  <td><% Response.Write rs("Status") %></td>
  <td><input type="checkbox" name="accepted-<%= rs("ID_Ref")%>" id="<%= rs("ID_Ref")%>" value="1"></td>
  <td><input type="checkbox" name="rejected-<%= rs("ID_Ref")%>" id="<%= rs("ID_Ref")%>" value="2"></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
<input type="submit" name="editclaim" value="Submit">
</form>

在您发布到的页面中:

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open "claims","username","password"
strSQL = "SELECT * FROM (Claim_Status INNER JOIN PI_Agents ON Claim_Status.Agent_ID =  PI_Agents.Agent_ID) INNER JOIN Statuses on Claim_Status.Status_ID = Statuses.Status_ID WHERE Practice_ID = '"&prac_id&"' AND Client_Surname LIKE '%" & surname_id & "%'"
set rs = Conn.Execute (strSQL)
DO WHILE NOT rs.EOF
   intStatusID = 0
   If Request.Form("accepted-" & rs("ID_Ref")) = "1" Then
     'Accepted was checked
     intStatusID = 1
   End If
   If Request.Form("rejected-" & rs("ID_Ref")) = "2" Then
     'Accepted was checked
      intStatusID = 2
   End If
   'Your update query here
   strSQL = "UPDATE Claim_Status SET Status_ID = " & intStatusID & " WHERE Ref_Id = " & rs("ID_Ref")
   Conn.Execute strSQL
   rs.MoveNext
Loop

或者,如果您不想再次遍历数据库,可以使用下面的方法(尽管第一种方法更安全,否则黑客可能通过发布自己的ID来更新错误的行)。

For Each key in Request.Form
  If Left(key, 10) = "accepted-" Or Left(key, 10) = "rejected-" Then
     refid = Mid(key, 9) 'get the id

     If Left(key, 10) = "accepted-" Then
       If Request.Form(key) = "1" Then
         'accepted checkbox checked, do your update query
       End If
     Else
       If Request.Form(key) = "2" Then
         'accepted checkbox checked, do your update query
       End If
     End If
  End If
Next

希望你能从上面得到这个想法。