Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Posting on Qlik Community is temporarily paused for some users. Thank you for patience and we'll update you soon!
cancel
Showing results for 
Search instead for 
Did you mean: 
kkmoraes
Contributor III
Contributor III

Calculo com Intervalo entre datas

Pessoal,

Bom dia!

Gostaria da ajuda de vocês para tentar resolver o seguinte problema:

Estou desenvolvendo uma aplicação que faz a projeção de pagamentos baseado nos valores do Ano/Mês que o usuário selecionar, a parte lógica do cálculo dos pagamentos já está implementada e funcionando bem, fiz essa projeção pensando em pagamentos mensais, porém existem contratos que o pagamento será bimestral, semestral etc, isso me complicou na hora de calcular a quantidade restantes de parcelas para pagamento do contrato (baseado na seleção do usuário)

Exemplo: O usuário deseja realizar a projeção de pagamentos a partir do Ano de 2015 no mês de dezembro, então eu preciso calcular a quantidade de parcelas que já foram pagas até esse período e a partir daí projetar os próximos pagamentos.

Datas a serem utilizadas

Início da amortização :   15/01/2016

Fim da amortização: 15/10/2018 (O fim será sempre o mesmo, a quantidade de parcelas até ele é que irá variar, baseado no Ano/Mês que o usuário escolher)

Cálculo do número de parcelas : No período de 15/01/2016 a 15/10/2018 existem 34 meses. Portanto, número de parcelas de amortização 34.

Um fator complicador, é justamente a forma de pagamento, se é mensal, semestral etc, pois não poderia apenas subtrair o Ano/Mês selecionado do Ano/Mês da primeira amortização para obter a quantidade de parcelas já pagas.

Vocês possuem alguma sugestão?

Preciso descobrir a quantidade de parcelas que já foram pagas para o contrato baseado na data que está sendo projetada - data de inicio da amortização e jogar esse valor para a variável vQtParcelas que irá controlar o loop.

Abaixo deixo o script que contém a forma que estou trabalhando:

Obrigado!

LET NumRowsContrato=NoOfRows('GDP_CONTRATO')-1;

//for dos contratos

FOR i=0 to $(NumRowsContrato) //Faz a iteração para cada contrato

  LET vNuContrato=Peek('GDPCONTR_NU',$(i),'GDP_CONTRATO');

  LET vQtParcelas=Peek('GDPCONTR_QT_PARCELA_AMORT',$(i),'GDP_CONTRATO'); //Quantidade total de parcelas de amortização

  LET vDtAssinatura=peek('GDPCONTR_DT_ASSINATURA', $(i),'GDP_CONTRATO');

  LET vQTSimulacoes=peek('GDP_TOTAL_SIMULACOES', $(i),'GDP_CONTRATO'); //Quantidade total de simulações

  LET vDtIniAmortizacao=Peek('GDPCONTR_DT_INIC_AMORTIZACAO',$(i),'GDP_CONTRATO');  //Data da primeira amortização

  //LET vDtIniSimulacao=peek('GDPCONTR_DT_IMPORT_PLAN', $(i),'GDP_CONTRATO');

  LET vDtIniSimulacao=peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(i),'GDP_CONTRATO'); //Data do inicio da simulação = data da primeira amortização

  LET vPeriodo = Peek('PRDO_CD_AMORTIZACAO', $(i),'GDP_CONTRATO'); //Periodicidade de Pagamento (Diaria, Mensal, Semestral etc)

 

  FOR K=1 to $(vQTSimulacoes) //Verifica quantas simulações devem ser feitas para cada contrato

  LET vAno = YEAR('$(vDtIniSimulacao)');

  LET vMes = NUM(MONTH('$(vDtIniSimulacao)'));

  TMP:

  LOAD VL_DIVIDA resident GDP_IMPORT_PLANH_CONTRATO where CHAVE_CONTRATO = '$(vNuContrato)' and GDPIMPLCON_DT_ANO = '$(vAno)' and GDPIMPLCON_NU_MES = '$(vMes)';

  Let vSaldo = peek('VL_DIVIDA', 0,'TMP');

  drop Table TMP;

  IF ('$(vDtIniSimulacao)' <= '$(vDtIniAmortizacao)') THEN

  LET vQtParcelas = '$(vQtParcelas)';

  ELSE

  LET vQtParcelas = '$(vQtParcelas)'-1;

  ENDIF

   FOR J=1 to $(vQtParcelas) //Projeta o valor para os Ano/Meses posteriores a seleção do usuário

  IF ('$(J)' = 1) THEN

  LET vSaldo = '$(vSaldo)';

  LET vAmortizacao = '$(vSaldo)'/('$(vQtParcelas)'-'$(J)'+1);

  ELSE

  LET vSaldo = '$(vSaldo)'-'$(vAmortizacao)';

  ENDIF;

  LET vQtdMes = 0;

  IF('$(vPeriodo)' = 4) THEN

  LET vQtdMes = 1;

  ELSEIF('$(vPeriodo)' = 5) THEN

  LET vQtdMes = 2;

  ELSEIF('$(vPeriodo)' = 6) THEN

  LET vQtdMes = 3;

  ELSEIF('$(vPeriodo)' = 7) THEN

  LET vQtdMes = 4;

  ELSEIF('$(vPeriodo)' = 😎 THEN

  LET vQtdMes = 6;

  ELSEIF('$(vPeriodo)' = 9) THEN

  LET vQtdMes = 12;

  ELSE

  LET vQtdMes = 0;

  ENDIF

  TABELA_SIMULACAO: //Tabela que armazena os dados da projeção

  LOAD '$(vNuContrato)' as GDPCONTR_NU,

  '$(J)' as GDP_NU_PARCELA,

  '$(vQtParcelas)' as GDP_QT_PARCELAS,

  '$(vDtIniAmortizacao)' as GDP_DT_INI_AMORTIZACAO,

  Num(Year('$(vDtIniSimulacao)')) as GDP_ANO_SIMULACAO,

  Num(Month('$(vDtIniSimulacao)')) as GDP_MES_SIMULACAO,

  Num(Year(AddMonths('$(vDtIniSimulacao)',('$(J)' * '$(vQtdMes)')  -'$(vQtdMes)'))) as GDP_ANO_PROJECAO,

  Num(Month(AddMonths('$(vDtIniSimulacao)',('$(J)' * '$(vQtdMes)')-'$(vQtdMes)'))) as GDP_MES_PROJECAO,

  '$(vSaldo)' as GDP_VL_CONTRATO,

  '$(vAmortizacao)' as GDP_VL_PARCELA,

  '$(vSaldo)' - '$(vAmortizacao)' AS GDP_SALDO_DEVEDOR

  AutoGenerate 1;

  Next;

  LET vDtIniSimulacao = AddMonths('$(vDtIniSimulacao)', $(vQtdMes));

  NEXT;

Next;

STORE TABELA_SIMULACAO into $(CaminhoDest)GDP_CONTRATO_SIMULACAO.qvd (qvd);

Labels (2)
4 Replies
nicolett_yuri
Partner Ambassador/MVP
Partner Ambassador/MVP

O que te indica se é Mensal, Trimestral ou Semestral?

Se houver esse campo com essa informação será apenas mais um IF em sua fórmula:

IF( Flag = 'Mensal', [Quantidade de meses no intervalo],

IF( Flag = 'Trimestral', Round([Quantidade de meses no intervalo] / 3),

IF( Flag = 'Semestral', Round([Quantidade de meses no intervalo] / 6)

))) as QuantidadeParcelas

kkmoraes
Contributor III
Contributor III
Author

Yuri,

O campo vPeriodo utilizado nessa bloco de código abaixo que faz essa validação:

Minha necessidade é contar quantas parcelas foram pagas no intervalo entre o Início da Amortização do Contrato e a Data selecionada pelo usuário, dependendo da forma de pagamento em um ano eu posso ter 1 único pagamento no ano (anual), 2 pagamentos (semestral) etc.

Tentei fazer algo separado para depois adicionar na aplicação, mas não tô tendo muito sucesso

LET vQtdMes = 0;

LET vPeriodo = 4;

IF('$(vPeriodo)' = 4) THEN

  LET vQtdMes = 1;

  ELSEIF('$(vPeriodo)' = 5) THEN

  LET vQtdMes = 2;

  ELSEIF('$(vPeriodo)' = 6) THEN

  LET vQtdMes = 3;

  ELSEIF('$(vPeriodo)' = 7) THEN

  LET vQtdMes = 4;

  ELSEIF('$(vPeriodo)' = 😎 THEN

  LET vQtdMes = 6;

  ELSEIF('$(vPeriodo)' = 9) THEN

  LET vQtdMes = 12;

  ELSE

  LET vQtdMes = 0;

ENDIF

LET vQqtdParcelasTotal = 96;

LET vDataInicioAmortizacao = '15/10/2010';

L

Tô anexando o Script que tô trabalhando pra tentar facilitar o entendimento, talvez eu não esteja explicando muito bem.

nicolett_yuri
Partner Ambassador/MVP
Partner Ambassador/MVP

Kleiton, vou verificar seu exemplo e te retorno

kkmoraes
Contributor III
Contributor III
Author

Obrigado Yuri!