Laço For Como Fazer
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
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
Curtidas 3
Melhor post
Natanael Ferreira
27/04/2016
Se puder, poste o seu laço para analisarmos.
GOSTEI 1
Mais Respostas
Bruno Henrique
27/04/2016
Natanael, bom dia!!!
Abaixo o código
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
Bruno Henrique
27/04/2016
Natanael, bom dia!!!
Abaixo o código
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
Natanael Ferreira
27/04/2016
Analisando o seu código, o seu comando Post está fora do While (Laço) por isso ele só baixa uma parcela.
Teste assim:
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
Mateus Ribeiro
27/04/2016
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:
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
Bruno Henrique
27/04/2016
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
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
Bruno Henrique
27/04/2016
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!!!
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
Araujo Junior.
27/04/2016
Pode usar ClienteDataSet1.Close tambem.
GOSTEI 0
Bruno Henrique
27/04/2016
Hummmm....Novidades para mim!!!
Vcs saberiam me dizer como faço para eu baixar apenas as linhas que eu der duplo click
Vcs saberiam me dizer como faço para eu baixar apenas as linhas que eu der duplo click
GOSTEI 0
Araujo Junior.
27/04/2016
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
Mudar o código de seu botão para o código abaixo:
Incluir esse código no Evento onDblClick do Grid
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
Bruno Henrique
27/04/2016
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?
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
Araujo Junior.
27/04/2016
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.
GOSTEI 0
Bruno Henrique
27/04/2016
Adriano, boa tarde!!!
Deu certo , eu coloquei esse código antes do while e funcionou!!!
Agora como eu posso fazer a baixa parcial dessas parcelas?
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
Araujo Junior.
27/04/2016
É 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
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
Bruno Henrique
27/04/2016
Bom dia!!!
Teria como eu informar o valor no edit e quando fazer o while ele vai abatendo na parcela?
Teria como eu informar o valor no edit e quando fazer o while ele vai abatendo na parcela?
GOSTEI 0
Bruno Henrique
27/04/2016
Alguma solução!!! Não consigo achar uma solução por ser iniciante!!!
GOSTEI 0