Fórum Laço For Como Fazer #552543

27/04/2016

0

Bom dia!!!

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

Bruno Henrique

Responder

Post mais votado

27/04/2016

Se puder, poste o seu laço para analisarmos.

Natanael Ferreira

Natanael Ferreira
Responder

Gostei + 1

Mais Posts

28/04/2016

Bruno Henrique

Natanael, bom dia!!!

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

Gostei + 0

28/04/2016

Bruno Henrique

Natanael, bom dia!!!

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

Gostei + 0

28/04/2016

Natanael Ferreira

Analisando o seu código, o seu comando Post está fora do While (Laço) por isso ele só baixa uma parcela.

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

Gostei + 1

28/04/2016

Mateus Ribeiro

Bom dia! Cara que bagunça esse seu código hein?! rs
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.
Responder

Gostei + 0

28/04/2016

Bruno Henrique

Gente, muito obrigado por me ajudar!!!

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
Responder

Gostei + 0

28/04/2016

Bruno Henrique

Genteeeee....Deu certo!!!!Estou muito feliz isso é uma realização para mim!!!


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

Gostei + 0

28/04/2016

Araujo Junior.

Pode usar ClienteDataSet1.Close tambem.
Responder

Gostei + 0

28/04/2016

Bruno Henrique

Hummmm....Novidades para mim!!!

Vcs saberiam me dizer como faço para eu baixar apenas as linhas que eu der duplo click
Responder

Gostei + 0

29/04/2016

Araujo Junior.

Bruno,

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

Gostei + 0

29/04/2016

Bruno Henrique

Adriano, boa tarde!!!

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

Gostei + 0

29/04/2016

Araujo Junior.

Bruno a logica é essa mesmo, recomendo voce realizar um debug de seu procedimento e verificar qual o codigo da parcela esta esta sendo baixada no evento BaixarParcelaSelecionada. o DBGrid, modifica a posição do cursor dentro do DataSet entao não teria problemas.
Responder

Gostei + 0

29/04/2016

Bruno Henrique

Adriano, boa tarde!!!

Deu certo , eu coloquei esse código
if (DBGrid1.SelectedRows.Count > 1)then
antes do while e funcionou!!!

Agora como eu posso fazer a baixa parcial dessas parcelas?
Responder

Gostei + 0

29/04/2016

Araujo Junior.

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

Gostei + 0

30/04/2016

Bruno Henrique

Bom dia!!!

Teria como eu informar o valor no edit e quando fazer o while ele vai abatendo na parcela?
Responder

Gostei + 0

04/05/2016

Bruno Henrique

Alguma solução!!! Não consigo achar uma solução por ser iniciante!!!
Responder

Gostei + 0

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

Aceitar