Pesquisar na Comunidade
Showing results for tags 'aggregate'.
Encontrado 2 registros
-
Arredondamento em campos Aggregate no ClientDataSet
um tópico no fórum postou Mariana Tamy Object Pascal - Delphi & Lazarus
Boa tarde gente, tudo bem? Me falta um pouco de conhecimento sobre o ClientDataSet, procurei em tudo quanto é lugar e não encontrei a solução, espero que alguém possa me dar uma luz. Seguinte, tenho um ClientDataSet com um campo como Float, fkInternalCalc e com a mascara #,##0.00. Nesse campo os valores estão sendo arredondados, mas no Aggregate Field a soma (usei SUM no exp) é feito sem o arredondamento. Exemplo: Tenho 2 item com valor de 35.9450 No meu DbGrid aparece 35.95, a soma daria 71.90, mas no Aggregate aparece 71.89... Eu vi em um post que > 5 arredonda para cima = 5 mantem < 5 arredonda para baixo Mas no meu caso, eu só coloquei a mascara #,##0.00 no DisplatFormat e ele está arredondando sozinho dessa forma. Tentei usar o Currency = True para ambos, também tentei mudar o campo de Float para Currency e deu na mesma. Então, pelo o que eu li no forum não deveria arredondar o valor para 35.95, mas ele está fazendo isso... Com apenas dois itens a diferença é pouca, mas quando são tipo uns 56 itens a diferença fica grande. Alguém poderia me dar uma luz? -
aggregate Campos aggregate em rumtime no clientdataset
um tópico no fórum postou Fabrício Melo Object Pascal - Delphi & Lazarus
Compartilhando essa classe que achei no site do Marcos Salles, pra quem gosta de usar campos aggregate no DataSet, essa função é uma mão na roda pois não precisamos mais cria-los, só chamar a função e passar o campo que queremos totalizar. -- unit UTypeAggregate; //https://marcosalles.wordpress.com/2011/01/30/criacao-de-campos-aggregates-rumtime-clientdataset/ interface uses DBClient, SysUtils; Type TypeAggregateERROR = class(Exception); TAggregateRetorne = (ftSomar,ftMaxima,ftContar,FtMedia); TOperacoes =class class function Retornar(ClientDataSet:TClientDataSet; Const cField:String; Tipo:TAggregateRetorne):String; end; implementation { TOperacoes } class function TOperacoes.Retornar(ClientDataSet: TClientDataSet; const cField: String; Tipo: TAggregateRetorne): String; begin try //ATENÇÃO: NÃO DEIXE O CAMPO TRAZER VALORES NULO NA PESQUISA DO SQL, ERRO NO CALCULO with ClientDataSet do begin case Tipo of ftSomar: begin AggregatesActive := False; if Aggregates.Find('SOMAR_'+ cField) = nil then with Aggregates.Add do begin Expression := 'Sum('+cField+')'; AggregateName := 'SOMAR_'+ cField; Active := True; end; AggregatesActive := True; Result := Aggregates.Find('SOMAR_'+ cField).Value; end; ftMaxima: begin AggregatesActive := False; if Aggregates.Find('MAXIMA_'+ cField) = nil then with Aggregates.Add do begin Expression := 'Max('+cField+')'; AggregateName := 'MAXIMA_'+ cField; Active := True; end; AggregatesActive := True; Result := Aggregates.Find('MAXIMA_'+ cField).Value; end; ftContar: begin AggregatesActive := False; if Aggregates.Find('CONTAR_'+ cField) = nil then with Aggregates.Add do begin Expression := 'Count('+cField+')'; AggregateName := 'CONTAR_'+ cField; Active := True; end; AggregatesActive := True; Result := Aggregates.Find('CONTAR_'+ cField).Value; end; ftMedia: begin AggregatesActive := False; if Aggregates.Find('MEDIA_'+ cField) = nil then with Aggregates.Add do begin Expression := 'Avg('+cField+')'; AggregateName := 'MEDIA_'+ cField; Active := True; end; AggregatesActive := True; Result := Aggregates.Find('MEDIA_'+ cField).Value; end; end; end; except on e:Exception do raise TypeAggregateERROR.Create('Erro na Totalização.'+sLineBreak+ 'Verifique se o campo contém valores NULO ou se o DataSet esta inativo'+ sLineBreak+ E.Message); end; end; end. Ex: FSUB_TOTAL_A := StrToFloatDef(TOperacoes.Retornar(cdsItensRateio, cdsItensRateioVALOR_TOTAL_A.FieldName, ftSomar), 0); FSUB_TOTAL_B := StrToFloatDef(TOperacoes.Retornar(cdsItensRateio, cdsItensRateioVALOR_TOTAL_B.FieldName, ftSomar), 0);