parcelamento usando delphi 2010 e banco mysql
27/07/2018
0
Adriano
Post mais votado
30/07/2018
edit1 contém o número de parcelas
edit2 contém o valor total
nNumParc - variável com o número de parcelas, em integer
nValorTotal - variável que guardará o valor total, em float
nValorParcela - variável que guardará o valor de cada parcela, em float
nValorAjuste - parcela de ajuste, em float, para o caso de valores quebrados, como no caso de R$ 100 em 3 parcelas
nNumParc := StrToInt( Edit.Text ); // numero de parcelas nValorTotal := Round( StrToFloat( Edit2.Text ), 2 ); // valor total nValorParcela := Round( nValorTotal / nNumParc, 2 ); // valor da parcela, arredondado nValorAjuste := Round( nValorTotal - (nValorParcela * (nNumParc - 1)), 2 ); // valor de ajuste, arredondado (será sempre a 1a parcela) dDataVencto := Date; for i := 1 to nNumParc do begin if dm.tb_parcela.State in [dsinsert, dsEdit] then dm.tb_parcela.CancelUpdates(); dm.Tb_parcela.Insert; dm.Tb_parcela.FieldByName('quant_parc').Value := nNumParc; // ??? dm.Tb_parcela.FieldByName('valor_parc').Value := i; // ???? aqui não deveria ser o valor da parcela? dm.Tb_parcela.FieldByName('venc_parc').Value := dDataVencto; if i = 1 dm.Tb_parcela.FieldByName('total_parc').Value := nValorAjuste // ??? total_parc recebe o valor da parcela? else dm.Tb_parcela.FieldByName('total_parc').Value := nValorParcela; // ??? total_parc recebe o valor da parcela? dm.Tb_parcela.Post; dDataVencto := dDataVencto + 30; end;
vi que você usa DBEdits. os DBEdits não podem estar ligados no mesmo dataset de parcelas onde você está incluindo registros. por isso que o meu exemplo usa edits. outra coisa:
em dm.Tb_parcela.FieldByName('venc_parc').Value:= incMonth( Date, i * 30) você deve usar somente i, e não i * 30, porque do jeito que você fez, você está acescentando 30 meses, depois 60 meses, e depois 90 meses.
Emerson Nascimento
Mais Posts
27/07/2018
Emerson Nascimento
27/07/2018
Adriano
var i:integer;
begin
dm.Tb_parcela.open;
i := i + 1;
for i := 1 to StrToInt (DBEdit1.Text) do
begin
if dm.tb_parcela.State in [dsinsert] then
// dm.tb_parcela.Insert
else
dm.Tb_parcela.Edit;
dm.Tb_parcela.FieldByName('quant_parc').Value:= (DBEdit1.Text);
dm.Tb_parcela.FieldByName('valor_parc').Value:= i;
dm.Tb_parcela.FieldByName('total_parc').Value :=(StrToFloat(DBEdit2.Text)/StrToInt(DBEdit1.Text));
dm.Tb_parcela.FieldByName('venc_parc').Value:= incMonth( Date, i * 30);
dm.Tb_parcela.Post;
dm.Tb_parcela.Next;
//dm.Tb_parcela.ApplyUpdates();
showmessage('Arquivo incuido com sucesso');
end;
27/07/2018
Adriano
procedure Tform_teste.btn_gerarClick(Sender: TObject);
var i:integer;
begin
DBEdit3Exit (sender);
dm.Sql_parcela.EmptyDataSet;
for I := 1 to StrToInt(DBEdit1.Text) do
begin
Dm.Sql_parcela.Insert;
dm.Sql_parcelaquant_parc.AsInteger := i;
dm.Sql_parcelavalor_parc.AsCurrency := StrToInt(DBEdit2.Text) / StrToInt(DBEdit1.Text);
dm.Sql_parcelavenc_parc.AsDateTime := StrToDate(DBEdit3.Text) + (StrToFloat(DBEdit1.Text) * i);
dm.Sql_parcela.Post;
end;
end;
30/07/2018
Adriano
31/07/2018
Adriano
do edit1 digito 2 parcelas<br />
no edit2 digito o valor 20,00<br />
no edit3 digito o mês que está saindo certo, nessa parte.<br />
ai clico no botão gerar ele gera as parcelas 20 vezes o valor de 10,00 vinte vezes.<br />
e tambem nao ta gravando na minha tabela sql.<br />
o que será que ta acontecendo?
02/08/2018
Adriano
procedure Tform_teste.btn_gerarClick(Sender: TObject);
var i,dias:integer;
begin
Dias:= -0;
for i := 1 to StrToInt (edit1.Text) do
begin
if dm.tb_parcela.State in [dsinsert, dsedit] then
dm.tb_parcela.CancelUpdates();
dm.tb_parcela.insert;
Dias := Dias + 31;
dm.Tb_parcela.FieldByName('quant_parc').Value:= (Edit1.Text);;
dm.Tb_parcela.FieldByName('valor_parc').Value:= (Edit2.Text);
dm.Tb_Parcelavenc_parc.Value:= Date + Dias;
dm.Tb_parcela.FieldByName('total_parc').Value :=(StrToFloat(Edit2.Text)/StrToInt(Edit1.Text));
dm.Tb_parcela.Post;
dm.Tb_parcela.ApplyUpdates();
end;
end;
02/08/2018
Emerson Nascimento
procedure Tform_teste.btn_gerarClick(Sender: TObject); var i,dias:integer; datavenc: tdate; numparc: integer; valorparc: float; begin datavenc := date; numparc := StrToInt(edit1.Text); valorparc := StrToFloat(Edit2.Text); if dm.tb_parcela.State in [dsinsert, dsedit] then dm.tb_parcela.CancelUpdates(); for i := 1 to numparc do begin datavenc := datavenc + 31; dm.tb_parcela.insert; dm.Tb_parcela.FieldByName('quant_parc').AsInteger := numparc; dm.Tb_parcela.FieldByName('valor_parc').AsFloat := valorparc; dm.Tb_Parcelavenc_parc.Value := datavenc; dm.Tb_parcela.FieldByName('total_parc').AsFloat := (valorparc/numparc); dm.Tb_parcela.Post; end; dm.Tb_parcela.ApplyUpdates(); end;
as modificações acima são somente estéticas, exceto o uso do ApplyUpdates() após a inserção de todas as parcelas.
se ainda assim estiver gravando uma parcela a mais, você precisará avaliar os eventos da tabela (no Delphi) e até mesmo o banco de dados, que pode ter algum trigger ou stored procedure gerando o registro a mais....
03/08/2018
Adriano
29/08/2018
Adriano
Clique aqui para fazer login e interagir na Comunidade :)