Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leonardo Gazio

procedure.

Recommended Posts

Olá pessoas! Eu tenho um procedure aqui que o objetivo dele é fazer lançamento de contas a pagar/receber automáticas mensal fixas. O procedure funciona mas tem dois bugs;

 

Tenho esse trecho aqui que pega o próximo mês, aí é que tá, vamos supor que o cara crie a conta no dia 1 pra vencer no dia 10, usando o ADD_MONTHS a conta só vai ser lançada pro oooutro mês;

 

SELECT TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'MM/YYYY') AS PROXIMOMES INTO VPROXIMOMES FROM DUAL; 

 

Em seguida tenho o loop no select montando a data concatenando o dia de vencimento da conta com o próximo mês, o bug aí tá na hora de montar a data, se a conta for lançada pro mês de Fevereiro e o dia de vencimento que o cara escolheu pro lançamento das contas for "30", vai dar erro, eu poderia usar a função LAST_DAY() pra sempre jogar o ultimo dia válido do mês do lançamento. Mas como fazer se a data tá sendo montada dentro do select? Sugestões?

 FOR R IN (SELECT CODPLANOCONTA, TIPOCONTA, DESCRICAO, CONTAPERSISTENTE, DIAVENCIMENTO,
                  NUMDIASANTECEDENCIA, DIAS_TOLERANCIA, STATUS, VALORCONTAPERSISTENTE, PERCENTJUROS, PERCENTDESCONTO,
      CODPARCEIRO, DESCRPARCEIRO
 FROM TBPLANOCONTAS WHERE ((TO_DATE(DIAVENCIMENTO||'/'||VPROXIMOMES) - SYSDATE) <= NUMDIASANTECEDENCIA) AND
                                 (CONTAPERSISTENTE = 1) AND (STATUS = 1))

 

Segue o procedure inteiro;

 

CREATE OR REPLACE PROCEDURE PRC_LANCACONTASAUTOMATICAS IS
 VPROXIMOMES     VARCHAR(7);
 VDATAVENCIMENTO DATE;
 VNUMDOC         INTEGER;
 VEMITIDAS       INTEGER;
 VFONEFAVORECIDO VARCHAR(30);
BEGIN
 /* EXTRAIO MÊS/ANO DA DATA ATUAL */
 SELECT TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'MM/YYYY') AS PROXIMOMES INTO VPROXIMOMES FROM DUAL;
 /* DOU UM LOOP NO PLANO DE CONTAS BUSCANDO UMA CONTA PERSISTENTE COM STATUS = 1(ATIVA), CONCATENO O
    DIA DE VENCIMENTO DA CONTA PERSISTENTE COM O MÊS/ANO EXTRAÍDOS ACIMA, CONVERTO EM DATA E SUBTRAIO PELA DATA ATUAL
 COMPARO E VEJO SE O NÚMERO DE DIAS É IGUAL OU MENOS QUE O NUMERO DE DIAS DE ANTECEDÊNCIA QUE A
 CONTA DEVE SER LANÇADA*/  
 FOR R IN (SELECT CODPLANOCONTA, TIPOCONTA, DESCRICAO, CONTAPERSISTENTE, DIAVENCIMENTO,
                  NUMDIASANTECEDENCIA, DIAS_TOLERANCIA, STATUS, VALORCONTAPERSISTENTE, PERCENTJUROS, PERCENTDESCONTO,
      CODPARCEIRO, DESCRPARCEIRO
 FROM TBPLANOCONTAS WHERE ((TO_DATE(DIAVENCIMENTO||'/'||VPROXIMOMES) - SYSDATE) <= NUMDIASANTECEDENCIA) AND
                                 (CONTAPERSISTENTE = 1) AND (STATUS = 1))
 LOOP
     /* MONTO O PRÓXIMO VENCIMENTO PARA JOGAR NO CONTAS A PAGAR */
     VDATAVENCIMENTO := TO_DATE(R.DIAVENCIMENTO||'/'||VPROXIMOMES);
  /* NA ROTINA ABAIXO EU VERIFICO SE A CONTA AINDA NÃO FOI INCLUÍDA NO CONTAS A PAGAR, SE O NÚMERO DE EMITIDAS
     FOR "0", EU ENTRO NA ROTINA PARA INSERIR A CONTA */   
     SELECT COUNT(CODCONTA) INTO VEMITIDAS FROM TBCONTAS WHERE (TO_CHAR(VDATAVENCIMENTO, 'MM/YYYY') = VPROXIMOMES) AND (CODPLANOCONTA = R.CODPLANOCONTA);         
     IF (VEMITIDAS = 0) THEN
      /* ROTINA PARA INCREMENTAR O NÚMERO DO DOCUMENTO */      
         SELECT (MAX(NUMERODOC) + 1) INTO VNUMDOC FROM TBCONTAS WHERE (CODPLANOCONTA = R.CODPLANOCONTA);      
         IF (VNUMDOC IS NULL) THEN
             VNUMDOC := 1;
         END IF;
      /* PEGO AQUI O TELEFONE DO FAVORECIDO */
      SELECT COALESCE(TELEFONE1, TELEFONE2, TELEFONE3, TELEFONE4) INTO VFONEFAVORECIDO FROM TBPARCEIROS WHERE (CODPARCEIRO = R.CODPARCEIRO);
   /* FINALMENTE DOU O INSERT DA CONTA NO CONTAS A PAGAR */  
            INSERT INTO TBCONTAS (CODPLANOCONTA, TIPOCONTA, DATAVENCIMENTO, DATAEMISSAO,
                                       VALOR, NUMERODOC, DESCRICAO, DIAS_TOLERANCIA, PERCENTJUROS, PERCENTDESCONTO, CODPARCEIRO, DESCRPARCEIRO) VALUES
                                      (R.CODPLANOCONTA, R.TIPOCONTA, VDATAVENCIMENTO, SYSDATE,
            R.VALORCONTAPERSISTENTE, VNUMDOC, R.DESCRICAO, R.DIAS_TOLERANCIA, R.PERCENTJUROS, R.PERCENTDESCONTO, R.CODPARCEIRO,
   R.DESCRPARCEIRO);
     END IF;  
 END LOOP;
END PRC_LANCACONTASAUTOMATICAS;
/

 

Desde já agradeço por qualquer ajuda, abraços à todos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazendo

to_number(to_char(Last_day(to_date(VPROXIMOMES,'mm/yyyy')),'dd')))

 

se obtem o último dia do próximo mês, aí seria só tratar caso a caso.

 

No lugar de

(TO_DATE(DIAVENCIMENTO||'/'||VPROXIMOMES)

entraria uma variável que seria calculada conforme o mês/parametro escolhido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.