作者:蕾仔 出处:http://www.LeiZai.com加入时间:2010-11-17 21:23:47
最近在写ERP时,用户对多字段多关键字的询问让我烦啊。。
关于ASP+access 对多字段,多关键字 模糊搜索我找了好久。。
在网上有许多的。。基本都是ASP SeverSQL的,
在access里还真的没找到,难道没有??
这个搜索问题一直在脑海里有三个月了。。如果只能用access该怎么办。。
在一次使用Instr函数时,突然想到了这个问题的关键解法,哈哈
先用文字说一遍吧
1. 首先把要搜索的字段内容合并。(中间加了些特殊符号,防止两个字段之间刚好与关键字一样了)
2. 将多关键字分解。
3. 将分解好的关键字,用Instr函数一个个循环与合并好的字段判断是否存在,并标记好。
4. 将存在标记与关键字数量对比,如果一样就证明多关键字在这一条记录存在的。
5. 输出记录存在的
缺点:
也许以下代码比较费资源的。。没办法,先用着吧。。谁用更好的代码告诉我吧。
优点:
关键字可不分前后,有点百度搜索的感觉了。
现下面只写重点代码了。。。
<%
search_text=request("search_text") '搜索内容
select_sort=request("select_sort") '搜索字段,如值为 search_all:所有字段
kk_l=1 '打开搜索
search_text=UCase(search_text) '搜索内容变大写
search_text=replace(search_text, " ", "%") '将空格转变成%
'------------------------------------ 选择不同的SQL语句
if select_sort="search_all" then '所有类型搜索
sql="select * from stock "
kk_l=0 '默认搜索标志为 关
elseif select_sort="product_no" then '搜索编号类型
sql="select * from stock where ( product_no like '%"&search_text&"%')"
elseif select_sort="product_sort" then '搜索产品类型
sql="select * from stock where ( product_sort like '%"&search_text&"%')"
end if
'------------------------------------
m_n="aa.mdb" '数据库名字
'======================================================= 连接数据库
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Provider=Microsoft.JET.OLEDB.4.0;Data Source= "&server.MapPath (m_n)
Set rs= Server.CreateObject("ADODB.Recordset")
'=======================================================
rs.open sql,conn,1,1
do while not rs.eof
if select_sort="search_all" then
'需要搜索字段集合,转变成大写
all_text=UCase(rs("product_no")&"^"&rs("product_name")&"^"&rs("product_format")&"^"&rs("product_format2")&"^"&rs("w_site"))
have_t=0 '初始值
h_k=1 '初始值
if Instr(search_text,"%")>0 then '如果有两个以上关键字时
search_text2=Split(search_text,"%") '用数组分解关键字
h_k=Ubound(search_text2) '看一共有几个关键字,3代表是4个,0,1,2,3
for i=0 to h_k '循环搜索 有多少个数组(关键字)就跑几次
if Instr(all_text,search_text2(i))>0 then
have_t=have_t+1 '如果字体集合里有关键字时,have_t累加1,为后面验证用
end if
next
else '单个关键字时
if Instr(all_text,search_text)>0 then h_k=-1
'如果字体集合里有关键字时,直接等于-1,因为后面的判断h_k已经加1
end if
if have_t=h_k+1 then '如果have_t累加的数量与关键字的数量一样时
kk_l=1 '标志搜索打开
else
kk_l=0 '没有就不打开咯
end if
end if
'============================ 显示搜索结果
if kk_l=1 then%>
<br />
编号为:<%=rs("product_no")%><br />
名字为:<%=rs("product_name")%><br />
类型1为:<%=rs("product_format")%><br />
类型2为:<%=rs("product_format2")%><br />
<%
end if
'============================
rs.movenext
loop
rs.close
set rs=nothing
conn.close
set conn=nothing
%>