Somar Valor Linhas DbGrid

Delphi

12/04/2016

Boa tarde!!!
Preciso somar as linhas do dbgrid com duplo clique ou com o enter.Mais não estou conseguindo no Edit EdtValorParcial só aparece o valor da parcela que eu der dois clique eu precisava por exemplo se eu der duplo clique na parcela 1/4 e na parcela 1/5 teria que aparecer no valor Total R$ 198,63 e não aparece aparece R$ 99,32

[img:descricao=Valor Total Parcelas]http://arquivo.devmedia.com.br/forum/imagem/316964-20160412-120025.jpg[/img]

procedure TForm1.DBGridDblClick(Sender: TObject);
var
  i: integer;
  total: double;
begin
  total := 0;
     for i := 0 to DBGrid.SelectedRows.Count - 1 do
       begin
          total := total + ClientDataSet.FieldByName('Liquido').AsFloat;
       end;
  EdtValorParcial.Text :=  FloatToStrF(total,ffCurrency,15,2);
end;
Bruno Henrique

Bruno Henrique

Curtidas 0

Respostas

Natanael Ferreira

Natanael Ferreira

12/04/2016

O seu código está somando apenas as linhas selecionadas. Veja:
for i := 0 to DBGrid.SelectedRows.Count - 1 do

Se quiser ir somando apenas com duplo clique faça:
procedure TForm1.DBGridDblClick(Sender: TObject);
var 
  total: double;
begin 
  total := total + ClientDataSet.FieldByName('Liquido').AsFloat;   
  EdtValorParcial.Text :=  FloatToStrF(total,ffCurrency,15,2);
end;

Não se esqueça de zerar a variável Total ao sair do form (onClose).
GOSTEI 0
Bruno Henrique

Bruno Henrique

12/04/2016

Natanael, boa tarde!!!

Muito obrigado pela ajuda!!!
Acabei de tentar mais mesmo assim ele continua aparecendo no EdtValorParcial.Text o valor da linha que eu dou duplo clique ele continua não somando!!!

Tem outra sugestão?
GOSTEI 0
Raylan Zibel

Raylan Zibel

12/04/2016

Ele so vai somar se voce declarar a variavel "total: double;" como global, fora do procedimento do clique. Declare ela no private do seu form.
GOSTEI 0
Bruno Henrique

Bruno Henrique

12/04/2016

Raylan, boa tarde!!!

Deu certo!!!

Como faço agora para quando eu clicar em cima de uma linha já clicada para não clicar novamente para não gerar valor em duplicidade
GOSTEI 0
Raylan Zibel

Raylan Zibel

12/04/2016

Voce precisa guardar a linha (campo chave ou recno do dataset). Pode guardar os lidos num TList ou Array, e verificar se ja esta la antes de somar. Ou voce pode criar um campo calculado no dataset pra marcar os ja calculados.

etc, etc..
GOSTEI 0
Bruno Henrique

Bruno Henrique

12/04/2016

Vishiiiiiiii....Nossa sou novato!!!
Você teria algum exemplo por favor!!!

Grato
GOSTEI 0
Raylan Zibel

Raylan Zibel

12/04/2016

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBClient;

type
  TForm1 = class(TForm)
    dbgrd1: TDBGrid;
    edt1: TEdit;
    ds1: TDataSource;
    cds1: TClientDataSet;
    cds1codigo: TIntegerField;
    cds1valor: TFloatField;
    procedure FormCreate(Sender: TObject);
    procedure dbgrd1DblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    total: Double;
    clicados: TStringList;
    procedure atualizaedit;
    procedure criadataset;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Math;

{$R *.dfm}

procedure TForm1.atualizaedit;
begin
  // so pra nao repetir no create
  edt1.Text := FloatToStr(total);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  criadataset;
  total := 0;
  atualizaedit;
  clicados := TStringList.Create;
end;

procedure TForm1.dbgrd1DblClick(Sender: TObject);
begin
  if not clicados.IndexOf(IntToStr(dbgrd1.DataSource.DataSet.RecNo)) > -1 then
  begin
    clicados.Add(IntToStr(dbgrd1.DataSource.DataSet.RecNo));
    total := total + dbgrd1.DataSource.DataSet.fieldbyname('valor').AsFloat;
  end;
  atualizaedit;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  clicados.Free;
end;

procedure TForm1.criadataset;
var
  i, j: integer;
begin
  // só pra ter conteudo no grid
  cds1.CreateDataSet;
  for i := 1 to 10 do
  begin
    j := RandomRange(100, 1000);
    cds1.Insert;
    cds1codigo.Value := i;
    cds1valor.Value := i * j / 100;
    cds1.Post;
  end;
end;

end.
GOSTEI 0
Bruno Henrique

Bruno Henrique

12/04/2016

Raylan, boa tarde!!!

Deu certíssimo, muito obrigado mesmo!!!

Só mais uma coisa!!!

Eu coloquei uma
showmessage(Duplicata Já Selecionada)
depois do if mais todos clique que dava na linha ela aparecida, existe a possibilidade de colocar ela no código?


Abraçooss

Obrigado
GOSTEI 0
Raylan Zibel

Raylan Zibel

12/04/2016

if not clicados.IndexOf(IntToStr(dbgrd1.DataSource.DataSet.RecNo)) > -1 then
  begin
    clicados.Add(IntToStr(dbgrd1.DataSource.DataSet.RecNo));
    total := total + dbgrd1.DataSource.DataSet.fieldbyname('valor').AsFloat;
  end
else
   showmessage('Duplicata Já Selecionada');
GOSTEI 0
Bruno Henrique

Bruno Henrique

12/04/2016

Obrigado Raylan,

Resolvido.Muito Obrigado

Abraços
GOSTEI 0
POSTAR