Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas ao gerar parcela


nicolasbraz

Pergunta

No meu formulário de contas a pagar eu coloquei um TDBCombobox para neles o cliente poder escolher o tipo de vencimento da conta que são: Mensal, Quinzenal.

O problema está sendo para gerar a parcela mensal eu fiz uma formula mas que nela ela suma de 30 em 30 dias mas existem meses que tem 31 dias então a parcela cairia um dia.

Ex :

Junho .: 10/06/10

Julho .: 10/07/10

Agosto .: 09/08/10

Setembro .: 08/09/10

Outubro .: 08/09/10

O meu código para gerar a parcela é.

procedure TFrmContasPagar.Button2Click(Sender: TObject);
var parcela,resposta,i:integer;
    fornecedor,referencia,documento,portador,observacao:string;
    valorconta,jurosN,multaN,juros,multa:real;
    dataconta, datavenc:Tdatetime;
begin
      resposta := 0;
      if (dmdados.IbContasPagar.State in [dsinsert] ) then
       begin
          showmessage ('Salve os dados antes para gerar as parcelas');
          abort;
       end
       else
         resposta := Application.MessageBox('Deseja gerar as parcelas dessa conta ?','Confirma?',4);
       if resposta = 6 then
       begin
         dmdados.IbContasPagar.Edit;

         if Trim(DbParcela.Text) = '' then
           begin
              showmessage ('Informe a quantidade de parcelas.');
              DbParcela.SetFocus;
              abort;
           end;
         if trim (CbParcela.Text) = '' then
          begin
            showmessage ('Informe o tipo de vencimento das parcelas.');
            CbParcela.SetFocus;
            abort;
          end;
        i := 1;

        dataconta  := dmdados.IbContasPagarPAGAR_DATACONTA.Value;
        referencia := dmdados.IbContasPagarPAGAR_REFERENTE.Value;
        fornecedor := dmdados.IbContasPagarPAGAR_FORNECEDORNOME.Value;
        documento  := dmdados.IbContasPagarPAGAR_DOCUMENTO.Value;
        valorconta := dmdados.IbContasPagarPAGAR_VALORCONTA.Value;
        datavenc   := dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value;
        jurosN     := dmdados.IbContasPagarPAGAR_JUROSNUMERO.Value;
        multaN     := dmdados.IbContasPagarPAGAR_MULTANUMERO.Value;
        juros      := dmdados.IbContasPagarPAGAR_JUROS.Value;
        multa      := dmdados.IbContasPagarPAGAR_MULTA.Value;
        portador   := dmdados.IbContasPagarPAGAR_PORTADOR.Value;
        observacao := dmdados.IbContasPagarPAGAR_OBSERVACAO.Value;

        parcela    := dmdados.IbContasPagarPAGAR_QUANTPARCELA.Value;

        dmdados.Ibcontaspagar.post;

        while i <= parcela do
        begin
          dmdados.ibContaspagar.insert;

          dmdados.IbContasPagarPAGAR_DATACONTA.Value      := dataconta;
          dmdados.IbContasPagarPAGAR_REFERENTE.Value      := referencia;
          dmdados.IbContasPagarPAGAR_FORNECEDORNOME.value := fornecedor;
          dmdados.IbContasPagarPAGAR_DOCUMENTO.Value      := documento;
       //   dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value := (date + ((i-1)*30));
          dmdados.IbContasPagarPAGAR_VALORCONTA.value     := valorconta;
          dmdados.IbContasPagarPAGAR_JUROSNUMERO.Value    := jurosN;
          dmdados.IbContasPagarPAGAR_MULTANUMERO.Value    := MultaN;
          dmdados.IbContasPagarPAGAR_JUROS.Value          := juros;
          dmdados.IbContasPagarPAGAR_MULTA.Value          := multa;
          dmdados.IbContasPagarPAGAR_PORTADOR.Value       := portador;
          dmdados.IbContasPagarPAGAR_OBSERVACAO.value     := observacao;

          if  CbParcela.Items.Text = 'MENSAL' then
              begin
                dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value := datavenc + (i-1 * 30);
                showmessage('Foi uma Parcela mensal');
              end
              else
                begin
                  dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value := datavenc + (i-1 * 15);
                  showmessage('Foi uma Parcela mensal');
                end;
                dmdados.IbContasPagar.Post;
                showmessage ('Parcela gerada');
                inc (i);
     end;
  end;

   DbDataConta.Enabled:=false;
   DbReferente.Enabled:=false;
   DbNomeFornecedor.Enabled:=false;
   DbDocumento.Enabled:=false;
   DbDataVencimento.Enabled:=false;
   DbValorConta.Enabled:=false;
   DbParcela.Enabled:=false;
   CbParcela.Enabled:=false;
   DbJuros.Enabled:=false;
   DbMulta.Enabled:=false;
   DbJurosNumero.Enabled:=false;
   DbMultaNumero.Enabled:=false;
   Dbportador.Enabled:=false;
   DbObservacao.Enabled:=false;
end;

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
O problema está sendo para gerar a parcela mensal eu fiz uma formula mas que nela ela suma de 30 em 30 dias mas existem meses que tem 31 dias então a parcela cairia um dia.

Ex :

Junho .: 10/06/10

Julho .: 10/07/10

Agosto .: 09/08/10

Setembro .: 08/09/10

Outubro .: 08/09/10

Faça uma adaptação ao seu código

Function ProximoDiaUtil (dData : TDateTime) : TDateTime;
begin
   if DayOfWeek(dData) = 7 then
      dData := dData + 2
   else
   if DayOfWeek(dData) = 1 then
      dData := dData + 1;
   ProximoDiaUtil := dData;
end;


procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
   Memo1.Clear;
   for i := 1 to 12 do
     begin
        Memo1.Lines.Append('Data da parcela ' + inttostr(i) + ' em  ' +  datetostr(ProximoDiaUtil(DateTimePicker1.date)));
        DateTimePicker1.date := DateTimePicker1.date + 30;
     end;

end;

resultado das datas das parcelas será sempre em um dia útl

Data da parcela 1 em 10/06/2010

Data da parcela 2 em 12/07/2010

Data da parcela 3 em 09/08/2010

Data da parcela 4 em 08/09/2010

Data da parcela 5 em 08/10/2010

Data da parcela 6 em 08/11/2010

Data da parcela 7 em 07/12/2010

Data da parcela 8 em 06/01/2011

Data da parcela 9 em 07/02/2011

Data da parcela 10 em 07/03/2011

Data da parcela 11 em 06/04/2011

Data da parcela 12 em 06/05/2011

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas foi apresentada a solução para o meu cliente mas ele realmente quer que as parcelas sejam geradas no mesmo dia em todo mesmo.

Obs .: Achei muito interessante esse método porque ele mostra o real dia de vencimento da parcela.

Exemplo .:

1º 10/02

2º 10/03

3º 10/04

4º 10/05

5º 10/06

6º 10/07

Link para o comentário
Compartilhar em outros sites

  • 0
Jhonas foi apresentada a solução para o meu cliente mas ele realmente quer que as parcelas sejam geradas no mesmo dia em todo mes.

nicolasbras ... bastaria fazer essa simples modificação

var
  Form1: TForm1;
  dia : integer = 0;

implementation

{$R *.DFM}

Function ProximoDiaUtil (dData : TDateTime) : TDateTime;
var diap : integer;
begin

   if DayOfWeek(dData) = 7 then
      dData := dData + 2
   else
   if DayOfWeek(dData) = 1 then
      dData := dData + 1;

   if (DayOfWeek(dData) > 1) and (DayOfWeek(dData) < 7 ) then
      begin
         diap := strtoint(copy(datetostr(dData),1,2));
         if diap < dia then
            ProximoDiaUtil := dData + (dia - diap)
         else
            ProximoDiaUtil := dData;
      end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
   Memo1.Clear;
   dia := strtoint(copy(datetostr(DateTimePicker1.date),1,2));
   for i := 1 to 12 do
     begin
        Memo1.Lines.Append('Data da parcela ' + inttostr(i) + ' em  ' +  datetostr(ProximoDiaUtil(DateTimePicker1.date)));
        DateTimePicker1.date := DateTimePicker1.date + 30;
     end;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Usei o IncMonth.

procedure TFrmContasPagar.Button2Click(Sender: TObject);
var parcela,resposta,i:integer;
    fornecedor,referencia,documento,portador,observacao:string;
    valorconta,jurosN,multaN,juros,multa:real;
    dataconta, datavenc:Tdatetime;
begin
      resposta := 0;
      if (dmdados.IbContasPagar.State in [dsinsert] ) then
       begin
          showmessage ('Salve os dados antes para gerar as parcelas');
          abort;
       end
       else
         resposta := Application.MessageBox('Deseja gerar as parcelas dessa conta ?','Confirma?',4);
       if resposta = 6 then
       begin
         dmdados.IbContasPagar.Edit;

         if Trim(DbParcela.Text) = '' then
           begin
              showmessage ('Informe a quantidade de parcelas.');
              DbParcela.SetFocus;
              abort;
           end;

        i := 1;

        dataconta  := dmdados.IbContasPagarPAGAR_DATACONTA.Value;
        referencia := dmdados.IbContasPagarPAGAR_REFERENTE.Value;
        fornecedor := dmdados.IbContasPagarPAGAR_FORNECEDORNOME.Value;
        documento  := dmdados.IbContasPagarPAGAR_DOCUMENTO.Value;
        valorconta := dmdados.IbContasPagarPAGAR_VALORCONTA.Value;
        datavenc   := dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value;
        jurosN     := dmdados.IbContasPagarPAGAR_JUROSNUMERO.Value;
        multaN     := dmdados.IbContasPagarPAGAR_MULTANUMERO.Value;
        juros      := dmdados.IbContasPagarPAGAR_JUROS.Value;
        multa      := dmdados.IbContasPagarPAGAR_MULTA.Value;
        portador   := dmdados.IbContasPagarPAGAR_PORTADOR.Value;
        observacao := dmdados.IbContasPagarPAGAR_OBSERVACAO.Value;
        parcela    := dmdados.IbContasPagarPAGAR_QUANTPARCELA.Value;

        dmdados.Ibcontaspagar.post;

        while i <= parcela do
        begin
          dmdados.ibContaspagar.insert;

          dmdados.IbContasPagarPAGAR_DATACONTA.Value      := dataconta;
          dmdados.IbContasPagarPAGAR_REFERENTE.Value      := referencia;
          dmdados.IbContasPagarPAGAR_FORNECEDORNOME.value := fornecedor;
          dmdados.IbContasPagarPAGAR_DOCUMENTO.Value      := documento;
          dmdados.IbContasPagarPAGAR_VALORCONTA.value     := valorconta;
          dmdados.IbContasPagarPAGAR_JUROSNUMERO.Value    := jurosN;
          dmdados.IbContasPagarPAGAR_MULTANUMERO.Value    := MultaN;
          dmdados.IbContasPagarPAGAR_JUROS.Value          := juros;
          dmdados.IbContasPagarPAGAR_MULTA.Value          := multa;
          dmdados.IbContasPagarPAGAR_PORTADOR.Value       := portador;
          dmdados.IbContasPagarPAGAR_OBSERVACAO.value     := observacao;


          dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value := incMonth(datavenc,(1));
          datavenc := dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value;

          dmdados.IbContasPagar.Post;

          showmessage ('Parcela gerada');

          Inc(i);
     end;
A unica coisa que falta para eu acabar o contas a pagar seria na hora de gerar a parcela ela adicionar letras ao final do documento. Exemplo .: 1º 300 2º 300-a 3º 300-b 4º 300-c 5º 300-d Fui aconselhando a usar uma const, que seria essa.
const ALFA = 'ABCDEFGHIJKLMNOPQRSTUVWXZ'; 
var i : integer; 
      sParcela : string; 
begin 
  for i := 1 to 25 do 
    sParcela := sParcela + ALFA[i]; 
end;

A minha ídeia é colocar essa const dentro da minha Unit Biblioteca mas eu devo cria-la como procedure ou como Function ? e em qual parte do meu código de gerar parcela ela deve ser colocada ?

Link para o comentário
Compartilhar em outros sites

  • 0
para eu acabar o contas a pagar seria na hora de gerar a parcela ela adicionar letras ao final do documento.

Veja a mudança no código

procedure TFrmContasPagar.Button2Click(Sender: TObject);

const ALFA = 'ABCDEFGHIJKLMNOPQRSTUVWXZ'; 

var parcela,resposta,i:integer;
    fornecedor,referencia,documento,portador,observacao:string;
    valorconta,jurosN,multaN,juros,multa:real;
    dataconta, datavenc:Tdatetime;
begin
      resposta := 0;
      if (dmdados.IbContasPagar.State in [dsinsert] ) then
       begin
          showmessage ('Salve os dados antes para gerar as parcelas');
          abort;
       end
       else
         resposta := Application.MessageBox('Deseja gerar as parcelas dessa conta ?','Confirma?',4);
       if resposta = 6 then
       begin
         dmdados.IbContasPagar.Edit;

         if Trim(DbParcela.Text) = '' then
           begin
              showmessage ('Informe a quantidade de parcelas.');
              DbParcela.SetFocus;
              abort;
           end;

        i := 1;

        dataconta  := dmdados.IbContasPagarPAGAR_DATACONTA.Value;
        referencia := dmdados.IbContasPagarPAGAR_REFERENTE.Value;
        fornecedor := dmdados.IbContasPagarPAGAR_FORNECEDORNOME.Value;
        documento  := dmdados.IbContasPagarPAGAR_DOCUMENTO.Value;
        valorconta := dmdados.IbContasPagarPAGAR_VALORCONTA.Value;
        datavenc   := dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value;
        jurosN     := dmdados.IbContasPagarPAGAR_JUROSNUMERO.Value;
        multaN     := dmdados.IbContasPagarPAGAR_MULTANUMERO.Value;
        juros      := dmdados.IbContasPagarPAGAR_JUROS.Value;
        multa      := dmdados.IbContasPagarPAGAR_MULTA.Value;
        portador   := dmdados.IbContasPagarPAGAR_PORTADOR.Value;
        observacao := dmdados.IbContasPagarPAGAR_OBSERVACAO.Value;
        parcela    := dmdados.IbContasPagarPAGAR_QUANTPARCELA.Value;

        dmdados.Ibcontaspagar.post;

        while i <= parcela do
        begin
          dmdados.ibContaspagar.insert;

          dmdados.IbContasPagarPAGAR_DATACONTA.Value      := dataconta;
          dmdados.IbContasPagarPAGAR_REFERENTE.Value      := referencia;
          dmdados.IbContasPagarPAGAR_FORNECEDORNOME.value := fornecedor;
          
          documento = documento + '-' + ALFA[i]; 

          dmdados.IbContasPagarPAGAR_DOCUMENTO.Value      := documento;
          dmdados.IbContasPagarPAGAR_VALORCONTA.value     := valorconta;
          dmdados.IbContasPagarPAGAR_JUROSNUMERO.Value    := jurosN;
          dmdados.IbContasPagarPAGAR_MULTANUMERO.Value    := MultaN;
          dmdados.IbContasPagarPAGAR_JUROS.Value          := juros;
          dmdados.IbContasPagarPAGAR_MULTA.Value          := multa;
          dmdados.IbContasPagarPAGAR_PORTADOR.Value       := portador;
          dmdados.IbContasPagarPAGAR_OBSERVACAO.value     := observacao;


          dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value := incMonth(datavenc,(1));
          datavenc := dmdados.IbContasPagarPAGAR_DATAVENCIMENTO.Value;

          dmdados.IbContasPagar.Post;

          showmessage ('Parcela gerada');

          Inc(i);
     end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...