Monday, November 26, 2007

Filtros em TADODataSet

Descobri recentemente que o TADODataSet e seus descendentes, baseados no ADO Recordset, têm uma peculiaridade na utilização de filtros.

O filtro

  (campo1 = valor1 OR campo1 = valor2) AND campo2 = 'ABCD'

simplesmente não funciona!!!

Não pode haver agrupamento de cláusulas usando o OR e posteriormente agrupando-as com outras cláusulas usando o AND. Teria que reescrever o filtro com:

  (campo1 = valor1 AND  campo2 = 'ABCD')
OR (campo1 = valor2 AND campo2 = 'ABCD')


Isto complica bastante a vida do desenvolvedor que, como eu, criou um "editor visual genérico" de filtros que se aplica a qualquer descendente do TDataSet.
Maneira rápida de fugir do problema: Utilize um ClientDataSet ligado num DataSetProvider, que por sua vez está ligado no ADODataSet (ou ADOQuery) original. E passe a usar o ClientDataSet no lugar do ADODataSet. O primeiro - e também o segundo - exemplo de filtro funciona perfeitamente no ClientDataSet!
Mais uma vez o ClientDataSet se mostrando superior ao ADO Recordset.

No comments: