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

 



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

Responder a