Problemas com Query
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.
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
Curtidas 0
Respostas
Marco Salles
08/06/2010
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
//Exemplo de Utilização ... Um Radio Group com os Seis Items de Filtro
Tem que entender que o Cacacter A < B < C < D .....
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 .....
GOSTEI 0
Wilson Junior
08/06/2010
QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';
QryCli.Filtered := True;
Espero ter colaborado.
GOSTEI 0
Marco Salles
08/06/2010
QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';
QryCli.Filtered := True;
Espero ter colaborado.
GOSTEI 0
Wilson Junior
08/06/2010
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.
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.
GOSTEI 0
Simone Grandini
08/06/2010
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!
GOSTEI 0
Marco Salles
08/06/2010
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
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.
GOSTEI 0
Marco Salles
08/06/2010
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
GOSTEI 0
Simone Grandini
08/06/2010
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!
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!
GOSTEI 0
Marco Salles
08/06/2010
QryCli.Filter := 'UPPER(Nome) LIKE UPPER(' + QuotedStr( Trim(EdtPesquisa.Text) ) + '%)';
QryCli.Filtered := True;
Espero ter colaborado.
GOSTEI 0
Simone Grandini
08/06/2010
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.
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.
GOSTEI 0
Marco Salles
08/06/2010
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 .
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.
GOSTEI 0
Wilson Junior
08/06/2010
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.
Quanto ao funcionar, testei ele hoje e funciona normalmente.
O importante é que o tópico foi resolvido e todos nós aprendemos alogo.
GOSTEI 0
Carlos Mazzi
08/06/2010
Boa ! Paulista, fechando....
GOSTEI 0