parcelamento usando delphi 2010 e banco mysql
olá, amigos queria que me ajudassem com um projeto que estou fazendo, tenho um formulario de parcelamento , onde tenho os campos, quant de parcelas, valor da parcela, vencimento da parcela e total da parcela, quero criar um evento no botao gerar parcelas, onde automaticamente ele crie as parcelas e mostre num dbgrid, ja vi varios exemplos na net, mais nao consequi fazer com meu projeto.
Adriano
Curtidas 0
Melhor post
Emerson Nascimento
30/07/2018
estou supondo o uso de edits:
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
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.
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.
GOSTEI 2
Mais Respostas
Emerson Nascimento
27/07/2018
onde está sua dificuldade? criar as parcelas (com seus valores e vencimentos)? gravar as parcelas no banco de dados?
GOSTEI 0
Adriano
27/07/2018
olá, seria os dois, o codigo que estou usando, nao mostra as parcelas no dbgrid e nem grava no banco, olha o exemplo que estou usando.
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;
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;
GOSTEI 0
Adriano
27/07/2018
também usei esse exemplo aqui e nao deu certo.
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;
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;
GOSTEI 0
Adriano
27/07/2018
Alguém, pode me ajudar nesse problema:?
GOSTEI 0
Adriano
27/07/2018
Amigo, vou testar aqui, e te aviso se deu certo, de antemão te agradeço pela atenção.
GOSTEI 0
Adriano
27/07/2018
Emerson, fiz como vc me falou, e deu certo, por uma parte, esta dividindo as parcelas, mais está dividindo pela quantidade * o valor que digito no edit, exemplo:<br />
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?
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?
GOSTEI 0
Adriano
27/07/2018
Emerson, com muita luta kk, e muito estudo aqui nos erros de meu projeto eu consegui resolver o caso do parcelamento, ta rodando de boa, o caso agora é que nao hora que gera as parcela , está gerando uma parcela a mais no banco de dados, tipo se eu coloco 2 parcelas ele gera uma terceira, se coloco 3 ele gera uma quarta e assim por diante, queria resolver isso, veja ai o procedimento onde consegui gerar as parcelas.. e me dê uma luz para resolver isso.,
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;
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;
GOSTEI 0
Emerson Nascimento
27/07/2018
hum..... difícil saber....
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....
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....
GOSTEI 1
Adriano
27/07/2018
Emerson, valeu mesmo amigo, esse ultimo código que me mandou, resolveu tudo, mais se houver mais duvidas posso lhe perturbar por aqui né? kk
GOSTEI 0
Adriano
27/07/2018
Boa noite amigos, estou querendo criar um comando para dar baixar nas parcelas pagas dos alunos, pode ser selecionando um aluno no DbGrid, e clicando em botao que vai baixar essa parcela..!!Alguem pode me ajudar, ou me indicar um forma diferente de dar baixa em parcelas.
GOSTEI 0