domingo, 13 de setembro de 2009

O enigma da propriedade filter do ttable

{ 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. }

Nenhum comentário:

Postar um comentário