Fórum Problemas com Query #379087

08/06/2010

0

Olá,
alguém sabe dizer como deve ser escrito o comando numa Query utilizando o filter para que o resultado seja igual a este comando: QryCli.SQL.Add('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')) ? Já tentei de várias formas obter o mesmo resultado desta linha de comando usando o filter, mas não consigo. Usando o SQL, posso digitar num edit um nome em maiusculas ou minusculas que o resultado aparece corretamente. Infelizmente, o mesmo não ocorre com o filter. Se alguém puder me ajudar, agradeço muito.
Simone Grandini

Simone Grandini

Responder

Posts

08/06/2010

Marco Salles

então Simone , abaixo segue um método que vc pode Utilizar de diversar formas .. todos eles se relacionam
com a propriedade Fielter dos DataSet e Simula a situação do Like que vc Obtem exceCutando SQL 
 
So ha um inconveniente , é que funciona melhor para campos do Tipo String e caseSensitive
 
Espero que vc consiga aplicar com a sua realidade e tb dá para fazer Alteraçoes e Modificação Facielmente
 
Type
 TipoSearch = (tpMaior,tpMenor,TpIgual,TpFim,TpInicio,TpAll);

 
procedure FiltrarDataSet(cDataSet:TDataSet;cField,pesquisa:String;cTipoSearch: TipoSearch );
   var
     strFiltro:String;
begin
cDataSet.Filtered:=false;
   case cTipoSearch of
      //todos os Maiores e iguais ao o Texto ...
      tpMaior:strFiltro:=cField+' > '+QuotedStr(Pesquisa);
      //Todos os Menores do Texto
      tpMenor:strFiltro:=cField+' < '+QuotedStr(Pesquisa);
      //pesquisar igaul ao  Texto
      TpIgual:strFiltro:=cField+' like '+QuotedStr(Pesquisa);
      //pesquisar no Inicio do Texto
      tpInicio:strFiltro:=cField+' like '+QuotedStr(Pesquisa+'%');
      //pesquisar no Fim do Texto
      tpFim:strFiltro:=cField+' like '+QuotedStr('%'+Pesquisa);
      //em qualquerlugar no Texto
      tpAll:strFiltro:=cField+' like '+QuotedStr('%'+Pesquisa+'%');
   end;
cDataSet.Filter:=strFiltro;
cDataSet.Filtered:=true;
end;

 
 
//Exemplo de Utilização ... Um Radio Group com os Seis Items de Filtro
procedure TForm3.Button1Click(Sender: TObject);
var
cTipoSearch: TipoSearch;
begin
cds.Filtered:=false;
case RadioGroup1.ItemIndex of
0:cTipoSearch:=tpMaior; //todos os Maiores e iguais ao Texto
1:cTipoSearch:=tpMenor;  //Todos os Menores do Texto
2:cTipoSearch:=tpIgual;  //pesquisar igaul ao  Texto
3:cTipoSearch:=tpInicio; //pesquisar no Inicio do Texto
4:cTipoSearch:=tpFim;  //pesquisar no Fim do Texto
5:cTipoSearch:=tpAll;    //em qualquerlugar no Texto
end;
 
//embaixo fiz para Testar , uma Pesquisa com Filter usando o CAMPO << NAME >> Da Tabela COUNTRY
//e Passei um Texto De Um EDIT chamado edtPesquisa... Entende Isto ??????????????????

FiltrarDataSet(cds,'Name',edtPesquisa.Text,cTipoSearch);   /////Usando o Field Name
end;

 
Tem que entender que o Cacacter  A < B < C < D .....
Responder

Gostei + 0

08/06/2010

Wilson Junior

  QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';
  QryCli.Filtered := True;


Espero ter colaborado.
Responder

Gostei + 0

08/06/2010

Marco Salles

  QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';
  QryCli.Filtered := True;


