Filter no Query

04/06/2010

99

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.
Responder

Post mais votado

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++
Responder

Mais Posts

04/06/2010

Marco Salles

Qual o DataSet que vc esta usando ????
Responder
Uso os componentes TTable, TQuery com o Access 2007 e Delphi 2010.
Responder

05/06/2010

Lartedesign

tente assim

ADOQuery1.SQL.ADD(\'WHERE UPPER(NOME) LIKE UPPER(\'+QuotedStr(\'%\'+Edit1.Text+\'%\')+\')\');


Responder
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.


Responder

07/06/2010

Marco Salles

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.


Responder

07/06/2010

Marco Salles

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 .....    
Responder

07/06/2010

Carlos Mazzi

Deu certo ?
Responder

07/06/2010

Marco Salles

Acho que não é isto que ela quer Eduardo
Responder

07/06/2010

Marco Salles

Acho que não é isto que ela quer Eduardo
Responder
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.
Responder
Ocorreu algum problema e por isso nenhum post pode ser mais visualizado. Portanto, vou considerar este chamado encerrado.
Responder

08/06/2010

Marco Salles

Ocorreu algum problema e por isso nenhum post pode ser mais visualizado. Portanto, vou considerar este chamado encerrado.
  É vero..
Responder

30/06/2010

Carlos Mazzi

OK..................................
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar