Função Condição Pagamento

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jerry-sc
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Ter, 01 Nov 2011 1:24 pm

Bom dia Pessoal,

Tenho uma estrutura de tabela, que grava as condições de pagamento:
DESCRIÇÃO | PARCELAS | DIAS INICIO | INTERVALO
30/60/90 | 3 | 30 | 30

Eu queria fazer uma função, que calculasse (baseado em uma data pré-definida, por exemplo 03/11/2017) os dias de início (primeira parcela), e incrementasse o dias intervalo (conforme a quantidade de parcelas).

Alguém tem alguma noção de como fazer isso?

Obrigado!
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

bom dia jerry,

Veja se assim ajuda alguma coisa, fiz um teste simples e parece certo:

Selecionar tudo

set serverout on size 1000000
declare
 cursor c is
   Select '30/60/90' DESCRICAO, 
          3 PARCELAS, 
          30 DIAS_INICIO, 
          30 INTERVALO 
  from dual;
 c_r c%rowtype;
 --
 v_valor number(12,2) := 13000;
 v_emissao date := trunc(sysdate);
 v_vencimento date;
 v_parcela number(12,2);
 v_parcela_final number(12,2);
 v_num_parcela number := 1;
 --
Begin
 open c;
  fetch c into c_r;
   if c%found then
      v_parcela := trunc(v_valor/c_r.parcelas);
      v_parcela_final := v_parcela + (v_valor - v_parcela * c_r.parcelas);
      --
      while v_num_parcela <= c_r.parcelas loop
       --
       if v_num_parcela = 1 then 
          v_vencimento := v_emissao + c_r.dias_inicio;
       else
          v_vencimento := v_vencimento + c_r.intervalo;
       end if;
       --
       if v_num_parcela = c_r.parcelas then
          dbms_output.put_line('Parcela '||to_char(v_num_parcela)||' vencimento '||to_Char(v_vencimento,'dd/mm/yyyy')||' valor '||to_char(v_parcela_final));
       else
          dbms_output.put_line('Parcela '||to_char(v_num_parcela)||' vencimento '||to_Char(v_vencimento,'dd/mm/yyyy')||' valor '||to_char(v_parcela));
       end if;
       --
       v_num_parcela := v_num_parcela + 1;
      end loop;
   end if;
 close c;
end;
/
Editado pela última vez por DanielNN em Ter, 07 Nov 2017 8:03 am, em um total de 1 vez.
Razão: Falta da TAG [CODE]
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Opa,

fiz a consulta aqui (onde você pode criar uma função depois, ou ficar dentro do LOOP da consulta das condições) que traz os resultados das datas de vencimento considerando:
-uma certa data(:DATA_PREDEFINIDA)
-mais a quantidade de dias para a primeira parcela(:DIAS_PARA_INICIO)
-aí as próximas parcelas(:PARCELAS) seguirão a quantidade de dias de intervalo(:INTERVALO).

Selecionar tudo

SELECT x.dia DIA_VENCIMENTO
  FROM (SELECT data_inicial + (:INTERVALO * (:PARCELAS - LEVEL)) dia
          FROM (SELECT trunc(to_date(:DATA_PREDEFINIDA, 'dd/mm/rrrr')) + :DIAS_PARA_INICIO AS data_inicial FROM dual)
        CONNECT BY LEVEL <= :PARCELAS) x
ORDER BY x.dia;
Responder
  • Informação