Como Arrumar o Valor Arredondamento no Parcelamento Que Está Parcelando Errado???

Delphi

06/06/2016

Boa noite!!!

Tenho esse código para parcelamento, mais as parcelas do valor líquido estão sendo parceladas com diferença de valor!!!Como no faturamento desse pedido!!!

Valor Bruto: 3700,00
Quantidade de Parcelas: 3
Parcelas Gerada: 1° 1233,33 / 2° 1233,33 / 3° 1233,34 = 3700,00
Juros Aplicado em Percentual foi de 1% = 3700,00 - 1% = 3663,00 / 3 = 3 Parcelas de 1221,00 porém ele está gerando assim

1° Parcela 1220,99
2° Parcela 1220,99
3° Parcela 1221,00
Que é igual a 3662,98

Já olhei o código mais não consigo achar aonde está o erro, se puderem me ajudar.Ficarei muito grato!!!


procedure TFrmCondicaoPagamentoCartao.BtnGerarClick(Sender: TObject);
var
  nValor: currency;
  nDesconto: Currency;
  nValorParcela: Currency;
  nQtdeParcelas: integer;
  dDataPrimeiraParcela: TDate;
  dVencimento: TDate;
  i: integer;
  Parcela, Resto: currency;
  ValorParc: String;
  z: integer;
  x : String;
begin
  nQtdeParcelas:=0;
  nValor := StrToFloat(RetirarPonto(EdtValorCondicaoCartao.Text));
  nQtdeParcelas := StrToInt(EdtQtdParcelas.Text);
  nDesconto:= StrToFloat(RetirarPonto(EdtTaxa.Text));

  dDataPrimeiraParcela := StrToDate(MskDataCondicaoCartao.Text);
  dVencimento := dDataPrimeiraParcela + FrmCadCartoes.CdsCadCartoes.FieldByName('CARTAOPRAZO').AsInteger;
  if dDataPrimeiraParcela = 0 then
    begin
        ShowMessage('Digite uma data válida para a primeira parcela.');
        MskDataCondicaoCartao.SetFocus;
        Exit;
    end;

  CdsCondicaoPagamentoCartao.EmptyDataSet;

  begin
      z := 0;
        While z < StrToInt(EdtQtdParcelas.text) Do
          begin
              z := z + 1;
              //x:= IntToStr(StrToInt(EdtCodigoCondicaoCartao.Text)) + '/';
              x:= EdtBandeiraCondicaoCartao.Text + '/';
          end;
  end;

  Parcela := nValor/nQtdeParcelas;
  Parcela := StrToCurr(RetirarPonto(FormatFloat('#,###.00', Parcela)));
  Resto := nValor - (Parcela*nQtdeParcelas);
  for i := 1 to nQtdeParcelas do
    begin
      ValorParc := CurrToStr(Parcela);
        if I < nQtdeParcelas then
            begin
                ValorParc := FloatToStr(Parcela);
                CdsCondicaoPagamentoCartao.Append;
                CdsCondicaoPagamentoCartao.FieldByName('BANDEIRA').AsString := x + IntToStr(i);
                CdsCondicaoPagamentoCartao.FieldByName('DATA').AsDateTime := dVencimento;
                CdsCondicaoPagamentoCartao.FieldByName('VALOR').AsFloat := Parcela;
                CdsCondicaoPagamentoCartao.FieldByName('VALORLIQUIDO').AsFloat := StrToCurr(ValorParc) - (StrToCurr(ValorParc) * (nDesconto / 100));
                CdsCondicaoPagamentoCartao.FieldByName('CODIGOCLIENTE').AsInteger := StrToInt(EdtCodigoClienteCartao.Text);
                CdsCondicaoPagamentoCartao.FieldByName('NOMECLIENTE').AsString := EdtNomeClienteCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('NOMECARTAO').AsString := EdtNomeCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('CODIGOCONDICAO').AsInteger := StrToInt(EdtCodigoCondicaoCartao.Text);
                CdsCondicaoPagamentoCartao.FieldByName('NOMECONDICAO').AsString := EdtNomeCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('NUMEROCARTAO').AsString := MskNumeroCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('DOCUMENTO').AsString := EdtDocumentoCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('AUTORIZACAO').AsString := EdtAutorizacaoCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('DESCONTO').AsString := EdtTaxa.Text;
                CdsCondicaoPagamentoCartao.FieldByName('TIPO').AsString := EdtTipo.Text;
                CdsCondicaoPagamentoCartao.Post;
                CdsCondicaoPagamentoCartao.Next;
                dVencimento := IncMonth(dVencimento)
            end
        else
            begin
                Parcela := Parcela + Resto;
                CdsCondicaoPagamentoCartao.Append;
                CdsCondicaoPagamentoCartao.FieldByName('BANDEIRA').AsString := x + IntToStr(i);
                CdsCondicaoPagamentoCartao.FieldByName('DATA').AsDateTime := dVencimento;
                CdsCondicaoPagamentoCartao.FieldByName('VALOR').AsFloat := Parcela;
                CdsCondicaoPagamentoCartao.FieldByName('VALORLIQUIDO').AsFloat := Parcela - (Parcela * (nDesconto / 100));
                CdsCondicaoPagamentoCartao.FieldByName('CODIGOCLIENTE').AsInteger := StrToInt(EdtCodigoClienteCartao.Text);
                CdsCondicaoPagamentoCartao.FieldByName('NOMECLIENTE').AsString := EdtNomeClienteCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('NOMECARTAO').AsString := EdtNomeCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('CODIGOCONDICAO').AsInteger := StrToInt(EdtCodigoCondicaoCartao.Text);
                CdsCondicaoPagamentoCartao.FieldByName('NOMECONDICAO').AsString := EdtNomeCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('NUMEROCARTAO').AsString := MskNumeroCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('DOCUMENTO').AsString := EdtDocumentoCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('AUTORIZACAO').AsString := EdtAutorizacaoCondicaoCartao.Text;
                CdsCondicaoPagamentoCartao.FieldByName('DESCONTO').AsString := EdtTaxa.Text;
                CdsCondicaoPagamentoCartao.FieldByName('TIPO').AsString := EdtTipo.Text;
                CdsCondicaoPagamentoCartao.Post;
                CdsCondicaoPagamentoCartao.Next;
                dVencimento := IncMonth(dVencimento)
            end;
    end;
 CdsCondicaoPagamentoCartao.First;
