Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Arthur Webdesigner

[Resolvido] Busca AND e OR em Access

Recommended Posts

Olá, estou precisando de uma ajuda e ficaria muito grato se alguém pudesse me ajudar.

 

A questão é a seguinte, tenho um sistema de buscas paginadas de médicos em um banco de dados Access. O código busca em quatro campos da tabela: nome, endereço, cidade, e especialidade. Só que ele busca a palavra completa, se eu pesquisar oftalmologista são paulo ele não irá exibir nada, porém se procurar apenas oftalmologista ele aparecerá todos oftalmologistas de várias cidades, e se pesquisar são paulo aparecerá médicos de várias especialidades na cidade de são paulo.

O que eu precisava era algo como os sistemas de buscas de artigos científicos que usam a opção AND e OR. Na verdade eu tenho uma idéia do que deve ser feito, mas eu não sei fazer.

O que queria era que se a busca pela palavra completa não gerasse resultados, então ele optaria por fazer uma busca pelas palavras separadas, assim os usuários teriam o resultado que esperam. A parte do código que tem que ser alterada, acredito que seja esta:

 

<% If iRecordCount = 0 Then %>

Nenhum resultado encontrado. Tente novamente.

 

Seria algo assim, SE resultado = 0, então busca palavras separadamente. Só que eu não sei fazer isso. Será que alguém poderia me ajudar?

 

O código completo é este:

<%

Const adOpenStatic = 3

Const adLockReadOnly = 1

Const adCmdText = &H0001

 

Const PAGE_SIZE = 15

 

Dim strURL

 

Dim cnnSearch

Dim rstSearch

Dim strDBPath

 

Dim strSQL

Dim strSearch

 

Dim iPageCurrent

Dim iPageCount

Dim iRecordCount

Dim I

 

 

strURL = Request.ServerVariables("URL")

 

 

strSearch = Request.QueryString("search")

strSearch = Replace(strSearch, "'", "''")

 

If Request.QueryString("page") = "" Then

iPageCurrent = 1

Else

iPageCurrent = CInt(Request.QueryString("page"))

End If

 

%>

 

<p>Buscar médico:</p>

<form action="<%= strURL %>" method="get">

<input name="search" value="<%= strSearch %>" />

<input type="submit" />

</form><br /><br />

 

<%

If strSearch <> "" Then

 

strDBPath = Server.MapPath("database.mdb")

 

Set cnnSearch = Server.CreateObject("ADODB.Connection")

 

cnnSearch.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath & ";"

 

 

strSQL = "SELECT nome, endereco, cidade, especialidade " _

& "FROM medicos " _

& "WHERE nome LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "OR endereco LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "OR cidade LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "OR especialidade LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "ORDER BY nome;"

 

Set rstSearch = Server.CreateObject("ADODB.Recordset")

rstSearch.PageSize = PAGE_SIZE

rstSearch.CacheSize = PAGE_SIZE

 

 

rstSearch.Open strSQL, cnnSearch, adOpenStatic, adLockReadOnly, adCmdText

 

iRecordCount = rstSearch.RecordCount

iPageCount = rstSearch.PageCount

 

If iRecordCount = 0 Then

%>

<p>

<b>Nenhum resultado encontrado. Tente novamente.

</p>

<%

Else

rstSearch.AbsolutePage = iPageCurrent

%>

<hr />

<p>

<b><%= iRecordCount %> resultados encontrados</b> - Exibindo página <%= iPageCurrent %>

de <%= iPageCount %>:

</p>

 

<table border="1">

<%

Do While Not rstSearch.EOF And rstSearch.AbsolutePage = iPageCurrent

%>

<tr><td>Nome: <%= rstSearch.Fields("nome").Value %></td></tr>

<tr><td>Endereço: <%= rstSearch.Fields("endereco").Value %></td></tr>

<tr><td>Cidade: <%= rstSearch.Fields("cidade").Value %></td></tr>

<tr><td>Especialidade: <%= rstSearch.Fields("especialidade").Value %></td></tr>

<tr><td><br /><br /></tr>

<%

rstSearch.MoveNext

Loop

%>

</table>

 

<p>

<%

If iPageCurrent > 1 Then

%>

<a href="<%= strURL %>?search=<%= Server.URLEncode(strSearch) %>&page=<%= iPageCurrent - 1 %>">[<< Anterior]</a>

<%

End If

 

 

For I = 1 To iPageCount

If I = iPageCurrent Then

%>

<%= I %>

<%

Else

%>

<a href="<%= strURL %>?search=<%= Server.URLEncode(strSearch) %>&page=<%= I %>"><%= I %></a>

<%

End If

Next

 

If iPageCurrent < iPageCount Then

%>

