Filter no 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
Melhor post
Carlos Mazzi
07/06/2010
Tenta ver se isso lhe ajuda:
Sei que em muitos casos, manipular uma propriedade no Object Inspector é uma tarefa simples, que não exige muito do desenvolvedor, mas quando a necessidade é ativa-las em RunTime (tempo de execução), a complexidade aumenta consideravelmente.
Revisando um pouco, a propriedade filter recebe um valor do tipo string, e ao acionar a propriedade filtered para true, aplica-se uma filtragem na tabela relacionada, colocando disponíveis apenas os registros que satisfazem a condição do filtro. Por exemplo: Colocamos na propriedade filter de um Ttable (via Object Inspector) a seguinte regra - state = 'CA' - Onde state é o nome do campo da tabela relacionada e CA é a condição de filtro. Notem que CA esta entre aspas, e é justamente este o problema, em tempo de execução temos que passar os valores entre aspas. E se estamos passando em RunTime, é porque queremos permitir a flexibilidade de um filtro ser escolhido pelo usuário do sistema, agora como vamos passar uma variável para a propriedade filter que possua aspas? É notório que o compilador trata valores entre aspas do seu código como valores string. Pronto, descobrimos o enigma, vamos agora desvendá-lo.
A primeira alternativa que veio a minha cabeça para resolver este problema, foi imaginar passar aspas dentro de aspas, criando um código que considerei bizarro.
Var
Texto : String;
Begin
Table1.Filter := 'state = '+''''+Texto+'''';
Table1.Filtered := True;
End;
Funcionar, funcionou, mas não me conformei com este monstro. Continuei pensando e tive a idéia de concatenar strings com o caractere AscII correspondente a aspas, acredito que visualmente ainda não era o ideal, porém era menos grotesco e mais fácil de outros programadores entenderem.
Var
Texto : String;
Begin
Table1.Filter := 'state = '+#39+Texto+#39;
Table1.Filtered := True;
End;
Continuei conjugando a frase: "Funcionar, funcionou, mas não estou ainda 100% satisfeito". Sou um fã incondicional do bom e velho Pascal, e simplesmente não aceitaria este tipo de "gambiarra" para solucionar este enigma. De posse do manual de Object Pascal, comecei a procurar uma solução mais condizente com a categoria do Delphi (Nota do Autor: Categoria muito alta, pois afirmo que o Delphi é a melhor linguagem de desenvolvimento que já conheci). A noite foi virando madrugada, o café foi acabando, a determinação ainda estava forte quando li: QuotedStr. Sabia antes de ler sua definição que havia encontrado a solução, minha palpitação não se enganava. Vamos testar:
Var
Texto : String;
Begin
Table1.Filter := 'state = '+QuotedStr(Texto);
Table1.Filtered := True;
End;
Um sorriso tomou conta de minha face, sabia que o meu velho amigo Pascal não ia me decepcionar, afinal somos amigos a 6 anos, e defendo ele com unhas e dentes, como realmente deve ser um amigo fiel.
Aproveito para lembrar que você pode também colocar filtros parciais, como por exemplo:
Var
Texto : String;
Begin
Texto := 'F*';
Table1.Filter := 'state = '+QuotedStr(Texto);
Table1.Filtered := True;
End;
Neste exemplo, todos os estados iniciados pela letra 'F' seriam mostrados em seu DataControls/DBGrid.
Ou seja podemos ainda resumidamente ter:
Table1.Filter := 'Nome = '''+ Edit1.Text + '''';
ou
Table1.Filter := 'Data = ''' + DateToStr(Date) + '''';
Tente usar este:
Table1.Filter := 'Nome = ' + QuotedStr(Edit1.Text);
ou
Table1.Filter := 'Data = ' + QuotedStr(DateToStr(Date));
Observações
A função QuitedStr() coloca apóstrofos envolvendo a string. Se houver um apóstrofo como parte da string, ela o subtitui por dois apóstrofos, para que seja corretamente interpretado.
Espero que esse resuminho te ajude. Abracos++
GOSTEI 1
Mais Respostas
Marco Salles
04/06/2010
Qual o DataSet que vc esta usando ????
GOSTEI 0
Simone Grandini
04/06/2010
Uso os componentes TTable, TQuery com o Access 2007 e Delphi 2010.
GOSTEI 0
Lartedesign
04/06/2010
tente assim
ADOQuery1.SQL.ADD(\'WHERE UPPER(NOME) LIKE UPPER(\'+QuotedStr(\'%\'+Edit1.Text+\'%\')+\')\');
ADOQuery1.SQL.ADD(\'WHERE UPPER(NOME) LIKE UPPER(\'+QuotedStr(\'%\'+Edit1.Text+\'%\')+\')\');
GOSTEI 0
Simone Grandini
04/06/2010
lartedesign,
no meu caso, preciso usar mesmo o FILTER. Aí é que está o problema: não sei a sintaxe certa do comando pra que o resultado seja igual ao sql do comando Query.SQL.ADD('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')'), que eu mostrei no post anterior. Mas agradeço mesmo assim pela ajuda.
no meu caso, preciso usar mesmo o FILTER. Aí é que está o problema: não sei a sintaxe certa do comando pra que o resultado seja igual ao sql do comando Query.SQL.ADD('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')'), que eu mostrei no post anterior. Mas agradeço mesmo assim pela ajuda.
GOSTEI 0
Marco Salles
04/06/2010
lartedesign,
no meu caso, preciso usar mesmo o FILTER. Aí é que está o problema: não sei a sintaxe certa do comando pra que o resultado seja igual ao sql do comando Query.SQL.ADD('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')'), que eu mostrei no post anterior. Mas agradeço mesmo assim pela ajuda.
no meu caso, preciso usar mesmo o FILTER. Aí é que está o problema: não sei a sintaxe certa do comando pra que o resultado seja igual ao sql do comando Query.SQL.ADD('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')'), que eu mostrei no post anterior. Mas agradeço mesmo assim pela ajuda.
GOSTEI 0
Marco Salles
04/06/2010
lartedesign,
no meu caso, preciso usar mesmo o FILTER. Aí é que está o problema: não sei a sintaxe certa do comando pra que o resultado seja igual ao sql do comando Query.SQL.ADD('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')'), que eu mostrei no post anterior. Mas agradeço mesmo assim pela ajuda.
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 exceutando 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
]CODE]
Typeno meu caso, preciso usar mesmo o FILTER. Aí é que está o problema: não sei a sintaxe certa do comando pra que o resultado seja igual ao sql do comando Query.SQL.ADD('Select * from clientes where nome like ' + QuotedStr(EdtPesquisa.Text + '%')'), que eu mostrei no post anterior. Mas agradeço mesmo assim pela ajuda.
TipoSearch = (tpMaior,tpMenor,TpIgual,TpFim,TpInicio,TpAll); [/CODE]
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;
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; //Aqui 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); end;
GOSTEI 0
Carlos Mazzi
04/06/2010
Deu certo ?
GOSTEI 0
Marco Salles
04/06/2010
Acho que não é isto que ela quer Eduardo
GOSTEI 0
Marco Salles
04/06/2010
Acho que não é isto que ela quer Eduardo
GOSTEI 0
Simone Grandini
04/06/2010
Oi Carlos Eduardo,
eu conheço a função QuotedStr. Mas como disse o Marco, não é isso que eu quero. Usando essa função numa instrução sql de uma query, realmente funciona. Mas eu estou usando o filter e com ele a sintaxe é outra. É isso que eu não estou conseguindo fazer. Por exemplo, eu posso digitar um nome em caixa alta ou baixa, ou apenas colocar em caixa alta a primeira letra do nome, que o filtro não ocorre. Pelo contrário, o dbgrid fica em branco como se não houvesse registro algum com o nome digitado. Sei que deve ser uma coisa boba de se resolver, mas estou quebrando a cabeça pra encontrar uma solução. Agradeço pela ajuda de vcs.
eu conheço a função QuotedStr. Mas como disse o Marco, não é isso que eu quero. Usando essa função numa instrução sql de uma query, realmente funciona. Mas eu estou usando o filter e com ele a sintaxe é outra. É isso que eu não estou conseguindo fazer. Por exemplo, eu posso digitar um nome em caixa alta ou baixa, ou apenas colocar em caixa alta a primeira letra do nome, que o filtro não ocorre. Pelo contrário, o dbgrid fica em branco como se não houvesse registro algum com o nome digitado. Sei que deve ser uma coisa boba de se resolver, mas estou quebrando a cabeça pra encontrar uma solução. Agradeço pela ajuda de vcs.
GOSTEI 0
Simone Grandini
04/06/2010
Ocorreu algum problema e por isso nenhum post pode ser mais visualizado. Portanto, vou considerar este chamado encerrado.
GOSTEI 0
Marco Salles
04/06/2010
Ocorreu algum problema e por isso nenhum post pode ser mais visualizado. Portanto, vou considerar este chamado encerrado.
É vero..
GOSTEI 0
Carlos Mazzi
04/06/2010
OK..................................
GOSTEI 0