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. |