Ir para conteúdo

Abran

Members
  • Total de itens

    4
  • Registro em

  • Última visita

Tudo que Abran postou

  1. Abran

    PL SQL (Select dentro do LOOP)

    Gostaria de poder fazer um SELECT dentro do LOOP igual ao exemplo abaixo. Esse exemplo não deu certo, se tirar esse SELECT que está dentro do LOOP, tudo funciona. O problema está no Select dentro do LOOP que nao aceita. ORA-01403: dados não encontrados A ideia é, Z45 grava cliente, e Z46 grava títulos em aberto. Toda vez que rodar, deverá checar se existe novos títulos que ainda não foram gravados, e só gravar os que ainda não foram. Alguem sabe alguma maneira de fazer o que preciso ? DECLARE v_CODCLI VARCHAR2 (6); vPREFIXO VARCHAR2 (3); vNUM VARCHAR2 (9); vPARCELA VARCHAR2 (3); BEGIN v_CODCLI := '0'; FOR V_FUNC IN ( SELECT E1_FILIAL, A1_COD, A1_LOJA, A1_PESSOA, E1_PREFIXO, E1_NUM, E1_PARCELA, E1_TIPO, E1_NATUREZ, E1_EMISSAO, E1_VENCREA, E1_VALOR, CASE WHEN TO_DATE('20190627', 'yyyymmdd') - TO_DATE(E1_VENCTO, 'yyyymmdd') < 0 THEN 0 ELSE TO_DATE('20190627', 'yyyymmdd') - TO_DATE(E1_VENCTO, 'yyyymmdd') END ATRASO FROM SE1010 SE1 INNER JOIN SA1010 A1 ON A1.A1_COD = E1_CLIENTE AND A1_LOJA = E1_LOJA AND A1.D_E_L_E_T_ = SE1.D_E_L_E_T_ WHERE SE1.D_E_L_E_T_ = ' ' ORDER BY A1_LOJA, A1_COD ) LOOP SELECT Z46_PREFIX, Z46_NUM, Z46_PARCEL, Z46_TIPO, Z46_NATURE INTO vPREFIXO, vNUM, vPARCELA, vTIPO, vNATUREZ FROM Z46010 Z46 WHERE Z46_PREFIX = V_FUNC.E1_PREFIXO AND Z46_NUM = V_FUNC.E1_NUM AND Z46_PARCEL = V_FUNC.E1_PARCELA AND D_E_L_E_T_ = ' ' ; IF vPREFIXO || vNUM || vPARCELA != V_FUNC.E1_PREFIXO || V_FUNC.E1_NUM || V_FUNC.E1_PARCELA THEN IF V_FUNC.A1_COD <> v_CODCLI THEN v_CODCLI := V_FUNC.A1_COD; INSERT INTO DADOSADV.Z45010 ( Z45_RECNO, Z45_FILIAL, Z45_CODCLI, Z45_LOJA, Z45_PESSOA, Z45_DTCAD ) VALUES ( (SELECT CASE WHEN MAX(Z45_RECNO) IS NULL THEN 1 ELSE MAX(Z45_RECNO) + 1 END Z45_RECNO FROM Z45010) , V_FUNC.E1_FILIAL, V_FUNC.A1_COD, V_FUNC.A1_LOJA, V_FUNC.A1_PESSOA, TO_CHAR(SYSDATE, 'YYYYMMDD') ); COMMIT; END IF; INSERT INTO DADOSADV.Z46010 ( Z46_RECNO, Z46_RECZ45, Z46_STATIT, Z46_PREFIX, Z46_NUM, Z46_PARCEL, Z46_TIPO, Z46_NATURE, Z46_VALOR, Z46_ATRASO, Z46_DTCAD ) VALUES ( (SELECT CASE WHEN MAX(Z46_RECNO) IS NULL THEN 1 ELSE MAX(Z46_RECNO) + 1 END Z46_RECNO FROM Z46010) , (SELECT CASE WHEN MAX(Z45_RECNO) IS NULL THEN 1 ELSE MAX(Z45_RECNO) END Z45_RECNO FROM Z45010), 0, V_FUNC.E1_PREFIXO, V_FUNC.E1_NUM, V_FUNC.E1_PARCELA, V_FUNC.E1_TIPO, V_FUNC.E1_NATUREZ, 20, V_FUNC.ATRASO, TO_CHAR(SYSDATE, 'YYYYMMDD') ); COMMIT; END IF; END LOOP; END;
  2. Abran

    PL SQL (Select dentro do LOOP)

    Nessas tabelas eu gravo os Títulos de cobrança que estão em aberto para gerar carta de cobrança. Cada titulo de cobrança ao ser gravado terá um STATUS, dependendo da quantidade de dias de atraso. Se o titulo de cobrança mudar de faixa, ele será inserido novamente com STATUS diferente. Por isso preciso que todos os títulos sejam verificados. E tem uma parte que vou criar ainda que irá fazer as verificações de mudança de status. A intenção dessas tabelas é registrar as emissões de carta de cobrança e ter um histórico da movimentação de status. Eu não conhecia o EXCEPTION WHEN. Funcionou agora certinho. Só não sei dizer se realmente essa seria a melhor logica, mas vou estudar aqui. Obrigado!!!!
  3. Abran

    PL SQL (Select dentro do LOOP)

    Dadosadv é um owner ? Sim A ideia é, Z45 grava cliente, e Z46 grava títulos em aberto. Toda vez que rodar, deverá checar se existe novos títulos que ainda não foram gravados, e só gravar os que ainda não foram.
×

Informação importante

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