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