<a href="<%= strURL %>?search=<%= Server.URLEncode(strSearch) %>&page=<%= iPageCurrent + 1 %>">[Próximo >>]</a>

<%

End If

%>

</p>

<%

End If

 

 

rstSearch.Close

Set rstSearch = Nothing

cnnSearch.Close

Set cnnSearch = Nothing

End If

%>

Se isso for muito difícil de fazer, poderia ser também cada busca em uma página separada, palavras completas em uma e palavras separadas em outra.

 

Desde já muitíssimo obrigado, sua ajuda será muito importante para mim. Obrigado http://forum.imasters.com.br/public/style_emoticons/default/natal_happy.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas voce ja ta usando OR

 

strSQL = "SELECT nome, endereco, cidade, especialidade " _

& "FROM medicos " _

& "WHERE nome LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "OR endereco LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "OR cidade LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "OR especialidade LIKE '%" & Replace(strSearch, "'", "''") & "%' " _

& "ORDER BY nome;"

Teoricamente bastaria uma ser verdadeira para retornar resultados

 

Se estivesse com AND daria para achar resultados

 

Mas da forma atual se não achou é porque não existe nada mesmo

 

Mas se acha que deveria retornar algo de um response.write no resultado desta query pois derepente ela ta com algum erro passando despercebido

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade se eu trocar o OR pelo AND neste parte do código ele não consegue achar nada, porque ele toma como se a palavra procurada tivesse que estar em todos os campos da tabela, e não é isso que queria, o que precisava é que ele fizesse OR na palavra procurada, assim, se eu procurasse oftalmologista são paulo, ele iria separar as palavras oftalmologista, são e paulo, e então faria a busca OR nos campos nome, endereço, cidade e especialidade com cada uma dessas palavras. Será que tem como fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

existem um exemplo ,onde o user pode escolher em fazer uma busca atrves do operador AND, ou OR ou senaun buscar a palvar exata, dá uma pesquisada, pode te ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

kker coisa posta ae....

Compartilhar este post


Link para o post
Compartilhar em outros sites

então a sua busca não terá um campo de texto para cada campo do banco mas sim um unico campo que quer que todas as palavras sejam buscadas em todos os campos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo:

<%
'------------- SEARCH
'******************************************************
'******************************************************

On Error Resume Next



PAGE_SIZE = 20  ' display number of results


strURL = Request.ServerVariables("URL") ' the URL or Query string



'------------- q = the input text


strSearch = Request.QueryString("q") ' the input text

If strSearch = "" Then

 Server.htmlencode(Trim(Request.Form("q")))

End If


strSearch = Replace(strSearch, "'", "''")


'----------- p = RESULT PAGING

IF isnumeric(Request.QueryString("p")) = True OR Request.QueryString("p") = "" THEN

				  ' Retrieve page to show or default to the first
				  If Request.QueryString("p") = ""  OR Request.QueryString("p") < 1 Then
				  	iPageCurrent = 1
				  Else
				  	iPageCurrent = CInt(Request.QueryString("p"))
			  	  End If

ELSE

iPageCurrent = 1


END IF

p = iPageCurrent



'----------------- t = SELECTED TABLE

IF isnumeric(Request.QueryString("t")) = True OR Request.QueryString("t") = "" THEN

				  ' Retrieve t

				  If Request.QueryString("t") = ""  OR Request.QueryString("t") < 1 Then
				  	searchTable = 1 '1
				  Else

				  	searchTable =  1 'CInt(Request.QueryString("t"))

			  	  End If

ELSE

searchTable = 2 '1

END IF


'------------------- m = SEARCH METHOD

IF isnumeric(Request.QueryString("m")) = True OR Request.QueryString("m") = "" THEN

				  ' Retrieve m
				  If Request.QueryString("m") = ""  OR Request.QueryString("m") < 1 Then
				  	strMethod = 2
				  Else
				  	strMethod = CInt(Request.QueryString("m"))
			  	  End If

ELSE

strMethod = 2


END IF



'---------------THE FORM
%>

                  <form method="get" action="<%= strURL %>">
					<p>
					<input type="radio" name="m" value="1" <% IF strMethod = 1 THEN response.write "checked=""checked""" END IF%> />
                    	E
                    	<input type="radio" name="m" value="2" <% IF strMethod = 2 OR strMethod = "" THEN response.write "checked=""checked""" END IF%> />
                    	OU
                    	<input type="radio" name="m" value="3" <% IF strMethod = 3 THEN response.write "checked=""checked""" END IF%> />
                   	Exato</p>

					<p><input type="text" class="input3" name="q" value="<%= Trim(strSearch) %>" /></p>

                    <p><input type="submit" value="Procura" />
                    <br /><br /></p>

                  </form>
                  <%



