Ir para conteúdo

POWERED BY:

Arquivado

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

blayck

[Resolvido] Pesquisa avançada em asp (difícil)

Recommended Posts

Pessoal,

 

Preciso fazer um sistema de busca que procure em várias colunas, sendo que para isso use a condição "or" e, ao mesmo tempo, somente exiba o que tem com uma determinada ID (CONDIÇÃO "AND"). Resumindo:

 

where ID='1' AND (campo 1 LIKE '%"&request("palavra_chave")&"%', campo 2 LIKE '%"&request("palavra_chave")&"%', campo 3 LIKE, etc )...

 

Óbvio que esse exemplo é apenas para ilustrar o problema. Coloquei dessa maneira apenas para que fique compreensível.

 

Perceba:

Quero que exiba no resultado apenas o que tiver com o ID = 1 e contanto que nos ID's = 1 localizados, contenha em um dos campos a palavra-chave procurada (ou no campo1, ou no campo 2 ou no campo 3, etc). Caso a condição seja inválida, isto é, tenha a palavra-chave, mas não seja no ID = 1 ou vice-versa, não exiba nada.

 

Se possível não queria usar muitas condições ("IF")

 

Não sei como ser mais claro que isso.

 

 

Agradeço!

JR.

Compartilhar este post


Link para o post
Compartilhar em outros sites

este code o user pode escolher o tipo de busca, sendo frase, E (and) , ou (OR), fica mais interativo, e se quiser use apenas um tipo,

 

olha este exemplo que uso para buscar em um form com opção de "E" "OU" ou palavra "EXATA"

 

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

On Error Resume Next



PAGE_SIZE = 20  ' exibir número de resultados


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



'------------- q = introduzir texto


strSearch = Request.QueryString("q") ' introduzir texto

If strSearch = "" Then

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

End If


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


'----------- p = RESULTADO PAGING

IF isnumeric(Request.QueryString("p")) = True OR Request.QueryString("p") = "" THEN
	  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 = SELECIONANDO TABELA

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


			  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 METODO

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



'---------------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




	' 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 E AND or CLÁUSULA SQL


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 CLÁUSULA 

		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

' METODO 3 FRASE EXATA

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




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


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

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


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


iRecordCount = myRecSet.RecordCount
iPageCount   = myRecSet.PageCount



		   ' 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>

	<%

'----------------RESULTADO 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

				'Definir o padrão de pesquisa para
				objRegExp.Pattern = strSearch

				'Procurar o arquivo para a frase
		 		Set objMatches = objRegExp.Execute(allregText)

				'Obter o número de vezes que a frase é compensada				intNumMatches = objMatches.Count

				End if

				If strMethod < 3 then

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

				'Definir o padrão de pesquisa para
				objRegExp.Pattern = "" & sarySearchWord(intSearchLoopCounter) & ""

				'Procurar o arquivo para a frase
				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


'----------------RESULTADO 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 

	myRecSet.Close
	Set myRecSet = Nothing
	End If



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


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

Compartilhar este post


Link para o post
Compartilhar em outros sites

a sugestão que você deu não funciona?

 



sql = "... and id=1 and (campo1 like '%"&request("palavra_chave")&"%' or campo2 like '%"&request("palavra_chave")&"%')"
if rs.eof 
response.write "Nada encontrado"
else
....

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

a sugestão que você deu não funciona?

 



sql = "... and id=1 and (campo1 like '%"&request("palavra_chave")&"%' or campo2 like '%"&request("palavra_chave")&"%')"
if rs.eof 
response.write "Nada encontrado"
else
....

 

Sabe que para ser sincero, eu havia cogitado fazer daquela maneira, mas não estava tão certo se com parêntese iria funcionar, não havia chegado a testar. Fiz um pequeno teste e parece que funcionou. :D Resolvido. A lógica é a que eu tinha dado mesmo. Um abraço a todos.

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.