Vous êtes sur la page 1sur 3

Criao de Campos Aggregates RumTime ClientdataSet

Muitas das vezes precisamos extrair valores agregados calculados em uma rotina . A primeira coisa que vem em nossa mente fazer um Sql utilizando as expresses Sum , Max , Count , Avg . Ao fazer isto consumindo recurso de Rede , sendo que o clientDataSet tem modos mais elegantes de tratar o problema : os campos Aggregados . Esses campos podem ser definidos em tempo de projeto , porm nosso objetivo e dar um tratamento diferenciado e criar esses campos na execuo do Aplicativo isto em RumTime . Vamos criar uma Classe espefica para isto , para ser reaproveitada em todo o projeto dando uses nesta Unit , e ainda podemos reutiliza para os demais projetos que por ventura possa necessitar deste tipo de calculo. Vamos Abrir uma Unit , Renomea-la como UTypeAggregate e Salva-la .. Aps isto escrevemos o cdigo abaixo . Dispensa explicao e comentrios devido a sua simplicidade .
01 02 03 04 05 06 07 08 09 10 11 12 13 unit UTypeAggregate; interface uses DBClient, SysUtils; Type TypeAggregateERROR = class(Exception); TAggregateRetorne = (ftSomar,ftMaxima,ftContar,FtMedia); TOperacoes =class

class function Retornar(ClientDataSet:TClientDataSet; Const cField:String; 14 Tipo:TAggregateRetorne):String; 15 end; 16 17 implementation 18 19 { TOperacoes } 20 21 class function TOperacoes.Retornar(ClientDataSet: TClientDataSet; const cField: String; Tipo: TAggregateRetorne): 22 String; 23 begin 24 try 25 with ClientDataSet do 26 begin

27 AggregatesActive := False; 28 if Aggregates.Find('Somar') = nil then 29 with Aggregates.Add do 30 begin 31 Expression := 'Sum('+cField+')'; 32 AggregateName := 'Somar'; 33 Active := True; 34 end; 35 if Aggregates.Find('Maxima') = nil then 36 with Aggregates.Add do 37 begin 38 Expression := 'Max('+cField+')'; 39 AggregateName := 'Maxima'; 40 Active := True; 41 end; 42 if Aggregates.Find('Contar') = nil then 43 with Aggregates.Add do 44 begin 45 Expression := 'Count('+cField+')'; 46 AggregateName := 'Contar'; 47 Active := True; 48 end; 49 if Aggregates.Find('Media') = nil then 50 with Aggregates.Add do 51 begin 52 Expression := 'Avg('+cField+')'; 53 AggregateName := 'Media'; 54 Active := True; 55 end; 56 AggregatesActive := true; 57 case Tipo of 58 ftSomar:result:=Aggregates.Find('Somar').Value; 59 ftMaxima:result:=Aggregates.Find('Maxima').Value; 60 ftContar:result:= Aggregates.Find('Contar').Value; 61 FtMedia:result:= Aggregates.Find('Media').Value; 62 end; 63 end; 64 except 65 on e:Exception do 66 raise TypeAggregateERROR.Create( 67 'Erro na passagem de parmetros'+sLineBreak+ 'ou confira se o DataSet esta Ativo');//propagar 68 a exceo 69 end; 70 end; 71 end.

O nico metodo desta classe retorna uma das quatro operaoes bsicas que se pode fazer no conjunto de dados do clientDataSet passado como parmetro. Perceba que o Retorno depende do tipo que ser obter . Pode ser a Soma , a mdia , o Valor mximo ou o total de registro . Note que temos um mtodo de classe de modo que no precisamos da instncia do objeto para obter os resultados , nen to pouco de sua destruio

Para usar muito simples No formulrio , de uses a Unit para podermos acessar seu mtodo , coloque quatro edits , com os respectivos nomes de (edtSoma ; edtMaxima ; edtCount ;edtAvg: TEdit ) , coloque um Boto com o nome de btnSomarVendas , e um Clientdataset ligado a um banco ou mesmo a uma tabela MyBase e escreva no evento OnClick do Boto o seguinte Mtodo :
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 procedure TForm6.btnSomarVendasClick(Sender: TObject); const cField= 'Aqui voce vai colocar o Nome Correto do field'; begin try cds.Close; edtSoma.Text:= TOperacoes.Retornar(cds,cField,ftSomar); edtMaxima.Text:= TOperacoes.Retornar(cds,cField,ftMaxima); edtCount.Text:= TOperacoes.Retornar(cds,cField,ftContar); edtAvg.Text:=TOperacoes.Retornar(CDS,cField,FtMedia) except on e:Exception do showmessage(e.ClassName+sLineBreak+e.Message); end; end;

Execute a aplicao e veja o resultado . E isto ai , espero ter sido til e ter sido entendido . Um abrao e at a prxima

Vous aimerez peut-être aussi