O exemplo soma um campo calculado internamente (fkinternalCalc) que poderá ter 
o valor informado ou o valor zero, dependendo do flag indicando se deve ou não 
totalizar. Acredito que usando esta idéia, e implementando mais algumas 
alterações, vc poderá resolver seu problema a partir do meu exemplo.

 

Boa sorte.

Sds.

 

P.S.: Você baixou o mesmo exemplo disponibilizado na área de arquivos da lista?

 


To: delphi-br@yahoogrupos.com.br
From: harleydiaskoeh...@yahoo.com.br
Date: Fri, 8 Jan 2010 11:47:03 +0000
Subject: Re: RES: [delphi-br] Calculo em DBGrid

  



Não é bem isso que preciso.
Talvez eu tenha entendido de forma errado o seu exemplo.
Na pratica seria o que esta abaixo.

tenho um grid com os seguintes campos:

ID DESCRICAO VALOR
1 CTA 1 SOMA CTA 2 E CTA 3
2 CTA 2 20,00
3 CTA 3 SOMA CTA 4 E CTA 5
4 CTA 4 15,00
5 CTA 5 30,00

Hoje eu faço isso funcioanar com botão que realiza os calculos e atualizada os 
valores da coluna VALOR.
O que eu preciso é eliminar o clique nesse botão, ou seja se o usuario alterar 
o valor de CTA 2, ou CTA 4 ou CTA 5 automaticamente atualize CTA 3 e CTA 1.

Se puder me ajudar agradeço.

