Acabei de postar na área de arquivos da lista um .ZIP contendo este código 
fonte de exemplo. Espero que possa ser de grande ajuda não somente para o 
Harley mas para todos. O exemplo encontra-se em 
http://br.groups.yahoo.com/group/delphi-br/files/Exemplos/

 

Sds.
 


To: delphi-br@yahoogrupos.com.br
From: rubem.ro...@dtmanaus.com.br
Date: Thu, 7 Jan 2010 18:39:02 -0400
Subject: RES: [delphi-br] Calculo em DBGrid

  



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
                                          
_________________________________________________________________
Com o Windows 7 nenhum arquivo vai se esconder de você. Clique para conhecer !
http://www.microsoft.com/brasil/windows7/default.html?WT.mc_id=1539

[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