ClientDataSet - aggregates tudo sobre ele

Top  Previous  Next

// ------------------ USANDO AGGREGATES PARA FAZER QUEBRAS E SOMAS EM RELATORIOS

 

1. Crie normalmente o clientdataset e seus campos

2. Crie um indice que vai usar para quebra (neste exemplo é 'ind')

3. Crie um Aggregate com os seguintes dados:

   AggregateName = 'grupo'

   Expression    = 'sum(vlr)'

   GroupingLevel = 1  // esse é o nivel do indice (pode ser 2 caso tenha 2 quebra)

   IndexName     = 'ind';

   Active        = true

4. Ative os Aggregates

5. No código:

 

  Tb.First;

  while not Tb.EOF do

  begin

    // primeiro item de cada quebra 

    if gbFirst in Tb.GetGroupState(1) then

      xPrn.Imprimeln('Imprime cabeçalho de grupo');

 

    xPrn.Imprimeln('imprime items');

 

    if gbLast in Tb.GetGroupState(1) then

      xPrn.Imprimeln('TOTAL -> ' + AlinhaDir(Formata(Tb.Aggregates.Find('grupo').Value), 10));

    Tb.Next;

  end;    // while

 

// --------------------------------------------- TOTAL GERAL NA TELA E RELATORIO 

 

 NAO SE ESQUECA QUE SEMPRE QUE USAR AGGREGGATE É NECESSÁRIO INDICES!

 Criando um campo Total Geral:

 

1. Crie um novo campo no ClientDataSet e coloque 

   do tipo Aggregate

2. Propriedades deste TField:

   Active = True

   Expression = 'sum(valor)'

3. ClientDataset.AggregatesActive = True

 

Isto vai disponibilizar um TField no ClientDataSet que contem o total

que na tela pode ser usado um DBText normal

 

Use-o com .value (TbTotal.value) não como .asFloat senão dá pau 

 

// -------------------------------------- USANDO AGGREGATE COM CAMPOS CALCULADOS

 

1. Crie o campo calculado que será agregado, mas o tipo deve ser

   InternalCalc e nao Calculated

 

2. Crie um novo campo no ClientDataSet e coloque 

   do tipo Aggregate

 

3. Propriedades deste TField:

   Active = True

   Expression = 'sum(nome_campo_internal_calc)'

 

4. ClientDataset.AggregatesActive = True

 

Done! agora é só colocar um DBText para mostrar o conteúdo deste

aggregate.

 

// -------------------------------------------------- OBSERVACAO

 

Bug: quando utilizar FILTER + INTERNAL CALC + AGGREGATE os calculos

podem apresentar ERROS grotescos. Para resolver esta situacao

basta colocar Active := False e para True logo após aplicar o FILTER

pois a informacao dos calc fica na memória. Se os dados vierem

de um provider, basta desassociá-lo via propriedade ProviderName.