parcelamento usando delphi 2010 e banco mysql

MySQL

Delphi

27/07/2018

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

Curtidas 0

Melhor post

Emerson Nascimento

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

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

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

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;
GOSTEI 0
Adriano

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;
GOSTEI 0
Adriano

Adriano

27/07/2018

Alguém, pode me ajudar nesse problema:?
GOSTEI 0
Adriano

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

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?
GOSTEI 0
Adriano

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;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

27/07/2018

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....
GOSTEI 1
Adriano

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

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
POSTAR