Fórum Como Arrumar o Valor Arredondamento no Parcelamento Que Está Parcelando Errado??? #555765
06/06/2016
0
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
Curtir tópico
+ 0Posts
07/06/2016
Rafael Bosco
RoundTo(ValorParcela, -2);
Gostei + 0
07/06/2016
Everton Santos
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
07/06/2016
Bruno Henrique
Consegui aqui!!! Muito obrigado a todos
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)