Pular para o conteúdo
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #99111
    leogazio
    Participante

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

      #99112
      rman
      Participante


        CREATE TABLE PLANOCONTA(
        CODPLANOCONTA NUMBER(10)
        ,DIAVENCIMENTO NUMBER(10)
        ,NUMDIASANTECEDENCIA NUMBER(10)
        );

        INSERT INTO PLANOCONTA(CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA) VALUES(1,15,3);
        INSERT INTO PLANOCONTA(CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA) VALUES(2,1,3);
        INSERT INTO PLANOCONTA(CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA) VALUES(3,16,3);
        INSERT INTO PLANOCONTA(CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA) VALUES(4,25,3);
        INSERT INTO PLANOCONTA(CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA) VALUES(5,6,3);
        INSERT INTO PLANOCONTA(CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA) VALUES(6,10,3);

        COMMIT;

        SELECT CODPLANOCONTA,DIAVENCIMENTO,NUMDIASANTECEDENCIA,
        CASE
        WHEN DIAVENCIMENTO TO_CHAR(SYSDATE,'DD') THEN TO_DATE(DIAVENCIMENTO||'/'||TO_CHAR(SYSDATE,'MM/YYYY'))
        END DATAVENCIMENTO
        FROM PLANOCONTA
        WHERE NUMDIASANTECEDENCIA <=
        CASE
        WHEN DIAVENCIMENTO TO_CHAR(SYSDATE,'DD') THEN TO_DATE(DIAVENCIMENTO||'/'||TO_CHAR(SYSDATE,'MM/YYYY')) - SYSDATE
        END;

        Por não conhecer a regra de negocio, não sei se é isso que você quer… Apenas mantive a lógica empregada da sua store procedure…

        Basicamente é só substituir o SELECT do FOR.

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.