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