Olá galera, nesta Quick Tips, irei mostrar alguns dos recursos mais utilizados no ClientDatataSet, um dos melhores componentes que existem no Delphi.

ClientDataSet é um componente que armazena informações em memória, tornando assim o trafego na rede menor, onde podemos fazer alterações, inclusões, deleções, e ao terminar as mudanças, podemos de uma única vez mandar o Pack de dados para ser executado no Banco de Dados.

Além de podermos trabalhar com base de dados em XML, criar campos que não façam parte do Banco de Dados, este seria o objetivo desta Quick Tip, mostrar como trabalhar com campos Internalcalc, Calculated, Aggregate.

  • Calculated: Podemos criar um campo para calcular em memória valores como, por exemplo, quantidade x valor.
  • Internalcalc: Podemos criar um campo para calcular em memória valores como, por exemplo, quantidade x valor, daí vocês podem pergunta mas qual a diferença ? Leia o próximo item
  • Aggregate: Podemos criar um valor agregado, agrupado, somando com uma expressão agregada de SQL, isso mesmo, expressão agregada de SQL, SUM, AVG, MAX, MIN, ETC, porém não podemos fazer cálculos de Fields Calculated, mas sim de Fields InternalCalc, esta seria a diferença de um para o outro.

Vamos agora exemplificar cada um deles. Preparei aqui uma tabela com dois campos, Valor e Quantidade, conforme a figura a seguir:

Criando um campo Calculated

Selecione o CDS, com o botão direito e vá a Fields Editor. E depois adicione um Field (CTRL + N). Faça a seguinte configuração na janela abaixo:

Criando um campo InternalCalc

Selecione o CDS, com o botão direito e vá a Fields Editor. E depois adicione um Field (CTRL + N). Faça a seguinte configuração na janela abaixo:

Criando um campo Aggregate

Selecione o CDS, com o botão direito e vá a Fields Editor. E depois adicione um Field (CTRL + N). Faça a seguinte configuração na janela abaixo:

Terminamos a criação dos Fields e agora vamos fazer a programação para poder ver o funcionamento.

Iremos agora fazer a “Formula” que queremos utilizar nos Fields Calculate, InternalCalc. Selecione o CDS, e vá até o evento onCalcFields implemente o seguinte código :

procedure TFrmPrincipal.CDSCalcFields(DataSet: TDataSet);
 begin
 With DataSet do
 begin
 FieldByName('TotalCalculated').AsFloat :=
 FieldByName('VALOR').AsFloat * FieldByName('Qtd').AsInteger;
 FieldByName('TotalInternalCalc').AsFloat :=
 FieldByName('VALOR').AsFloat * FieldByName('Qtd').AsInteger;
 end;
 end;

Veja como ficaria se você adicionar os Fields Calculate e InternalCalc no DBGrid, e executar a aplicação podemos ver o resultado:

E para finalizarmos vamos configurar o Field Aggregate.

  • Selecione o CDS e ative a propriedade AggregatesActive := True
  • Selecione o Field TotalAggregate e na propriedade Ative := True
  • Selecione o Field TotalAggregate e na propriedade Expression SUM(TOTALINTERNALCALC)

Nesta propriedade podemos colocar funções agregadas de SQL, assim como podemos fazer cálculos exemplo SUM((TOTALINTERNALCALC) + 10 ) * QTD. Qualquer expressão poderá ser feito nesta propriedade.

Pra exibir o conteúdo do valor TotalAggregate utilize o seguinte código :

procedure TForm1.FormCreate(Sender: TObject);
 begin
 Caption := CDS.FieldByName('TotalAggregate').AsString;
 end;

Observe que eu estou usando o AsString, pois o AsFloat, AsInteger, entre outros, ele irá dar o seguinte erro, certamente se for Integer mudará o final do erro, por exemplo.

Cannot access field 'TotalAggregate' as type Float.

Fico por aqui ate à próxima Quick Tips.

Um abraço