Ajuda com Parcelas em Delphi

10/12/2009

3

olá galera .. sou novo aki .. tenhu uma dúvida .. alguém poderia me ajudar ???

estou fazendo programação em Delphi 5 e estou querendo calcular parcelas em uma venda a prazo ...

mas está doando looping infinito na minha programação ... alguém pode me ajudar ???

desde já agradeço !!!

procedure TformVendasBalcao.btnGravarClick(Sender: TObject);
var fltValorTotal: double;
var qtdparcelas, total, totaldividido: real;
var data : String;
var mes, ano: Integer;
var data2 : TDateTime;
var Ano2, Mes2, Dia2: Word;
begin
Begin
data2:= Now; // ou a data que você quer trabalhar o mês
DecodeDate(data2, Ano2, Mes2, Dia2); // essa função "quebra" a data para você
     if rbprazo.Checked then
     begin
     total := dmBaseDados.tblSaidaValorTotal.Asfloat;
     qtdparcelas := StrToFloat(Edtparc.Text);
     totaldividido := total/qtdparcelas;
     mes := Mes2;
     ano := Ano2;
     dmbaseDados.ds_parcelas.DataSet.Open;
while qtdparcelas <> 0 do
begin
data := inttostr (Dia2) + '/' + IntToStr(mes) + '/' + IntToStr(ano);
dmBaseDados.tbl_parcelas.Append;
dmBaseDados.tbl_parcelasValor.AsCurrency := total;
dmBaseDados.tbl_parcelasData.AsDateTime := StrToDateTime(data);
dmBaseDados.tbl_parcelas.Post;
mes := mes + 1;
if (mes = 13) then
begin
mes := 1;
ano := ano + 1;
end;
end;
end;

... depois daki ainda continua uma programação que está correta ... mas suspeito deste While ...

att;

Thiago Bardez
Web Design - Design Gráfico - Programador - Técnico em Informática.
www.studiosdk.nightop.com.br


Responder

Posts

11/12/2009

Wilson Junior

Você esqueceu de colocar dentro do WHILE o código qtdparcelas := qtdparcelas - 1;

Espero ter ajudado.
Responder
muito cuidado com a forma que você está tratando a geração das parcelas.
imagine que a primeira parcela seja para 30 de Janeiro. pelo seu código, a segunda cairá no dia 30 de Fevereiro, que não existe!
o correto é sempre somar 30 dias na data da parcela.
outra coisa: lembre-se que as parcelas devem ser arredondadas para 2 casas decimais e a diferença deve ser colocada na primeira ou na última parcela, a seu critério (eu coloco na primeira).

porque falo que a "difereça deve ser colocada na primeira ou na última parcela"? eis um exemplo...
imagime que o valor total da compra seja de R$ 250,00, a ser pago em três vezes.
fazendo a divisão simples: 250 / 3 = 83,3333333333333 (dízima)
então pegaremos duas casas decimais: 83,33. porém se multiplicarmos 83,33 pelo número de parcelas o total será de R$ 249,99.
por isso é preciso calcular a diferença e acrescentá-la em alguma parcela.
então a primeira parcela será de 83,34 e as outras duas de 83,33, o que dará um total de 250,00.
(note que não há juros no exemplo)

vamos ao código:

procedure TformVendasBalcao.btnGravarClick(Sender: TObject);
var fltValorTotal: double;
var qtdparcelas, total, totaldividido, primeiraparcela: real;
var numparcela: Integer;
var data2 : TDateTime;
begin
  data2 := Now; // ou a data que você quer trabalhar o mês

  if rbprazo.Checked then
  begin
    total := dmBaseDados.tblSaidaValorTotal.Asfloat;
    qtdparcelas := StrToFloat(Edtparc.Text);
    totaldividido := trunc((total / qtdparcelas) * 100) / 100; // garanto duas casas decimais
    primeiraparcela := total - (totaldividido * (qtdparcelas - 1));

    dmbaseDados.ds_parcelas.DataSet.Open;

    for numparcela := 1 to qtdparcelas
    begin
      dmBaseDados.tbl_parcelas.Append;

      if numparcela = 1
        dmBaseDados.tbl_parcelasValor.AsCurrency := primeiraparcela // valor com a possível diferença
      else
        dmBaseDados.tbl_parcelasValor.AsCurrency := totaldividido;

      dmBaseDados.tbl_parcelasData.AsDateTime := data2; // gravo o conteúdo da variável
      dmBaseDados.tbl_parcelas.Post;

      data2 := data2 + 30; // acrescenta 30 dias para a próxima parcela
    end

  end;

  [..]

end;
Responder

06/01/2010

Pjrm1470

Olha, é so um conselho: Todo SQL é poderoso, porque não deixar que o servidor faça os devidos calculos para você?   Como exemplo eu lhe dou uma query em MSSQL: SELECT CAST((TOTAL / PARCELAS) * 100 AS NUMERIC(18,2)) AS CALCULO   FROM SUATABLE   Aproveite do seu SQL deixando sua aplicação com menos trabalho. Assim você economiza memoria e processamento. É so um conselho, não precisa utiliza-lo.   Abraços, pjrm1470.
Responder

28/02/2011

Thiago

obrigado pessoal ...

todas as dicas foram úteis ..

agradeço a atenção de todos.

abraços
Responder