If strSearch <> "" Then


		Session("strSearch") = strSearch

		IF isnumeric(Request.QueryString("t")) = True OR Request.QueryString("t") = "" THEN

						  ' Retrieve t

						  If Request.QueryString("t") = ""  OR Request.QueryString("t") < 1 Then
							searchTable = 1 '1
						  Else

							searchTable = 1 'CInt(Request.QueryString("t"))

						  End If

		ELSE

		searchTable = 1' 1

		END IF




		' THE TABLES

		Select Case searchTable

			Case CInt("1")

					dbTable = "tMessages"
					'strDBPath = Server.MapPath("/blogg/blog.mdb")


			Case CInt("2")

					'dbTable = "events"
					'strDBPath = Server.MapPath("")

			Case Else

					dbTable = "tMessages"
					'strDBPath = Server.MapPath("")


		End Select



'------------------ SQL



				  'SPLIT STRING INTO ARRAYS
				  'FOR and AND or CLAUSE SQL


'----------------- SQL tMessages blog table

IF searchTable = "1" THEN
IF strMethod < 3 THEN


			If strMethod = 1 Then
			strSplit = Replace(strSearch," "," and ")
			Else
			strSplit = Replace(strSearch," "," or ")
			End If


			colTerms = split(strSplit," and ",-1,1)

			iUpperTerms = UBound(colTerms)

			strWhereClause = ""



			'FIELD CLAUSES

			nr = 0
			Do while nr <= 5

			nr = nr + 1

			searchField = CInt(nr)

			Select Case searchField

				Case CInt("1")

					strTableInClause = "fDate"

				Case CInt("2")

					strTableInClause = "fHeadline"

				Case CInt("3")

					strTableInClause = "fMessage"

				Case CInt("4")

					strTableInClause = "fAuthor"

				Case CInt("5")

					strTableInClause = "fnota"
				
				'Case Else


			End Select


				  For iLoop = LBound(colTerms) to iUpperTerms
					orTerms = split(colTerms(iLoop)," or ",-1,1)
					iUpperOrTerms = UBound(orTerms)
					strWhereClause = strWhereClause & ""

						for iOrLoop = LBound(orTerms) to iUpperOrTerms
								strWhereClause = strWhereClause & strTableInClause & " LIKE '%" & Trim(orTerms(iOrLoop)) & "%' "

							if iOrLoop < iUpperOrTerms then
								strWhereClause = strWhereClause & " OR "
							end if
						next

						strWhereClause = strWhereClause & ""

						if iLoop < iUpperTerms then
								strWhereClause = strWhereClause & " AND "
						end If

				  Next

				  if nr <= 4 then
				  strWhereClause = strWhereClause & " OR "
				  end if

		Loop


ELSE

' METHOD 3 EXACT PHASE WHERE

strWhereClause = "fDate LIKE '%" & strSearch & "%' OR fHeadline LIKE '%" & strSearch & "%' OR fMessage LIKE '%" & strSearch & "%' OR fAuthor LIKE '%" & strSearch & "%'  OR fnota LIKE '%" & strSearch & "%'"

END IF


strWhereClause2 = "WHERE (" & strWhereClause & ") AND (online = CBool(-1))"

' ORDER BY
strOrderClause = "ORDER BY fdate DESC"



	IF strMethod = 3 THEN

		strSQL = "SELECT * FROM "& dbTable &" "& strWhereClause2 &" "& strOrderClause &";"

	ELSE

		strSQL = "SELECT * FROM "& dbTable &" "& strWhereClause2 &" "& strOrderClause &";"

	END IF


END IF

Response.write strSQL

'---------- END SQL tMessages BLog




