Filter no Query
04/06/2010
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.
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++
Mais Posts
Qual o DataSet que vc esta usando ????
04/06/2010
Simone Grandini
Uso os componentes TTable, TQuery com o Access 2007 e Delphi 2010.
tente assim
ADOQuery1.SQL.ADD(\'WHERE UPPER(NOME) LIKE
UPPER(\'+QuotedStr(\'%\'+Edit1.Text+\'%\')+\')\');
07/06/2010
Simone Grandini
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.
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.
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]
Type
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;
//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;
//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;
Tem que entender que A < B < C < D .....
Acho que não é isto que ela quer Eduardo
Acho que não é isto que ela quer Eduardo
08/06/2010
Simone Grandini
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.
08/06/2010
Simone Grandini
Ocorreu algum problema e por isso nenhum post pode ser mais visualizado. Portanto, vou considerar este chamado encerrado.
Ocorreu algum problema e por isso nenhum post pode ser mais visualizado. Portanto, vou considerar este chamado encerrado.
É vero..
OK..................................