Somar Valor Linhas DbGrid
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]
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
Curtidas 0
Respostas
Natanael Ferreira
12/04/2016
O seu código está somando apenas as linhas selecionadas. Veja:
Se quiser ir somando apenas com duplo clique faça:
Não se esqueça de zerar a variável Total ao sair do form (onClose).
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
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?
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
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
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
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
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..
etc, etc..
GOSTEI 0
Bruno Henrique
12/04/2016
Vishiiiiiiii....Nossa sou novato!!!
Você teria algum exemplo por favor!!!
Grato
Você teria algum exemplo por favor!!!
Grato
GOSTEI 0
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
12/04/2016
Raylan, boa tarde!!!
Deu certíssimo, muito obrigado mesmo!!!
Só mais uma coisa!!!
Eu coloquei uma depois do if mais todos clique que dava na linha ela aparecida, existe a possibilidade de colocar ela no código?
Abraçooss
Obrigado
Deu certíssimo, muito obrigado mesmo!!!
Só mais uma coisa!!!
Eu coloquei uma
showmessage(Duplicata Já Selecionada)
Abraçooss
Obrigado
GOSTEI 0
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
12/04/2016
Obrigado Raylan,
Resolvido.Muito Obrigado
Abraços
Resolvido.Muito Obrigado
Abraços
GOSTEI 0