Você sabia que, em uma consulta ou tabela do Firedac, é possível trabalhar com agregações em tempo de execução no nível do conjunto de dados? A exibição de um valor total de todos os pedidos carregados ou de um total de todos os pedidos a serem enviados pode ser feita com muita facilidade, sem a necessidade de uma consulta separada.
Talvez você já esteja familiarizado com um campo agregado, mas isso está limitado ao nível da linha. No entanto, com a propriedade Aggegrates
de um TFDDataSet
, você também pode totalizar em nível de conjunto de dados.
Como exemplo, tenho um programa de demonstração no qual recupero todos os pedidos de um banco de dados em uma tabela. Posso filtrá-los pelo ID da loja. No canto superior direito, você pode ver o número de pedidos que ainda não foram enviados. Esse número é calculado por um campo agregado da consulta.
Para começar, defino um campo de agregação na propriedade de agregação da consulta. O campo mais importante aqui é Expression. É aqui que definimos a agregação que queremos executar. Possivelmente com uma condição. A sintaxe de expressão do padrão Firedac é usada para isso.
No exemplo acima, eu conto o número de registros (COUNT
) do campo Shipped_Date
com a condição de que esse campo seja contado somente se o valor estiver vazio. Para isso, a função IIF
pode ser usada. Outros exemplos simples que você pode usar aqui são:
SUM(order_amount)
MIN(order_date)
Como você pode ver nas propriedades, é possível definir um campo como ativo. Se não o fizer, ele obviamente não será calculado. Um nome também pode ser útil para que você possa encontrar a agregação no código.
Infelizmente, não é possível vincular uma agregação como um campo de banco de dados a um controle com reconhecimento de dados. Portanto, a renderização deve ser tratada no código. Criei um procedimento separado para isso, de modo que possa chamá-lo facilmente quando for necessária uma atualização. Chamo esse procedimento no evento AfterOpen da consulta e ao filtrar em um armazenamento.
procedure TfrmDemoApp.qryOrdersAfterOpen(DataSet: TDataSet); begin ShowNotShippedAggregation; end; procedure TfrmDemoApp.ShowNotShippedAggregation; begin var NotShipped := qryOrders.Aggregates.Items[0].Value; if NotShipped = Null then lblNotShipped.Caption := '0' else lblNotShipped.Caption := NotShipped; end;
Na consulta, lembre-se de definir a propriedade AggegratesActive
para True
, caso contrário, as agregações não serão calculadas. Outro ponto a ser lembrado: as agregações operam nos dados recuperados no conjunto de dados. Por padrão, o Firedac recupera 50 registros. Se você quiser um total baseado em todos os registros, vá para FetchOptions nas propriedades da consulta e defina o Mode como fmAll.
Veja abaixo o resultado no aplicativo de demonstração.
Contato