Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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); 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...
Carregando comentários...