parcelamento usando delphi 2010 e banco mysql

27/07/2018

0

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

Adriano

Responder

Post mais votado

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

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

Emerson Nascimento
Responder

Mais Posts

27/07/2018

Emerson Nascimento

onde está sua dificuldade? criar as parcelas (com seus valores e vencimentos)? gravar as parcelas no banco de dados?
Responder

27/07/2018

Adriano

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

27/07/2018

Adriano

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

29/07/2018

Adriano

Alguém, pode me ajudar nesse problema:?
Responder

30/07/2018

Adriano

Amigo, vou testar aqui, e te aviso se deu certo, de antemão te agradeço pela atenção.
Responder

31/07/2018

Adriano

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

02/08/2018

Adriano

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

02/08/2018

Emerson Nascimento

hum..... difícil saber....

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

03/08/2018

Adriano

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
Responder

29/08/2018

Adriano

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

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

Aceitar