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;
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?
Pessoal qualquer ajuda é bemvinda! Abraços à todos.
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
Curtir tópico
+ 0
Responder
Posts
07/05/2011
Leonardo Gazio
Segue o procedure inteiro;
Abraços...
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
Clique aqui para fazer login e interagir na Comunidade :)