end;
Bruno Henrique

Bruno Henrique

Curtidas 0

Respostas

Rafael Bosco

Rafael Bosco

06/06/2016

    RoundTo(ValorParcela, -2);
GOSTEI 0
Everton Santos

Everton Santos

06/06/2016

tente fazer assim

exemplo

var
wValorTotal : Real;
wValorParcela : Real;
wResto : Real;
wQtdeParcelas : Integer;
wPercentual : Real;
begin
wValorTotal := 3700; // SEU VALOR
wPercentual : 1; // SEU PERCENTUAL A DIMINUIR
wQtdeParcelas := 3; // QTDE PARCELAS A DIVIDIR
// APLICANDO O DESCONTO EM PERCENTUAL %
wValorTotal := Format('%14.2f',[wValorTotal - (wValorTotal * wPercentual/100)]);
// DIVIDINDO
wValorParcela := Format('%14.2f',[wValorTotal / wQtdeParcelas]);
wResto := wValorTotal - (wValorParcela * wQtdeParcelas);
// AI ENTRA NO LOOP E QUANDO ESTIVER GERANDO A ULTIMA PARCELA
wValorParcela := wValorParcela - wResto
end;
GOSTEI 0
Bruno Henrique

Bruno Henrique

06/06/2016

Pessoal, boa tarde!!!

Consegui aqui!!! Muito obrigado a todos
GOSTEI 0
POSTAR