Espero ter colaborado.
...   qualquer dica é valiossissima ... Entendi sua tentativa .. Colocar Tudo em Maisculo para fugir do inconveniente que citei acima ( CASESENSITIVE) . mas acho que o 'UPPER(Nome) Não afeta Nada... A não ser a String Fielter mas não p que ela tem que filtrar   Em outras palavras   'nome Like '+quottostr('%'pesquisa+'%') Retorna o mesmo resultado que   'NOME Like '+quottostr('%'pesquisa+'%')   De Um   Showmessage(cds.Fielter)   para entender Melhor   ................................................. tb acho que  o UPPER  seguido do (' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%) é muito estranho No Minimo seria   QuotedStr( UPPER(Trim(EdtPesquisa.Text) ) + '%)   Mas limitaria pesquisa somente com Maisculo   Bem to falando sem testar .. é pq ha muito tempo atras ja passei por isto e se não estou enganado ja tentei fazer este truque... Mas sabe como é né , não custa tentar    
Responder

Gostei + 0

08/06/2010

Wilson Junior

Caro Marco,

Este código funciona via SQL, não testei com o Filter, mas funciona perfeitamente.
O caso que utilizo o UPPER para o campo e o conteúdo da pesquisa é para o caso de o campo ter o valor "Maria" e o conteúdo da pesquisa ser "maria", assim não retornaria o resultado desejado.

Bom, efetuei o UPPER, pois em determinadas configurações do banco de dados o UPPER do banco é diferente do UpperCase do Delphi, somente por isto.

Espero que tenham entendido. Qualquer coisa é só perguntar.
Responder

Gostei + 0

08/06/2010

Simone Grandini

Vou testar os códigos. Mas o mais importante pra mim é que o usuário do sistema não tenha que se preocupar em digitar desta ou daquela forma. Isso dá certo com a instrução SQL, já com o filter... Bem, vou testar. Obrigada!
Responder

Gostei + 0

08/06/2010

Marco Salles

Caro Marco,

Este código funciona via SQL, não testei com o Filter, mas funciona perfeitamente.
O caso que utilizo o UPPER para o campo e o conteúdo da pesquisa é para o caso de o campo ter o valor "Maria" e o conteúdo da pesquisa ser "maria", assim não retornaria o resultado desejado.

Bom, efetuei o UPPER, pois em determinadas configurações do banco de dados o UPPER do banco é diferente do UpperCase do Delphi, somente por isto.

Espero que tenham entendido. Qualquer coisa é só perguntar.
..   Com Sql eu sei .. Mas com Fileter não faz diferença ,, Pois Fielter não é Sql é na verdade STRING   Então tanto faz o field esta em Maisculo ou em Minusculo que este será o campo a ser pesqusiadp   Façamos o seginte ... Testemos e retornamos OK
Responder

Gostei + 0

08/06/2010

Marco Salles

Vou testar os códigos. Mas o mais importante pra mim é que o usuário do sistema não tenha que se preocupar em digitar desta ou daquela forma. Isso dá certo com a instrução SQL, já com o filter... Bem, vou testar. Obrigada!
...   Bem Simone , a Entrada de Dados pode ser controlada facielmente.. Eu pr exemplo uso sempre a Primeira Letra em Maisculo , mesmo que o Usuario digite em Minusculo. De Modo que gravo Maisculo+seguidos de Minusculo   Então o padrão que eu faço para gravar é o mesmo que faço para pesquisar ... O Fato de ter comentado que é CASESENTIVE , não quis dizer que vc deva chogar a responsabilidade para o Usuário. Mas sim contornar o problema com as definiçoes do Seu Sistema
Responder

Gostei + 0

08/06/2010

Simone Grandini

Paulista,
vc colaborou e muito. Era exatamente isso o q eu queria: q o usuário tivesse a liberdade de digitar o nome de todas as formas possíveis. E foi o q aconteceu. Testei com todas as letras em caixa alta, em caixa baixa, com a 1a letra em caixa alta e as demais em caixa baixa e vice versa, tanto com parte do nome ou com o nome por inteiro e deu certo. Tanto faz o nome estar gravado no sistema em letras maiusculas ou minusculas que o filtro dá certo. Valeu mesmo!

Marco,
eu entendi sua explicação. E o exemplo q vc deu está bem claro. Gostei muito tb. Só q esse código, no  meu caso, não dá tanta flexibilidade como o do Paulista. Mas com certeza, servirá pra alguém.

Obrigada pessoal pela força!
Responder

Gostei + 0

08/06/2010

Marco Salles

  QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';
  QryCli.Filtered := True;


Espero ter colaborado.
  Menina , to testando aqui e gostaria que mais algueem testa-se este codigo   Pois para mim será uma  surpresa agradável que funcione sem ser Caixa Alta ou Caixa Baixa   Infelismente eu ja testei esta codigo e dá erro de Sintaxi como era de ser esperado   Algumem disponibiliza o download utilizando o ClientDatSet e um Arquivo Padão do Delphi   para mim dá erro e esta sintaxi esta errada
Responder

Gostei + 0

09/06/2010

Simone Grandini

Desculpe Marco, fiz uma pequena alteração no código e esqueci de informar isso. My bad! 
Segue alteração:
 
Antes:     QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';

Depois:   QryCli.Filter := 'upper(nome) like upper(' + QuotedStr(Trim(EdtPesquisa.Text+'%')) + ')';

Coloquei o "upper" e o "like upper" em letras minusculas, mas isso não influencia em nada, claro. Apenas retirei o '%' no final da string e coloquei junto com o EdtPesquisa.Text.
 
    
Responder

Gostei + 0

09/06/2010

Marco Salles

Desculpe Marco, fiz uma pequena alteração no código e esqueci de informar isso. My bad! 
Segue alteração:
 
Antes:     QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';

Depois:   QryCli.Filter := 'upper(nome) like upper(' + QuotedStr(Trim(EdtPesquisa.Text+'%')) + ')';

Coloquei o "upper" e o "like upper" em letras minusculas, mas isso não influencia em nada, claro. Apenas retirei o '%' no final da string e coloquei junto com o EdtPesquisa.Text.
  
 
... confesso que grata surpresa para mim . Ja tive este problema no Delphi5.0 e rodava com o CaseSentitive (diferença de Caixa Alta e CaixaBaixa) . na época tive que programar o evento OnFilterRecord resolvia tb . Depois como comentei estabeleci um Padrão de entrada para os Dados e utilizava o mesmo Padrão para Pesquisa Assim meu Banco nunca teria mArIa dA DORes , sempre teria Maria Das Dores e Utilizava o método postado sem o upper Com o Upper Nunca imagimei que fosse funcionar pois é uma instrução que varia de banco para banco ) O Delphi tem por exemplo o upperCase , e na época cheguei a testar com ele ... mas não tive sucesso Enfim , foi bom o tópico e aprendi tb com ele ( ganhei mais uma dica) , parabéns ao amigo que comentou e a voce que singelosamente corrigiu erros de sintaxi que deva ter sido passado despercebido na pressa pelo autor do mesmo .
Responder

Gostei + 0

09/06/2010

Wilson Junior

Desculpem pelo erro de sintaxe, pois como disse no post anterior, não testei, apenas fiz na hora.
Quanto ao funcionar, testei ele hoje e funciona normalmente.

O importante é que o tópico foi resolvido e todos nós aprendemos alogo.
Responder

Gostei + 0

30/06/2010

Carlos Mazzi

Boa ! Paulista, fechando....
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar