quarta-feira, 10 de dezembro de 2008

Uso de Aggregates no ClientDataSet

Olá pessoal.
Hoje nesse post, falarei sobre o uso de aggregates no ClientDataSet.


PARA QUÊ E ONDE EU UTILIZO AGGREGATES?

Uma das funções do aggregate, é poder gerar expressões que envolvam todas as ocorrências adquiridas em uma Query como Somar, Contar, adquirir o valor Mínimo, Máximo e média total.
Muitos programadores costumam fazer isso atribuindo valores a um loop Do While Next;
Mas essa é uma alternativa lerda em que caso for contar uma quantidade grande de registros, a aplicação pode ficar lenta.

Você pode estar se perguntando: "Eu não posso fazer isso pelo InternalCalc?".
Com o Internalcalc, eu consigo fazer operações no registro onde esta o ponteiro, mas não em todos os registros.


UTILIZANDO AGGREGATES

Vamos botar a mão na massa.
Arraste um Panel, um ClientDataSet, um DataSource e um DBGrid para o formulário.
Marque a opção Align do panel para AlBottom e a opção Align do DBGrid para AlClient.

Vamos carregar os dados no ClientDataSet de um arquivo XML.
A instalação do Delphi gera alguns arquivos XML por padrão, para uso de testes dentro do Delphi.
  • Clique no ClientDataSet e clique na elipse(...) da propriedade FileName.
  • Vá na raiz onde esta instalado o Delphi-> Arquivos de Programas ->Arquivos Comuns->Borland Shared (ou CodeGear Shared) ->Data.
  • Escolha o arquivo Employee.xml
  • Marque a propriedade Active do CDS para TRUE.
  • Aponte a propriedade DataSet do DataSource1 para o ClientDataset1.
Seu Form deverá ficar assim:












  • Clique 2x no ClientDataSet, e tecla CTRL+F(Add All Fields).
  • Marque a opção AggregatesActive do CDS para True.
  • No FieldsEditor do CDS, tecle CTRL+M(New Field).
  • em Name, digite SOMA e em FieldType, marque a opção Aggregate. Note que o Type do novo Field, também ficará como Aggregate.














Note que o FieldEditor adicionou uma nova linha separada com o campo Agregado. O CDS faz isso com todos os campos agregados que lhe é carregado.
Clique no TField Soma e vá até a propriedade Expression no Object Inspector.
Digite o seguinte: SUM(salary) e ainda no TFieldSoma, marque a propriedade Active para TRUE.
Arraste um DBText para o Panel abaixo do DBGrid. Aponte o DataSource1 na propriedade DataSource do DBText e em DataField selecione a opção SOMA (que é o novo TField agregado que criamos).
Note que o Caption do DBText já é alterado pegando a soma total do campo Salary em todas as ocorrências. Caso você filtre o ClientDataSet, a somatotal do DBText será a soma de todos os registros filtrados.

Nossa aplicação não fica beeeeeeeeeeem mais rápida assim?
:D
legal né?

Em caso de dúvidas, podem comentar que respondo o mais rápido que eu puder.

Abraços e até a proxima.

8 comentários:

Anônimo disse...

Fala kra. Belo artigo !!
Na verdade tinha uma duvida em relação ao field Aggregate. Eu criei um campo do tipo aggregate, mas preciso fazer um calculo usando esse total(aggregate), so que da um erro dizendo que naum posso usar o campo aggregate como float.
Como poderia usar esse campo nos meus calculos ?

Um abraço

Tiago Germano (tiago_nt@hotmail.com)

Maurício Vinicius de O. Santos disse...

Olá amigo.
Estranho dar o erro.
Mas já que está dando erro, faça o seguinte:
Pq vc nao joga o valor do aggregate em uma variavel do tipo string ou até mesmo em um label... e depois para somar os valores, utilize a função StrToFloat.
Tenta isso e me fala ;)
Abraços.

Anônimo disse...

Oie Mauricio...
valeu kra... deu certo. Coloquei o campo como Asvariant. Ai consegui manipular para fazer meu calculos...
Muito obrigado pela ajuda e pelo rapidez ao resonder.
abrçs....

Anônimo disse...

Oi amigo estou a ponto arrancar os cabelos.
Tenho um extrato.db
documento, valor
preciso um dbgrid com
documento valor saldo
0001 10,00 10,00
0002 20,00 30,00
0010 -5,00 25,00

so que meu arquivo tem 16375 registros, e preciso que esta coluna do saldo seja calculado ou aggregat ou qualquer outra coisa, pois somando atraves do while fica muito lento. tentei fazer o aggregate mais mina janela new field nao tem a opcao de aggregate no quadro fielf type so aparece data, calculated e lookup, e nas propriedades da tabela tambem nao tem a AggregatesActive, uso o delphi 7, POR FAVOR ME AJUDEM, resumindo preciso do dbgrid com a coluna saldo como se fosse no excell, se excluo uma linha la de cima todas as linhas do grid mudam a coluna saldo automaticamente, ou seja se altero , excluo ou incluo lancamento a coluna saldo e automaticamente recalculada, e isto tem de sem no grid, igual e no money da microsoft.
alexandre@managercorp.com.br

Unknown disse...

Mauricio, estou usando vários aggregates na minha aplicação para calculo de algumas médias ponderadas. Em uma das colunas tenho a seguinte expressão "SUM(Distrib)/SUM(Diarias)".
Esses calculos estavam funcionando, mas derrepente não funcionam mais, voce tem alguma sugestão?

gaucho.gilson disse...

Bom Dia...avalie a possibilidade de me auxiliar...sou novato em Delphi/Mysql/Zeos, estou enfrentando a seguinte situação...em um Form CAIXA possuo um DBGrid onde visualizo minhas consultas sql, possui as colunas COD, DESC LANÇ, R$ LANÇ, R$ SALDO, TIPO (Despesa ou Receita), o campo saldo é atualizado a cada lançamento conforme tipo DESPESA (-) ou RECEITA (+), igual extrato bancario, qdo eu gero uma pesquisa GERAL, todos lançamentos, funciona blz, porém c eu consultar por um periodo ou tipo (Despesa ou Receita) da erro, conforme exemplo abaixo...

Exemplo1: Pesquisa GERAL, correto assim...

Cód Data Lanç. Descrição R$ Valor R$ Saldo Tipo
8 12/11/2011 DESPESA R$ 10,00 R$ 42,00 DESPESA
9 12/11/2011 DESPESA1 R$ 2,00 R$ 40,00 DESPESA
10 12/11/2011 RECEITA R$ 10,00 R$ 50,00 RECEITA
11 12/11/2011 RECEITA1 R$ 5,00 R$ 55,00 RECEITA
12 12/11/2011 DESPESA2 R$ 5,00 R$ 50,00 DESPESA
13 12/11/2011 RECEITA2 R$ 15,00 R$ 65,00 RECEITA

Exemplo 2: Pesquisa po tipo (DESPESA), ERRO no saldo...

Cód Data Lanç. Descrição R$ Valor R$ Saldo Tipo
8 12/11/2011 DESPESA R$ 10,00 R$ 42,00 DESPESA
9 12/11/2011 DESPESA1 R$ 2,00 R$ 40,00 DESPESA
12 12/11/2011 DESPESA2 R$ 5,00 R$ 50,00 DESPESA

Exemplo 2: Correto seria assim...

Cód Data Lanç. Descrição R$ Valor R$ Saldo Tipo
8 12/11/2011 DESPESA R$ 10,00 R$ 42,00 DESPESA
9 12/11/2011 DESPESA1 R$ 2,00 R$ 40,00 DESPESA
12 12/11/2011 DESPESA2 R$ 5,00 R$ 35,00 DESPESA

gaucho.gilson@hotmail.com

Anônimo disse...

Show de bola! Exatamente o que eu estava precisando e funcionou perfeitamente! Muito obrigado!

Fabrício Medeiros

Luiz Carlos Ruiz disse...

Ola tem como fazer um sum com if?

tipo

sum( if( status="S", vr_documento, 0 ) )