Esse artigo faz parte da revista Clube Delphi edição 9. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.


O enigma do Filter

Utilizando  os filtros corretamente

 

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 está 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. Mas 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 me veio em mente 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 me decepcionaria, afinal somos amigos há 6 anos, e o defendo 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.

         Até nosso próximo enigma!

 

 

Fabio Camara é coordenador de projetos da Stefanini Consultoria, autor do livro “Banco de Dados com Delphi” da editora Visual Books e sócio fundador da Delphi Bahia