CONSULTA SQL
Executo esta função em uma consulta em um mdb remotamente, esta função tira os acentos das palavras a serem consultadas, ela passa por todos os campos e verifica se há a palavra que está sendo consultada. Percebi que as palavras que começam em [Ô]S[Ô] está retornando resultado false. Se alguém puder dar uma olhada agradeço.
[ô]#Função que tira todos os acentos das palavras
function TiraAcento(StrAcento)
for i = 1 to len(StrAcento)
Letra = mid(StrAcento, i, 1)
Select Case Letra
Case [Ô]á[Ô],[Ô]Ã[Ô],[Ô]à [Ô],[Ô]À[Ô],[Ô]ã[Ô],[Ô]Ã[Ô],[Ô]â[Ô],[Ô]Â[Ô],[Ô]â[Ô],[Ô]ä[Ô],[Ô]Ä[Ô]
Letra = [Ô]A[Ô]
Case [Ô]é[Ô],[Ô]é[Ô],[Ô]ê[Ô],[Ô]Ê[Ô],[Ô]Ë[Ô],[Ô]ë[Ô],[Ô]È[Ô],[Ô]è[Ô]
Letra = [Ô]E[Ô]
Case [Ô]Ã[Ô],[Ô]Ã[Ô],[Ô]ï[Ô],[Ô]Ã[Ô],[Ô]ÃŒ[Ô],[Ô]ì[Ô]
Letra = [Ô]I[Ô]
Case [Ô]ó[Ô],[Ô]Ó[Ô],[Ô]ô[Ô],[Ô]Ô[Ô],[Ô]õ[Ô],[Ô]Õ[Ô],[Ô]ö[Ô],[Ô]Ö[Ô],[Ô]ò[Ô],[Ô]Ã’[Ô]
Letra = [Ô]O[Ô]
Case [Ô]ú[Ô],[Ô]Ú[Ô],[Ô]Ù[Ô],[Ô]ù[Ô],[Ô]ú[Ô],[Ô]û[Ô],[Ô]ü[Ô],[Ô]Ü[Ô],[Ô]Û[Ô]
Letra = [Ô]U[Ô]
Case [Ô]ç[Ô],[Ô]Ç[Ô]
Letra = [Ô]C[Ô]
Case [Ô]ñ[Ô]
Letra = [Ô]N[Ô]
End Select
texto = texto & Letra
next
TiraAcento = texto
end function
strURL = Request.ServerVariables([Ô]URL[Ô])
strSearch = Request.QueryString([Ô]search[Ô])
If strSearch <> [Ô][Ô] Then
strDBPath = Server.MapPath([Ô]adm.mdb[Ô])
Const adUseClient = 3
Set cnnSearch = Server.CreateObject([Ô]ADODB.Connection[Ô])
cnnSearch.Open [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & strDBPath & [Ô];[Ô]
cnnSearch.CursorLocation = adUseClient
[txt-color=#0000f0]strSQL = [Ô]SELECT autonum, titulo,dormitorio,suite,preco,descricao,foto1 [Ô] _
& [Ô]FROM imovel [Ô] _
& [Ô]WHERE titulo LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR preco LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR descricao LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR autonum LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]ORDER BY preco asc;[Ô]
[/txt-color]
Set rstSearch = cnnSearch.Execute(strSQL)
intContador = rstSearch.RecordCount
%>
[ô]#Função que tira todos os acentos das palavras
function TiraAcento(StrAcento)
for i = 1 to len(StrAcento)
Letra = mid(StrAcento, i, 1)
Select Case Letra
Case [Ô]á[Ô],[Ô]Ã[Ô],[Ô]à [Ô],[Ô]À[Ô],[Ô]ã[Ô],[Ô]Ã[Ô],[Ô]â[Ô],[Ô]Â[Ô],[Ô]â[Ô],[Ô]ä[Ô],[Ô]Ä[Ô]
Letra = [Ô]A[Ô]
Case [Ô]é[Ô],[Ô]é[Ô],[Ô]ê[Ô],[Ô]Ê[Ô],[Ô]Ë[Ô],[Ô]ë[Ô],[Ô]È[Ô],[Ô]è[Ô]
Letra = [Ô]E[Ô]
Case [Ô]Ã[Ô],[Ô]Ã[Ô],[Ô]ï[Ô],[Ô]Ã[Ô],[Ô]ÃŒ[Ô],[Ô]ì[Ô]
Letra = [Ô]I[Ô]
Case [Ô]ó[Ô],[Ô]Ó[Ô],[Ô]ô[Ô],[Ô]Ô[Ô],[Ô]õ[Ô],[Ô]Õ[Ô],[Ô]ö[Ô],[Ô]Ö[Ô],[Ô]ò[Ô],[Ô]Ã’[Ô]
Letra = [Ô]O[Ô]
Case [Ô]ú[Ô],[Ô]Ú[Ô],[Ô]Ù[Ô],[Ô]ù[Ô],[Ô]ú[Ô],[Ô]û[Ô],[Ô]ü[Ô],[Ô]Ü[Ô],[Ô]Û[Ô]
Letra = [Ô]U[Ô]
Case [Ô]ç[Ô],[Ô]Ç[Ô]
Letra = [Ô]C[Ô]
Case [Ô]ñ[Ô]
Letra = [Ô]N[Ô]
End Select
texto = texto & Letra
next
TiraAcento = texto
end function
strURL = Request.ServerVariables([Ô]URL[Ô])
strSearch = Request.QueryString([Ô]search[Ô])
If strSearch <> [Ô][Ô] Then
strDBPath = Server.MapPath([Ô]adm.mdb[Ô])
Const adUseClient = 3
Set cnnSearch = Server.CreateObject([Ô]ADODB.Connection[Ô])
cnnSearch.Open [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & strDBPath & [Ô];[Ô]
cnnSearch.CursorLocation = adUseClient
[txt-color=#0000f0]strSQL = [Ô]SELECT autonum, titulo,dormitorio,suite,preco,descricao,foto1 [Ô] _
& [Ô]FROM imovel [Ô] _
& [Ô]WHERE titulo LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR preco LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR descricao LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR autonum LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]ORDER BY preco asc;[Ô]
[/txt-color]
Set rstSearch = cnnSearch.Execute(strSQL)
intContador = rstSearch.RecordCount
%>
Ola MAFACILITY,
Fiz uam alteração na sua função para ele retornar a letra que não precisam sofrer alterações. Verifique se o problema foi sanado.
O trecho alterado está em itálico.
function TiraAcento(StrAcento)
for i = 1 to len(StrAcento)
Letra = mid(StrAcento, i, 1)
Select Case Letra
Case [Ô]á[Ô],[Ô]Ã[Ô],[Ô]à [Ô],[Ô]À[Ô],[Ô]ã[Ô],[Ô]Ã[Ô],[Ô]â[Ô],[Ô]Â[Ô],[Ô]â[Ô],[Ô]ä[Ô],[Ô]Ä[Ô]
Letra = [Ô]A[Ô]
Case [Ô]é[Ô],[Ô]é[Ô],[Ô]ê[Ô],[Ô]Ê[Ô],[Ô]Ë[Ô],[Ô]ë[Ô],[Ô]È[Ô],[Ô]è[Ô]
Letra = [Ô]E[Ô]
Case [Ô]Ã[Ô],[Ô]Ã[Ô],[Ô]ï[Ô],[Ô]Ã[Ô],[Ô]ÃŒ[Ô],[Ô]ì[Ô]
Letra = [Ô]I[Ô]
Case [Ô]ó[Ô],[Ô]Ó[Ô],[Ô]ô[Ô],[Ô]Ô[Ô],[Ô]õ[Ô],[Ô]Õ[Ô],[Ô]ö[Ô],[Ô]Ö[Ô],[Ô]ò[Ô],[Ô]Ã’[Ô]
Letra = [Ô]O[Ô]
Case [Ô]ú[Ô],[Ô]Ú[Ô],[Ô]Ù[Ô],[Ô]ù[Ô],[Ô]ú[Ô],[Ô]û[Ô],[Ô]ü[Ô],[Ô]Ü[Ô],[Ô]Û[Ô]
Letra = [Ô]U[Ô]
Case [Ô]ç[Ô],[Ô]Ç[Ô]
Letra = [Ô]C[Ô]
Case [Ô]ñ[Ô]
Letra = [Ô]N[Ô]
Else
Letra = Letra
End Select
texto = texto & Letra
next
TiraAcento = texto
end function
Fiz uam alteração na sua função para ele retornar a letra que não precisam sofrer alterações. Verifique se o problema foi sanado.
O trecho alterado está em itálico.
function TiraAcento(StrAcento)
for i = 1 to len(StrAcento)
Letra = mid(StrAcento, i, 1)
Select Case Letra
Case [Ô]á[Ô],[Ô]Ã[Ô],[Ô]à [Ô],[Ô]À[Ô],[Ô]ã[Ô],[Ô]Ã[Ô],[Ô]â[Ô],[Ô]Â[Ô],[Ô]â[Ô],[Ô]ä[Ô],[Ô]Ä[Ô]
Letra = [Ô]A[Ô]
Case [Ô]é[Ô],[Ô]é[Ô],[Ô]ê[Ô],[Ô]Ê[Ô],[Ô]Ë[Ô],[Ô]ë[Ô],[Ô]È[Ô],[Ô]è[Ô]
Letra = [Ô]E[Ô]
Case [Ô]Ã[Ô],[Ô]Ã[Ô],[Ô]ï[Ô],[Ô]Ã[Ô],[Ô]ÃŒ[Ô],[Ô]ì[Ô]
Letra = [Ô]I[Ô]
Case [Ô]ó[Ô],[Ô]Ó[Ô],[Ô]ô[Ô],[Ô]Ô[Ô],[Ô]õ[Ô],[Ô]Õ[Ô],[Ô]ö[Ô],[Ô]Ö[Ô],[Ô]ò[Ô],[Ô]Ã’[Ô]
Letra = [Ô]O[Ô]
Case [Ô]ú[Ô],[Ô]Ú[Ô],[Ô]Ù[Ô],[Ô]ù[Ô],[Ô]ú[Ô],[Ô]û[Ô],[Ô]ü[Ô],[Ô]Ü[Ô],[Ô]Û[Ô]
Letra = [Ô]U[Ô]
Case [Ô]ç[Ô],[Ô]Ç[Ô]
Letra = [Ô]C[Ô]
Case [Ô]ñ[Ô]
Letra = [Ô]N[Ô]
Else
Letra = Letra
End Select
texto = texto & Letra
next
TiraAcento = texto
end function
Não funcionou, engraçado só não acha palavras começadas com a letra [Ô]S[Ô] com SÃtio ou Sitio, SuÃte ou Suite
Eu cometi um pequeno erro no trecho do else, que o correto era Case Else. Quanto a função alterar os textos com a letra [Ô]S[Ô], eu fiz um teste aqui através de um pequeno programa em VB 6 usando a sua função e este erro não aconteceu. Se você tiver o Visual Basic 6, tente executar o projeto teste que eu fiz.
Uma outra coisa, vi que você usa o mesmo campo várias vezes na mesma consulta, por que você não simplifica a operação assim:
[ô]Pega a string e retira os acentos e trata a string
strSearch = TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô]))
strSQL = [Ô]SELECT autonum, titulo,dormitorio,suite,preco,descricao,foto1 [Ô] _
& [Ô]FROM imovel [Ô] _
& [Ô]WHERE titulo LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]OR preco LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]OR descricao LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]OR autonum LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]ORDER BY preco asc;[Ô]
Com isso você não executa a operação de remoção de acentos e limpeza de caracteres inválidos uma única vez e não 1 e mais 3 vezes desnecessariamente.
Por último, se o erro persistir, mande exibir o resultado da varÃavel strSearch logo após a execução da função TirarAcento para ver o que retorna. Se neste trecho estiver tudo Ok, imprima o SQL para ver o que retornou. Se quiser, passe o seu telefone através do sistema de correio do VBMania que entro em contato para ajudar a verificar o erro.
Uma outra coisa, vi que você usa o mesmo campo várias vezes na mesma consulta, por que você não simplifica a operação assim:
[ô]Pega a string e retira os acentos e trata a string
strSearch = TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô]))
strSQL = [Ô]SELECT autonum, titulo,dormitorio,suite,preco,descricao,foto1 [Ô] _
& [Ô]FROM imovel [Ô] _
& [Ô]WHERE titulo LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]OR preco LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]OR descricao LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]OR autonum LIKE [ô]%[Ô] & strSearch & [Ô]%[ô] [Ô] _
& [Ô]ORDER BY preco asc;[Ô]
Com isso você não executa a operação de remoção de acentos e limpeza de caracteres inválidos uma única vez e não 1 e mais 3 vezes desnecessariamente.
Por último, se o erro persistir, mande exibir o resultado da varÃavel strSearch logo após a execução da função TirarAcento para ver o que retorna. Se neste trecho estiver tudo Ok, imprima o SQL para ver o que retornou. Se quiser, passe o seu telefone através do sistema de correio do VBMania que entro em contato para ajudar a verificar o erro.
Valeu véio vou testar aqui !!!
Véio resolvi o problema da seguinte forma fiz uma gambiarra rsrsrs na seleção dos dados, na minha tabela eu tenho um campo chamado tipo, eu fiz o seguinte:
strSQL = [Ô]SELECT autonum,tipo,titulo,dormitorio,suite,preco,descricao,foto1 [Ô] _
& [Ô]FROM imovel [Ô] _
& [Ô]WHERE titulo LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR preco LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR descricao LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR autonum LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
[txt-color=#0000f0]& [Ô]OR tipo= [ô]sÃtio[ô][Ô] _[/txt-color][ô] [ô] « AQUI
& [Ô]ORDER BY preco asc;[Ô]
agradeço pela ajuda, agora estou com um outro problema, [txt-color=#e80000]não está respeitando a ordenação ascendente do preço.[/txt-color]
strSQL = [Ô]SELECT autonum,tipo,titulo,dormitorio,suite,preco,descricao,foto1 [Ô] _
& [Ô]FROM imovel [Ô] _
& [Ô]WHERE titulo LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR preco LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR descricao LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
& [Ô]OR autonum LIKE [ô]%[Ô] & TiraAcento(Replace(strSearch, [Ô][ô][Ô], [Ô][ô][ô][Ô])) & [Ô]%[ô] [Ô] _
[txt-color=#0000f0]& [Ô]OR tipo= [ô]sÃtio[ô][Ô] _[/txt-color][ô] [ô] « AQUI
& [Ô]ORDER BY preco asc;[Ô]
agradeço pela ajuda, agora estou com um outro problema, [txt-color=#e80000]não está respeitando a ordenação ascendente do preço.[/txt-color]
Qual é o tipo deste campo que você está usando? Seria possÃvel você enviar um pedaço desta tabela para fazer um teste?
ESTRUTURA DA TABELA:
AUTONUM - TITULO - DORMITORIO - SUITE - TIPO - DESCRICAO - FOTO1 ... FOTO8
TIPO é UM CAMPO TEXT, O NOME DO CAMPO é TIPO MAS NA VERDADE é A CATEGORIA DO IMOVEL: CASA,SÃTIO,APARTAMENTO,LOTE,CHÃCARA, ETC.
AUTONUM - TITULO - DORMITORIO - SUITE - TIPO - DESCRICAO - FOTO1 ... FOTO8
TIPO é UM CAMPO TEXT, O NOME DO CAMPO é TIPO MAS NA VERDADE é A CATEGORIA DO IMOVEL: CASA,SÃTIO,APARTAMENTO,LOTE,CHÃCARA, ETC.
Se o campo preço for um tipo texto, pode ocorrer esta falha. Tente alterar ele para currency para ver se não apresenta mais esta falha?
é isso mesmo netmania, na hora em que criei o campo preco coloquei ele como text e não percebi, já alterei para currency e funcionou perfeitamente. Obrigado...
Tópico encerrado , respostas não são mais permitidas