一、提出問題:
在大型的ASP項目中,都涉及到了條件查詢這一功能。使用者要求能夠針對特定的欄位進行查詢。對於有些資料,是從多個表取出來的,因此也要能對多個表進行查詢。
一般的話,大多數的做法就是每個程式都做一個查詢功能,因為每個查詢的表都不同,涉及的欄位也不同。但是,如果在大型的ASP項目中這麼做的話,不僅增加了工作量、影響開發進度,而且不能使系統模組化、代碼複用,增加了系統維護難度。因此,我們有必要使條件查詢模組化。
二、解決思路:
我們設計條件查詢的功能為:
1、選取查詢欄位(欄位);
2、選取查詢條件(<、>、=、<=、>=、<>、Null、Not Null、Like );
3、輸入條件值;
4、選擇運算關係(Or、And);
5、將查詢條件添加到列表框、或從列表框刪除。
詳細介面請看:
我們以新聞表(dbNews)為例,假定新聞表包含有標題、時間、內容、發布人。
在查詢資料庫時,我們一般都是用如:
“Select * from News Where time='2002-05-22' and User='Tom'”,我們如果能在條件查詢中返回“time='2002-05-22' and User='Tom'”的條件字串,問題就解決了。但如果是不同的程式、不同的表怎麼做呢?這就是看用什麼方法來定義查詢的欄位了。
在這裡,我們把查詢欄位作為一個過程寫在程式中,在查詢模組中調用,這樣,查詢的欄位就是動態產生了。
使用者選擇好了一個查詢欄位,以及匹配條件,將它添加到<select></select>框中,使用者可以繼續選擇另外的查詢條件,然後又把它添加到<select>中,完成了,就點查詢按鈕。用查詢模組產生如:“time='2002-05-22' and User='Tom'”的語句,這樣在程式中就可以調用了。
三、解決方案:
ASP通用條件查詢模組的原始碼請參看 (四、原始碼)。
1、定義過程
在調用條件查詢模組前,首先要在程式中定義一個SearchField()過程:
Sub SearchField()
Response.Write "<option Value='1Title'>標題</option>"
Response.Write "<option Value='1Time'>時間</option>"
Response.Write "<option Value='1Content'>內容</option>"
Response.Write "<option Value='1User'>發布人</option>"
End Sub
其中,Value中為欄位名稱,如果欄位為字元型,就在欄位名前加1,數字型就加2。如:"1Title"。
注意:如果資料是從多個表中取出來的,如:select * from News,User ;那麼Value的值就要加上相應的表,如:1News.Title。這樣就可以從多個表查詢資料。
2、調用條件查詢模組:
<!--#include file="../Public/Condition_Search.asp"-->
3、加入按鈕事件:
加入“條件查詢”按鈕,並添加 onClick="search_dis(s1)"事件:
<Input type="Button" name=ConSearch onClick="search_dis(s1)">
預設狀態下,條件查詢模組隱藏在頁面中,當點“條件查詢”按鈕,就顯示出來,這樣頁面即美觀,也不會妨礙使用者瀏覽。
這樣,我們就完成了“條件查詢”模組的調用
當選擇好了查詢條件,執行查詢後,程式getSql文字框將返回查詢條件,如:“title='Chian' and user='tom'”,用request.form("getSql")取得!在把它加入到SQL語句中,一個新的查詢就產生了。
四、ASP通用條件查詢模組的原始碼
<Script LANGUAGE=javaScript>
<!--
//隱藏或顯示條件查詢模組
function search_dis(ob){
if (ob.style.display=="none")
{ob.style.display="";window.location.href ('#down');}
else
{ob.style.display="none";}
}
//把條件查詢語句添加到<select>查詢列表框;
function AddSe(){
var val,val_tmp,Sql,oAdd,TextType;
var Field,Condition,TextVal,Relation;
Field=frm_Search.Field.options[frm_Search.Field.selectedIndex].text;
TextVal="'"+frm_Search.TextVal.value+"'" ;
Condition=frm_Search.Condition.options[frm_Search.Condition.selectedIndex].text;
Relation=frm_Search.Relation.options[frm_Search.Relation.selectedIndex].text;
val_tmp = frm_Search.Field.value;
val_tmp = val_tmp.substring(0,1);
//判斷欄位的資料類型,如果為1,就是字元、日期型;為2,就是數值型;
if (val_tmp==1)
{TextType="'"+frm_Search.TextVal.value+"' " ;}
else
{TextType=""+frm_Search.TextVal.value+" " ;}
val_Field = frm_Search.Field.value;
val_Field = val_Field.substr(1);
val= val_Field + frm_Search.Condition.value + TextType + frm_Search.Relation.value ;
Sql = Field+Condition+TextVal+Relation;
oAdd=document.createElement("option")
oAdd.value=val;
oAdd.text=Sql;
frm_Search.seSql.add(oAdd);
}
//把條件查詢語句從<select>查詢列表框中刪除;
function moveSe(){
for (i=1;i<frm_Search.seSql.options.length;i++){
if(frm_Search.seSql.options[i].selected){
frm_Search.seSql.remove(frm_Search.seSql.selectedIndex);
}
}
}
//取得查詢條件,並提交;
function getVal(){
var gettxt,Setable;
gettxt = "";
var path = window.location.pathname ; //取得頁面連結和檔案名稱
var line = path.lastIndexOf("/"); //取得最後一個'/'的位置
var dot = path.indexOf("."); //取得第一個'.'的位置
var Name = path.substring(line+1,dot); //取得檔案名稱
var fileName = Name + ".asp";
for (i=1;i<frm_Search.seSql.options.length;i++){
gettxt = gettxt+ " " + frm_Search.seSql.options[i].value ;}
var valLeng=gettxt.lastIndexOf(" ");
gettxt=gettxt.substr(0,valLeng); //去掉條件子句的最後一個關係運算子
Setable = frm_Search.Setable.value ;
//window.open (fileName+'?gettxt='+gettxt,'_self'); //向當前頁面傳送查詢條件子句
frm_Search.getSql.value = gettxt;
frm_Search.action = fileName;
frm_Search.submit ();
}
//-->
</Script>
<a Name="down"></a>
<Form Name="frm_Search" method="post" action="">
<input type="hidden" Name=getSql Value="">
<table bgcolor=#6699CC width=100%>
<tr><td>
<table width="617" border="0" cellspacing="1" cellpAdding="2" bgcolor="#CCCCCC"
align="center">
<tbody id=s1 style=display:none>
<tr>
<td width="134" height="25" bgcolor="#006699">
<div align="right"><font color="#FFFFFF" style="font-size:10pt">查詢欄位:
</font></div>
</td>
<td width="159" bgcolor="#F2F2F2">
<select Name="Field" style="font-size:12px"><%Call SearchField()%></select>
</td>
<td width="102" bgcolor="#E1E1E1">
<div align="center">
<input type="button" Name="AddSql" Value="添加>>>" onClick="AddSe()"
style="BACKGROUND: #ffdead;BORDER-BOTTOM: #665b8e 1px solid;BORDER-LEFT: #ffffff 1px
solid;BORDER-RIGHT: #665b8e 1px solid;BORDER-TOP: #ffffff 1px solid;COLOR: #333333;CURSOR:
hand;FONT-SIZE: 12px;HEIGHT: 20px;PAddING-BOTTOM: 1px;PAddING-LEFT: 1px;PAddING-RIGHT:
1px;PAddING-TOP: 1px">
</div>
</td>
<td rowspan="4" bgcolor="#F2F2F2" width="221">
<select id="seSql" size="6">
<option Value="">------------查詢條件-----------</option>
</select>
</td>
</tr>
<tr>
<td width="134" height="25" bgcolor="#006699">
<div align="right"><font color="#FFFFFF" style="font-size:10pt">查詢條件:
</font></div>
</td>
<td width="159" bgcolor="#F2F2F2">
<select Name="Condition" style="font-size:12px">
<option Value="=">等 於</option>
<option Value=">">大 於</option>
<option Value=">=">大於等於</option>
<option Value="<">小 於</option>
<option Value="<=">小於等於</option>
<option Value="<>">不等於</option>
<option Value=" NULL ">為空白</option>
<option Value=" NOT NULL ">不為空白</option>
<option Value=" LIKE ">匹配</option>
</select>
</td>
<td width="102" bgcolor="#E1E1E1">
<div align="center">
<input type="button" Name="delSql" Value="<<<刪除" onClick="moveSe()"
style="BACKGROUND: #ffdead;BORDER-BOTTOM: #665b8e 1px solid;BORDER-LEFT: #ffffff 1px
solid;BORDER-RIGHT: #665b8e 1px solid;BORDER-TOP: #ffffff 1px solid;COLOR: #333333;CURSOR:
hand;FONT-SIZE: 12px;HEIGHT: 20px;PAddING-BOTTOM: 1px;PAddING-LEFT: 1px;PAddING-RIGHT:
1px;PAddING-TOP: 1px">
</div>
</td>
</tr>
<tr>
<td width="134" height="25" bgcolor="#006699">
<div align="right"><font color="#FFFFFF" style="font-size:10pt">條 件 值:
</font></div>
</td>
<td width="159" bgcolor="#F2F2F2">
<input type="text" id="TextVal" size="15" style="BACKGROUND-COLOR: white; BORDER-
BOTTOM: #000000 1px solid;BORDER-LEFT: #000000 1px solid;BORDER-RIGHT: #000000 1px solid;BORDER-
TOP: #000000 1px solid;FONT-SIZE: 9pt">
</td>
<td width="102" bgcolor="#E1E1E1"> </td>
</tr>
<tr>
<td width="134" height="25" bgcolor="#006699">
<div align="right"><font color="#FFFFFF" style="font-size:10pt">關係運算子:
</font></div>
</td>
<td width="159" bgcolor="#F2F2F2">
<select Name="Relation" style="font-size:12px">
<option Value="and">並且</option>
<option Value="or">或者</option>
</select>
</td>
<td width="102" bgcolor="#E1E1E1">
<div align="center">
<input type="button" Name="search_ok" Value="查 詢" onClick="getVal()"
style="BACKGROUND: #deb887;BORDER-BOTTOM: #665b8e 1px solid;BORDER-LEFT: #ffffff 1px
solid;BORDER-RIGHT: #665b8e 1px solid;BORDER-TOP: #ffffff 1px solid;COLOR: #333333;CURSOR:
hand;FONT-SIZE: 12px;HEIGHT: 20px;PAddING-BOTTOM: 1px;PAddING-LEFT: 1px;PAddING-RIGHT:
1px;PAddING-TOP: 1px">
</div>
</td>
</tr>
</tbody>
</table>
</td></tr>
</table>
</Form>