Ajuda com procedure.

07/05/2011

0

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;

1:

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))


Pessoal qualquer ajuda é bemvinda! Abraços à todos.
Leonardo Gazio

Leonardo Gazio

Responder

Posts

07/05/2011

Leonardo Gazio

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;
/


Abraços...
Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar