Fórum Laço For Como Fazer #552543
27/04/2016
0
Estou fazendo um laço for para dar baixa em um contas a receber,mais o meu laço só baixa a primeira parcela como posso arrumar isso?
Obs. Os dados são apresentados em um dbgrid
Ligações com o banco
SQLConnection1
SQLDataSet1
DataSetProvider1
ClientDataSet1
DataSource1
Bruno Henrique
Curtir tópico
+ 3Post mais votado
27/04/2016
Natanael Ferreira
Gostei + 1
Mais Posts
28/04/2016
Bruno Henrique
Abaixo o código
procedure TForm2.Button1Click(Sender: TObject);
var
i:integer;
baixa: double;
somatoria: double;
valorparcela: double;
valorrecebido: double;
restante: double;
count: integer;
begin
somatoria := StrToFloat(Edit1.Text);
valorparcela:= ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
valorrecebido:= ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat;
restante:= ClientDataSet1.FieldByName('RESTANTE').AsFloat;
ClientDataSet1.DisableControls;
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
begin
begin
ClientDataSet1.Edit;
valorrecebido:= valorparcela;
ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat := ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
ClientDataSet1.FieldByName('RESTANTE').AsFloat := valorrecebido - valorparcela ;
ClientDataSet1.Next;
end;
if (ClientDataSet1.State=dsInsert) or (ClientDataSet1.State=dsEdit) then
ClientDataSet1.Post;
ClientDataSet1.EnableControls;
end;
ClientDataSet1.ApplyUpdates(0);
ClientDataSet1.EmptyDataSet;
end;
end;
end.Gostei + 0
28/04/2016
Bruno Henrique
Abaixo o código
procedure TForm2.Button1Click(Sender: TObject);
var
i:integer;
baixa: double;
somatoria: double;
valorparcela: double;
valorrecebido: double;
restante: double;
count: integer;
begin
somatoria := StrToFloat(Edit1.Text);
valorparcela:= ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
valorrecebido:= ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat;
restante:= ClientDataSet1.FieldByName('RESTANTE').AsFloat;
ClientDataSet1.DisableControls;
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
begin
begin
ClientDataSet1.Edit;
valorrecebido:= valorparcela;
ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat := ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
ClientDataSet1.FieldByName('RESTANTE').AsFloat := valorrecebido - valorparcela ;
ClientDataSet1.Next;
end;
if (ClientDataSet1.State=dsInsert) or (ClientDataSet1.State=dsEdit) then
ClientDataSet1.Post;
ClientDataSet1.EnableControls;
end;
ClientDataSet1.ApplyUpdates(0);
ClientDataSet1.EmptyDataSet;
end;
end;
end.Gostei + 0
28/04/2016
Natanael Ferreira
Teste assim:
procedure TForm2.Button1Click(Sender: TObject);
var
i, count: Integer;
baixa, somatoria, valorparcela, restante: double;
begin
somatoria := StrToFloat(Edit1.Text);
valorparcela := ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
valorrecebido := ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat;
restante := ClientDataSet1.FieldByName('RESTANTE').AsFloat;
ClientDataSet1.DisableControls;
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
ClientDataSet1.Edit;
valorrecebido := valorparcela;
ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat :=
ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
ClientDataSet1.FieldByName('RESTANTE').AsFloat := valorrecebido - valorparcela;
if (ClientDataSet1.State = dsInsert) or (ClientDataSet1.State = dsEdit) then
ClientDataSet1.Post;
ClientDataSet1.Next;
end;
ClientDataSet1.EnableControls;
ClientDataSet1.ApplyUpdates(0);
ClientDataSet1.EmptyDataSet;
end;Gostei + 1
28/04/2016
Mateus Ribeiro
Acredito que seu problema esteja por que vc adicionou um monte de BEGIN dentro do laço WHILE e não soube trabalhar da forma correta nele.
Tentei ajustar aqui seu código e acredito que seja a solução. Outra coisa, eu comentei a linha "ClientDataSet1.EmptyDataSet;" porque sinceramente não faz o menor sentido, por que vc limparia o ClientDataSet1 logo após salvar uma alteração nele?! rs
Tenta aí e veja se dá certo:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
baixa: double;
somatoria: double;
valorparcela: double;
valorrecebido: double;
restante: double;
count: integer;
begin
somatoria := StrToFloat(Edit1.Text);
valorparcela:= ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
valorrecebido:= ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat;
restante:= ClientDataSet1.FieldByName('RESTANTE').AsFloat;
ClientDataSet1.DisableControls;
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
ClientDataSet1.Edit;
valorrecebido:= valorparcela;
ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat := ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
ClientDataSet1.FieldByName('RESTANTE').AsFloat := valorrecebido - valorparcela;
if (ClientDataSet1.State=dsInsert) or (ClientDataSet1.State=dsEdit) then
ClientDataSet1.Post;
ClientDataSet1.Next;
end;
ClientDataSet1.EnableControls;
ClientDataSet1.ApplyUpdates(0);
//ClientDataSet1.EmptyDataSet;
end;
end.
Gostei + 0
28/04/2016
Bruno Henrique
Essa bagunça sou por que sou iniciante e estou estudando sozinho com ajuda de materiais na internet e no forum, e com a colaboração de vocês!!!
Vou fazer as mudanças aqui e volto a postar se deu certo!!!
E vou precisar da ajuda de vocês para fazer baixa parcial nem sei por onde começar!!!Se vocês ir puder me ajudar!!!Ficarei muito feliz
Obrigado por enquanto
Gostei + 0
28/04/2016
Bruno Henrique
Mais ainda preciso ajustar uma coisa, quando trago os dados no dbgrid ele baixa todos os dados apresentados no dbgrid, como faço para baixar apenas o que eu der duplo clique em cima????
Mateusin, o //ClientDataSet1.EmptyDataSet; é para limpar os dados do dbgrid depois que baixar pq ele fica aparecendo no dbgrid!!!
Gostei + 0
28/04/2016
Araujo Junior.
Gostei + 0
28/04/2016
Bruno Henrique
Vcs saberiam me dizer como faço para eu baixar apenas as linhas que eu der duplo click
Gostei + 0
29/04/2016
Araujo Junior.
Como voce disse que é iniciante, vou te dar uma dica procure reaproveitar seu código, atraves de funções ou procedimentos. Alterei seu código para que tenhamos um procedimento chamado BaixarContaSelecionada a ser chamado a partir de 2 pontos: O Loop do botão que realiza todas as baixas e da ação de duplo click do Grid.
Segue código alterado
procedure TForm1.BaixarContaSelecionada;
begin
ClientDataSet1.Edit;
valorrecebido:= valorparcela;
ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat := ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
ClientDataSet1.FieldByName('RESTANTE').AsFloat := valorrecebido - valorparcela;
if (ClientDataSet1.State=dsInsert) or (ClientDataSet1.State=dsEdit) then
ClientDataSet1.Post;
end;
Mudar o código de seu botão para o código abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
baixa: double;
somatoria: double;
valorparcela: double;
valorrecebido: double;
restante: double;
count: integer;
begin
somatoria := StrToFloat(Edit1.Text);
valorparcela:= ClientDataSet1.FieldByName('VALOR_PARCELA').AsFloat;
valorrecebido:= ClientDataSet1.FieldByName('VALORRECEBIDO').AsFloat;
restante:= ClientDataSet1.FieldByName('RESTANTE').AsFloat;
ClientDataSet1.DisableControls;
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
BaixarContaSelecionada;
ClientDataSet1.Next;
end;
ClientDataSet1.EnableControls;
ClientDataSet1.ApplyUpdates(0);
ClientDataSet1.Close;
end;
Incluir esse código no Evento onDblClick do Grid
procedure TForm1.DBGrid1DblClick(Sender: TObject); begin BaixarContaSelecionada; end;
Gostei + 0
29/04/2016
Bruno Henrique
Implementei o código aqui para o que você me passou ele está fazendo as baixas porém ele está baixando todas as parcelas ainda, não somente as que eu dou duplo click.
Preciso assim
Codigo Parcela Vencimento Valor
30 1° 12/04/2016 30,00
30 2° 16/04/2016 30,00
30 3° 12/06/2016 30,00
40 1° 20/04/2016 55,00
40 2° 20/05/2016 55,00
40 3° 20/06/2016 55,00
Quando eu der duplo click na parcela 1° com vencimento 12/04/2016 no valor de 30,00 e der duplo click na parcela numero 2° com vencimento 16/04/2016 no valor de 30,00 e der duplo click na parcela 1° com vencimento em 20/04/2016 no valor de 55,00 baixasse essas 3 parcelas que eu desse duplo click e ai me restaria as parcelas no dbgrid a 2° e 3° com vencimento em 12/06/2016 e com vencimento em 20/05/2016 e 20/06/2016 que foi as que eu não dei duplo click.
Como fazer isso em?
Gostei + 0
29/04/2016
Araujo Junior.
Gostei + 0
29/04/2016
Bruno Henrique
Deu certo , eu coloquei esse código
if (DBGrid1.SelectedRows.Count > 1)then
Agora como eu posso fazer a baixa parcial dessas parcelas?
Gostei + 0
29/04/2016
Araujo Junior.
Como voce esta trabalhando com clientdataset pode criar um campo de memoria em FieldDefs informando o valor da baixa e na sua rotina de baixa fazer a leitura desse campo. Lembre de deixar essa coluna no grid como editavel.
Valeu
Gostei + 0
30/04/2016
Bruno Henrique
Teria como eu informar o valor no edit e quando fazer o while ele vai abatendo na parcela?
Gostei + 0
04/05/2016
Bruno Henrique
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)