Campos agregados em Delphi com FDMemTable e ClientDataSet

No desenvolvimento de sistemas, muitas vezes precisamos obter totais, médias, contagens ou máximos/mínimos diretamente a partir de datasets em memória. Felizmente, tanto o TFDMemTable (FireDAC) quanto o TClientDataSet suportam campos agregados (Aggregate Fields), que permitem realizar cálculos automaticamente sem precisar percorrer manualmente os registros.
Neste artigo, vamos mostrar como criar e utilizar campos agregados em Delphi, com exemplos práticos.
🔹 O que é um campo agregado?
Um campo agregado é um campo calculado automaticamente pelo dataset com base em uma expressão, como:
SUM(VALOR)→ soma de todos os valoresAVG(VALOR)→ média dos valoresCOUNT(*)→ quantidade de registrosMIN(VALOR)→ menor valorMAX(VALOR)→ maior valor
Ele funciona em tempo real: sempre que os dados do dataset são alterados, o campo agregado é atualizado.
Exemplo com FDMemTable
O TFDMemTable é muito usado em projetos modernos por ser rápido e flexível. Vamos criar um dataset em memória, adicionar registros e configurar um campo agregado.
Criando um campo agregado em tempo de design
- Adicione um
TFDMemTableao formulário. - Clique com o botão direito nele → Fields Editor → Add All Fields.
- No Fields Editor, clique com o botão direito → New Field.
- Name:
TotalValor - Type: Currency
- Field Type: Aggregate
- Expression:
SUM(VALOR)
- Name:
- No código, basta ativar as agregações:
FDMemTable1.AggregatesActive := True;
ShowMessage('Total: ' + CurrToStr(FDMemTable1.FieldByName('TotalValor').AsCurrency));
Criando o campo agregado em tempo de execução
FDMemTable1.Active := False;
FDMemTable1.FieldDefs.Clear;
FDMemTable1.FieldDefs.Add('VALOR', ftCurrency);
FDMemTable1.CreateDataSet;
// Inserindo alguns valores
FDMemTable1.AppendRecord([100]);
FDMemTable1.AppendRecord([200]);
FDMemTable1.AppendRecord([150]);
// Criando campo agregado em tempo de execução
with TAggregateField.Create(FDMemTable1) do
begin
FieldName := 'TotalValor';
FieldKind := fkAggregate;
DataSet := FDMemTable1;
Expression := 'SUM(VALOR)';
end;
FDMemTable1.AggregatesActive := True;
ShowMessage('Total: ' + CurrToStr(FDMemTable1.FieldByName('TotalValor').AsCurrency));
Exemplo com ClientDataSet
O TClientDataSet também suporta agregados, e sua configuração é muito parecida.
Criando um campo agregado em tempo de design
- Adicione um
TClientDataSetao formulário. - Abra o Fields Editor e crie os campos normalmente.
- Crie um campo agregado:
- Name:
TotalValor - Type: Currency
- Field Type: Aggregate
- Expression:
SUM(VALOR)
- Name:
- No código:
ClientDataSet1.AggregatesActive := True;
ShowMessage('Total: ' + CurrToStr(ClientDataSet1.FieldByName('TotalValor').AsCurrency));
Criando o campo agregado em tempo de execução
ClientDataSet1.Close;
ClientDataSet1.FieldDefs.Clear;
ClientDataSet1.FieldDefs.Add('VALOR', ftCurrency);
ClientDataSet1.CreateDataSet;
// Inserindo valores
ClientDataSet1.AppendRecord([50]);
ClientDataSet1.AppendRecord([75]);
ClientDataSet1.AppendRecord([125]);
// Campo agregado criado em runtime
with TAggregateField.Create(ClientDataSet1) do
begin
FieldName := 'TotalValor';
FieldKind := fkAggregate;
DataSet := ClientDataSet1;
Expression := 'SUM(VALOR)';
end;
ClientDataSet1.AggregatesActive := True;
ShowMessage('Total: ' + CurrToStr(ClientDataSet1.FieldByName('TotalValor').AsCurrency));
🔹 Conclusão
Os campos agregados em FDMemTable e ClientDataSet são uma forma prática de simplificar cálculos diretamente no dataset, sem necessidade de percorrer registros manualmente.
Eles são ideais para exibir totais em relatórios, somatórios em grids ou estatísticas rápidas.
👉 Em vez de gastar linhas de código para somar, basta configurar um campo agregado e deixar o Delphi fazer o trabalho!
📌 E você, já usa campos agregados no Delphi?
Em que situações eles ajudam mais no seu projeto?
Deixe seu comentário!
#Delphi, #ProgramacaoDelphi, #FireDAC, #BancoDeDados, #DesenvolvimentoDelphi, #SQL,
#DesenvolvimentoDeSoftware #GiovaniDaCruz
#Programadores, #DevLife, #DelphiTips, #CodeLife, #Developer, #Programacao, #DelphiDevelopers
#DicasDelphi, #DelphiBrasil, #ComunidadeDelphi