Fórum Somar Valor Linhas DbGrid #551140

12/04/2016

0

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

Responder

Posts

12/04/2016

Natanael Ferreira

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).
Responder

Gostei + 0

12/04/2016

Bruno Henrique

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?
Responder

Gostei + 0

12/04/2016

Raylan Zibel

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.
Responder

Gostei + 0

12/04/2016

Bruno Henrique

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
Responder

Gostei + 0

12/04/2016

Raylan Zibel

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..
Responder

Gostei + 0

12/04/2016

Bruno Henrique

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

Grato
Responder

Gostei + 0

12/04/2016

Raylan Zibel

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.
Responder

Gostei + 0

12/04/2016

Bruno Henrique

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
Responder

Gostei + 0

12/04/2016

Raylan Zibel

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');
Responder

Gostei + 0

12/04/2016

Bruno Henrique

Obrigado Raylan,

Resolvido.Muito Obrigado

Abraços
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar