作者:蕾仔   出处: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 
%>