'--------- CONNECTION OPEN & EXE SQL


	Set myRecSet = Server.CreateObject("ADODB.Recordset")
	myRecSet.PageSize  = PAGE_SIZE
	myRecSet.CacheSize = PAGE_SIZE

	' constants
	adOpenStatic = 3
	adLockReadOnly = 1
	adCmdText = &H0001


	myRecSet.Open strSQL, sConn, adOpenStatic, adLockReadOnly, adCmdText


	iRecordCount = myRecSet.RecordCount
	iPageCount   = myRecSet.PageCount



			   ' THE RESULT COUNTER

				strCountRecord = iRecordCount

				If iPageCurrent = 1 Then

				  		strCount = strCountRecord - iRecordCount + 1

				Else

						strCount = iPageCurrent * PAGE_SIZE - PAGE_SIZE + 1

						'strCountRecord -  + * iPageCurrent

				End If



	If iRecordCount = 0 Then


		%>			<p>Desculpa, sua busca não retornou resultados.<br />
                    Sua Busca por - <b><%=strSearch%></b> - não retornou documentos.</p>

                  <%
	Else

		myRecSet.AbsolutePage = iPageCurrent

		If iRecordCount <= PAGE_SIZE then
		toRecord = iRecordCount
		else
		toRecord = strCount + PAGE_SIZE - 1
		End if
		If toRecord => iRecordCount then
				toRecord=  iRecordCount
		End if

		%>

                        <p>Mostrando  resultado <%=strCount%> - <%=toRecord%> de <%=iRecordCount %>. Paginas <%= iPageCurrent %> / <%= iPageCount %>. </p>
						<br /><p>
                        <%

		If iPageCurrent > 1 Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= iPageCurrent - 1 %>" title="Previous">
                        ‹‹</a>
                        <%
		End If


		For I = 1 To iPageCount
			If I = iPageCurrent Then

			%>

                        <%= I %>
                        <%
			Else
				%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= I %>" title="<%= I %>"><%= I %></a>
                        <%
			End If
		Next 'I

		If iPageCurrent < iPageCount Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= iPageCurrent + 1 %>" title="Next"> ››</a>
                        <%
		End If
		%></p>

        <%

'----------------THE RESULT LOOP


		Do While Not myRecSet.EOF And myRecSet.AbsolutePage = iPageCurrent


					intNumMatches = 0
					allregText = ""
					regWriteOut = ""

					If strSearch = " " then
						strSearch = ""
					End if

					Set objRegExp = New RegExp
					objRegExp.Global = True
					objRegExp.IgnoreCase = True


					If dbTable = "tMessages" then
					allregText = myRecSet.Fields("fDate").Value & " " & myRecSet.Fields("fHeadline").Value & " " & myRecSet.Fields("fMessage").Value & " " & myRecSet.Fields("fAuthor").Value
					End If


					allregText = Replace(allregText, "<", "", 1, -1, 1)
					allregText = Replace(allregText, ">", "", 1, -1, 1)
					allregText = UTFtoISO(allregText)

					If strMethod = 3 then

					'Set the pattern to search for
					objRegExp.Pattern = strSearch

					'Search the file for the phrase
			 		Set objMatches = objRegExp.Execute(allregText)

					'Get the number of times the phrase is matched
					intNumMatches = objMatches.Count

					End if

					If strMethod < 3 then

					sarySearchWord = Split(strSearch, " ")
					For intSearchLoopCounter = 0 to UBound(sarySearchWord)

					'Set the pattern to search for
					objRegExp.Pattern = "" & sarySearchWord(intSearchLoopCounter) & ""

					'Search the file for the phrase
					Set objMatches = objRegExp.Execute(allregText)

					intNumMatches = intNumMatches + objMatches.Count

					Next
					End if



			 		If intNumMatches => 1 Then

					If intNumMatches > 1 then
					regWriteOut = "" & intNumMatches & " hits."
					Else
					regWriteOut = "" & intNumMatches & " hit."
					End If

			 		End If

					Set objRegExp = Nothing



			%>


					<% IF dbTable = "tMessages" THEN %>
					<p><br /><br />
					<%=strCount%>. <a href="default.asp?id=<%= myRecSet.Fields("id").Value %>" title="<%=myRecSet.Fields("fHeadline").Value%>"><%= myRecSet.Fields("fHeadline").Value %></a>
					<br /><%= RemoveHTML(Left(myRecSet.Fields("fMessage").Value,instrrev(Left(myRecSet.Fields("fMessage").Value,280),"")))%>
					<br />
					Postado: <%= year(myRecSet.Fields("fdate").Value)  & "-" & right("00" & cstr(month(myRecSet.Fields("fdate").Value)),2) & "-" & right("00" & cstr(day(myRecSet.Fields("fdate").Value)),2) & ". " & regWriteOut%>
					</p>
					<% END IF%>


           <%


						strCount = strCount + 1
			myRecSet.MoveNext
		Loop


'----------------THE RESULT LOOP END
		%>
                    	<br /><br /><p>
                        <%

		If iPageCurrent > 1 Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= iPageCurrent - 1 %>" title="Previous">‹‹</a>
                        <%
		End If


		For I = 1 To iPageCount
			If I = iPageCurrent Then
				%>

                        <%= I %>
                        <%
			Else
				%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= I %>" title="<%= I %>"><%= I %></a>
                        <%
			End If
		Next 'I

		If iPageCurrent < iPageCount Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= iPageCurrent + 1 %>" title="Next">››</a>
                        <%
		End If
		%>

                    <%

		End If

%></p>
<%

		' CLOSE & DISPOSE

		myRecSet.Close
		Set myRecSet = Nothing
		End If



'---------------- SEARCH END


'******************************************************
'******************************************************
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza...

depois possso inseri-lo no lab. de script

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.