--- Em delphi-br@yahoogrupos.com.br, Rubem Rocha <rubem.ro...@...> escreveu
>
> No seu Delphi, crie um novo projeto de aplicação Windows. Em seguida, remova
> o formulário criado do projeto. A seguir, copie e cole os conteúdos abaixo
> para criar os respectivos arquivos mencionados, Unit1.dfm e Unit2.dfm.
> Depois, adicione o Unit1.pas criado. Execute a aplicação. Espero que seja o
> que você procurava. Boa sorte. Sds.
> 
> 
> 
> { Unit1.dfm – início }
> 
> object dbgCalculo: TdbgCalculo
> 
> Left = 73
> 
> Top = 126
> 
> BorderStyle = bsDialog
> 
> Caption = 'Cálculos com ClientDataSets e DBGrids'
> 
> ClientHeight = 370
> 
> ClientWidth = 594
> 
> Color = clBtnFace
> 
> Font.Charset = ANSI_CHARSET
> 
> Font.Color = clWindowText
> 
> Font.Height = -12
> 
> Font.Name = 'Tahoma'
> 
> Font.Style = []
> 
> OldCreateOrder = False
> 
> Position = poScreenCenter
> 
> PixelsPerInch = 96
> 
> TextHeight = 14
> 
> object lblTotal: TLabel
> 
> Left = 337
> 
> Top = 346
> 
> Width = 63
> 
> Height = 14
> 
> Alignment = taRightJustify
> 
> Caption = 'Total Geral:'
> 
> end
> 
> object dbgCalculo: TDBGrid
> 
> Left = 4
> 
> Top = 4
> 
> Width = 584
> 
> Height = 333
> 
> DataSource = dsCalculo
> 
> Font.Charset = ANSI_CHARSET
> 
> Font.Color = clNavy
> 
> Font.Height = -12
> 
> Font.Name = 'Tahoma'
> 
> Font.Style = []
> 
> ParentFont = False
> 
> TabOrder = 0
> 
> TitleFont.Charset = ANSI_CHARSET
> 
> TitleFont.Color = clWindowText
> 
> TitleFont.Height = -12
> 
> TitleFont.Name = 'Tahoma'
> 
> TitleFont.Style = []
> 
> end
> 
> object panTotal: TPanel
> 
> Left = 406
> 
> Top = 344
> 
> Width = 104
> 
> Height = 18
> 
> BevelOuter = bvLowered
> 
> TabOrder = 1
> 
> object dbtTotal: TDBText
> 
> Left = 1
> 
> Top = 1
> 
> Width = 102
> 
> Height = 16
> 
> Align = alClient
> 
> Alignment = taRightJustify
> 
> DataField = 'TotalValorTotaliza'
> 
> DataSource = dsCalculo
> 
> Font.Charset = ANSI_CHARSET
> 
> Font.Color = clNavy
> 
> Font.Height = -12
> 
> Font.Name = 'Tahoma'
> 
> Font.Style = [fsBold]
> 
> ParentFont = False
> 
> end
> 
> end
> 
> object cdsCalculo: TClientDataSet
> 
> Active = True
> 
> Aggregates = <>
> 
> AggregatesActive = True
> 
> Params = <>
> 
> BeforePost = cdsCalculoBeforePost
> 
> OnNewRecord = cdsCalculoNewRecord
> 
> Left = 184
> 
> Top = 212
> 
> Data = {
> 
> 620000009619E0BD010000001800000004000000000003000000620002494404
> 
> 000100000000000944657363726963616F010049000000010005574944544802
> 
> 00020032000556616C6F72080004000000000008546F74616C697A6102000300
> 
> 000000000000}
> 
> object cdsCalculoID: TIntegerField
> 
> DisplayWidth = 7
> 
> FieldName = 'ID'
> 
> end
> 
> object cdsCalculoDescricao: TStringField
> 
> DisplayLabel = 'Descrição'
> 
> DisplayWidth = 50
> 
> FieldName = 'Descricao'
> 
> Size = 50
> 
> end
> 
> object cdsCalculoValor: TFloatField
> 
> DisplayWidth = 10
> 
> FieldName = 'Valor'
> 
> DisplayFormat = '#,##0.00'
> 
> end
> 
> object cdsCalculoTotaliza: TBooleanField
> 
> DisplayLabel = 'Totalizar ?'
> 
> DisplayWidth = 10
> 
> FieldName = 'Totaliza'
> 
> OnChange = cdsCalculoTotalizaChange
> 
> OnGetText = cdsCalculoTotalizaGetText
> 
> OnSetText = cdsCalculoTotalizaSetText
> 
> end
> 
> object cdsCalculoValorTotaliza: TFloatField
> 
> FieldKind = fkInternalCalc
> 
> FieldName = 'ValorTotaliza'
> 
> Visible = False
> 
> end
> 
> object cdsCalculoTotalValorTotaliza: TAggregateField
> 
> FieldName = 'TotalValorTotaliza'
> 
> Active = True
> 
> Expression = 'SUM(ValorTotaliza)'
> 
> IndexName = 'DEFAULT_ORDER'
> 
> end
> 
> end
> 
> object dsCalculo: TDataSource
> 
> DataSet = cdsCalculo
> 
> Left = 260
> 
> Top = 212
> 
> end
> 
> end
> 
> { Unit1.dfm – final }
> 
> 
> 
> { Unit1.pas – início }
> 
> unit Unit1;
> 
> 
> 
> interface
> 
> 
> 
> uses
> 
> Classes, Forms, Windows, DB, DBClient, StdCtrls, Controls, DBCtrls,
> ExtCtrls,
> 
> Grids, DBGrids;
> 
> 
> 
> type
> 
> TdbgCalculo = class(TForm)
> 
> cdsCalculo: TClientDataSet;
> 
> dsCalculo: TDataSource;
> 
> dbgCalculo: TDBGrid;
> 
> panTotal: TPanel;
> 
> dbtTotal: TDBText;
> 
> lblTotal: TLabel;
> 
> cdsCalculoDescricao: TStringField;
> 
> cdsCalculoID: TIntegerField;
> 
> cdsCalculoValor: TFloatField;
> 
> cdsCalculoTotaliza: TBooleanField;
> 
> cdsCalculoValorTotaliza: TFloatField;
> 
> cdsCalculoTotalValorTotaliza: TAggregateField;
> 
> procedure cdsCalculoNewRecord(DataSet: TDataSet);
> 
> procedure cdsCalculoTotalizaGetText(Sender: TField; var Text: String;
> 
> DisplayText: Boolean);
> 
> procedure cdsCalculoTotalizaChange(Sender: TField);
> 
> procedure cdsCalculoBeforePost(DataSet: TDataSet);
> 
> procedure cdsCalculoTotalizaSetText(Sender: TField;
> 
> const Text: String);
> 
> public
> 
> constructor Create(AOwner: TComponent); override;
> 
> end;
> 
> 
> 
> var
> 
> dbgCalculo: TdbgCalculo;
> 
> 
> 
> implementation
> 
> 
> 
> uses SysUtils;
> 
> 
> 
> {$R *.dfm}
> 
> 
> 
> procedure TdbgCalculo.cdsCalculoNewRecord(DataSet: TDataSet);
> 
> begin
> 
> cdsCalculoTotaliza.AsBoolean := true;
> 
> cdsCalculoTotalizaChange(cdsCalculoTotaliza);
> 
> end;
> 
> 
> 
> constructor TdbgCalculo.Create(AOwner: TComponent);
> 
> begin
> 
> inherited Create(AOwner);
> 
> // Configura uma lista de campos para uma combo que o DBGrid
> 
> // automaticamente mostrará quando o usuário for informar
> 
> // se o valor será totalizado ou não
> 
> dbgCalculo.Columns[3].PickList.Text := 'NÃO' + sLineBreak + 'SIM';
> 
> end;
> 
> 
> 
> procedure TdbgCalculo.cdsCalculoTotalizaGetText(Sender: TField;
> 
> var Text: String; DisplayText: Boolean);
> 
> const
> 
> lNomes: array[Boolean] of string = ('NÃO', 'SIM');
> 
> begin
> 
> if Sender.IsNull or (Sender.DataSet.RecordCount = 0) then
> 
> Text := EmptyStr
> 
> else {if DisplayText then}
> 
> Text := lNomes[Sender.AsBoolean]
> 
> {else
> 
> Text := Sender.AsString}
> 
> end;
> 
> 
> 
> procedure TdbgCalculo.cdsCalculoTotalizaChange(Sender: TField);
> 
> begin
> 
> // Copia ou não o valor informado para o campo que será totalizado
> 
> case Sender.AsBoolean of
> 
> false: cdsCalculoValorTotaliza.AsFloat := 0.00;
> 
> true: cdsCalculoValorTotaliza.AsFloat := cdsCalculoValor.AsFloat;
> 
> end;
> 
> end;
> 
> 
> 
> procedure TdbgCalculo.cdsCalculoBeforePost(DataSet: TDataSet);
> 
> begin
> 
> // Antes de salvar, força recálculo da expressão totalizadora
> 
> cdsCalculoTotalizaChange(cdsCalculoTotaliza)
> 
> end;
> 
> 
> 
> procedure TdbgCalculo.cdsCalculoTotalizaSetText(Sender: TField;
> 
> const Text: String);
> 
> begin
> 
> // Traduz a entrada de strings via DBGrid em valores booleanos
> 
> if Text = 'NÃO' then Sender.AsBoolean := false;
> 
> if Text = 'SIM' then Sender.AsBoolean := true;
> 
> 
> 
> // Posta a alteração para forçar recálculo
> 
> cdsCalculo.Post;
> 
> end;
> 
> 
> 
> end.
> 
> { Unit1.pas – final }
> 
> 
> 
> 
> 
> De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em
> nome de harleydiaskoehler
> Enviada em: quinta-feira, 7 de janeiro de 2010 09:35
> Para: delphi-br@yahoogrupos.com.br
> Assunto: [delphi-br] Calculo em DBGrid
> 
> 
> 
> 
> 
> Prezados Colegas
> 
> Preciso realizar calculos dentro de um dbrig.
> 
> Utilizo um clientdataset em memoria e tenho diversos registros.
> São quatro campos: id : integer, ds : string, totaliza : string(S/N) e vl :
> valor.
> Atraves de um stringList faço uma carga inicial dos dados que estão em um
> arquivo texto. O usario valida o campo valor e os altera caso necessário em
> seguida clica em um botão que faz os calculos dos campos valor onde
> (totaliza) com a flag = 'S'
> 
> Gostaria de eliminar esse botão e a medida que o usuario fosse alterando o
> campo valor, o calculo fosse feito automaticamente, como uma planilha excel.
> tentei colocar o codigo do botão em diversos eventos do grid ou do proprio
> clientdataset, mas não consegui fazer funcionar. Alguem ja fez algo parecido
> ?
> 
> saudações
> 

                                          
_________________________________________________________________
Sabia que você tem 25Gb de armazenamento grátis na web? Conheça o Skydrive 
agora.
http://www.windowslive.com.br/public/product.aspx/view/5?ocid=CRM-WindowsLive:produtoSkyDrive:Tagline:WLCRM:On:WL:pt-BR:SkyDrive

[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    delphi-br-ow...@yahoogrupos.com.br
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    delphi-br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Responder a