Criar Procedure para importar os itens da NF XML

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
fabissilva
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Seg, 09 Set 2019 4:29 pm
Localização: Sorocaba - SP
Fabi
INSERT INTO possivel VALUES ('Nada é impossível para aquele que persiste');

Olá,
Possuo a procedure que importa do xml o cabeçalho da Nota Fiscal, porém eu preciso também que puxe os itens da NF para inserir em uma outra tabela relacionando com o id da tabela TB_INFO_NFE, porém não sei como fazer, poderiam me ajudar.

Selecionar tudo

 create or replace procedure pr_import_xml as
  var_err_IO      number;
  var_err_arq     number;
  var_tipo        varchar2(20);
  VAR_NUMERO      varchar2(20);
  VAR_EMISSAO     varchar2(100);
  VAR_CHAVE       varchar2(100);
  VAR_CNPJ        varchar2(20);
  VAR_TOTAL       varchar2(20);
  var_id          number;
  var_origem      varchar2(200);
  var_arq_sem_ext number;
  var_aux         XMLTYPE;
  VAR_CIDADE_EMI  varchar2(200);
  VAR_RAZAO_EMI   varchar2(200);
  VAR_CNPJ_DEST   varchar2(20);
  VAR_CIDADE_DEST varchar2(200);
  VAR_RAZAO_DEST  varchar2(200);
  VAR_NATUREZA    VARCHAR2(200);

  ex    BOOLEAN;
  flen  NUMBER;
  bsize NUMBER;
begin

  for cur_arq in (select substr(a.column_value, 8) as file_name
                    from table(fn_list_files_xml_nfe) a
                   where substr(a.column_value, 1, 12) <> 'D:\xml\erros'
                     and substr(a.column_value, 1, 17) <>
                         'D:\xml\importados') loop
  
    var_err_IO      := 0;
    var_err_arq     := 0;
    VAR_CNPJ        := '';
    VAR_NUMERO      := '';
    VAR_EMISSAO     := '';
    VAR_TOTAL       := '';
    VAR_CHAVE       := '';
    var_id          := 0;
    var_origem      := '';
    var_arq_sem_ext := 0;
    VAR_NATUREZA    := '';
  
    select nvl(MAX(ID) + 1, 1) into var_id from TB_INFO_NFE;
  
    --tratamento de arquivos que s?o salvos sem extensao
    if substr(cur_arq.file_name, -4, 1) <> '.' THEN
      var_arq_sem_ext := 1;
      begin
        var_aux  := XMLTYPE(BFILENAME('XMLNFE', cur_arq.file_name),
                            NLS_CHARSET_ID('WE8ISO8859P1'));
        var_tipo := 'XML';
      EXCEPTION
        WHEN OTHERS THEN
          var_tipo := 'ERR';
      end;
    else
      var_arq_sem_ext := 0;
      var_tipo        := upper(substr(cur_arq.file_name, -3, 3));
    end if;
  
    var_origem := upper(substr(cur_arq.file_name, 1, 44));
  
    --apaga os registros duplicados
    delete from TB_INFO_NFE where nome_arq = cur_arq.file_name;
  
    commit;
  
    if upper(var_tipo) = 'XML' then
      begin
        INSERT INTO TB_INFO_NFE
          (ID, data_gravacao, nome_arq, tipo_arq, origem, CONTEUDO)
        VALUES
          (var_id,
           SYSDATE,
           cur_arq.file_name,
           upper(var_tipo),
           var_origem,
           XMLTYPE(BFILENAME('XMLNFE', cur_arq.file_name),
                   NLS_CHARSET_ID('WE8ISO8859P1')));
      EXCEPTION
        WHEN OTHERS THEN
          var_err_IO := 1;
      end;
    else
      begin
        INSERT INTO TB_INFO_NFE
          (ID, data_gravacao, nome_arq, tipo_arq, origem, CONTEUDO)
        VALUES
          (var_id,
           SYSDATE,
           cur_arq.file_name,
           upper(var_tipo),
           var_origem,
           null);
      EXCEPTION
        WHEN OTHERS THEN
          var_err_IO := 1;
      end;
    end if;
  
    COMMIT;
    utl_file.fclose_all;
  
    IF upper(var_tipo) = 'XML' THEN
      --TRAZ OS VALORES DOS CAMPOS
      BEGIN
        SELECT nvl(to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/emit/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),''),
               nvl(to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/ide/nNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),''),
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/ide/dhEmi','xmlns="http://www.portalfiscal.inf.br/nfe"')),
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/total/ICMSTot/vNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),
               to_char(substr(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/@Id','xmlns="http://www.portalfiscal.inf.br/nfe"'),4)), --5
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/emit/enderEmit/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/emit/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')),
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/dest/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/dest/enderDest/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/dest/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')), --10
               to_char(extractvalue(CONTEUDO,'/nfeProc/NFe/infNFe/ide/natOp','xmlns="http://www.portalfiscal.inf.br/nfe"'))
          INTO VAR_CNPJ, VAR_NUMERO, VAR_EMISSAO, VAR_TOTAL, VAR_CHAVE,VAR_CIDADE_EMI, VAR_RAZAO_EMI, VAR_CNPJ_DEST, VAR_CIDADE_DEST, VAR_RAZAO_DEST, VAR_NATUREZA
          FROM TB_INFO_NFE
         WHERE id = var_id;
      
      EXCEPTION
        WHEN OTHERS THEN
          var_err_arq := 1;
      end;
    
      if (var_err_arq = 1) or (VAR_CNPJ = '') or (VAR_NUMERO = '') then
        begin
          SELECT to_char(extractvalue(CONTEUDO,'/NFe/infNFe/emit/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/ide/nNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/ide/dhEmi','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/total/ICMSTot/vNF','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(substr(extractvalue(CONTEUDO,'/NFe/infNFe/@Id','xmlns="http://www.portalfiscal.inf.br/nfe"'),4)), --5
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/emit/enderEmit/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/emit/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/dest/CNPJ','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/dest/enderDest/xMun','xmlns="http://www.portalfiscal.inf.br/nfe"')),
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/dest/xNome','xmlns="http://www.portalfiscal.inf.br/nfe"')), --10
                 to_char(extractvalue(CONTEUDO,'/NFe/infNFe/ide/natOp','xmlns="http://www.portalfiscal.inf.br/nfe"'))
            INTO VAR_CNPJ, VAR_NUMERO, VAR_EMISSAO, VAR_TOTAL, VAR_CHAVE, VAR_CIDADE_EMI, VAR_RAZAO_EMI, VAR_CNPJ_DEST, VAR_CIDADE_DEST,VAR_RAZAO_DEST, VAR_NATUREZA
            FROM TB_INFO_NFE
           WHERE id = var_id;
        
          var_err_arq := 0;
        EXCEPTION
          WHEN OTHERS THEN
            var_err_arq := 1;
        end;
      end if;
    
      if var_err_arq = 0 then
        update TB_INFO_NFE
           set num_nfe     = VAR_NUMERO,
               emissao     = VAR_EMISSAO,
               total_nf    = VAR_TOTAL,
               chave       = VAR_CHAVE,
               cnpj_emi    = VAR_CNPJ,
               cidade_emi  = UPPER(VAR_CIDADE_EMI),
               razao_emi   = UPPER(VAR_RAZAO_EMI),
               cnpj_dest   = VAR_CNPJ_DEST,
               cidade_dest = UPPER(VAR_CIDADE_DEST),
               razao_dest  = UPPER(VAR_RAZAO_DEST),
               natureza    = upper(VAR_NATUREZA)
         where id = var_id;
      
        commit;
      end if;
    
      BEGIN
      
     
        if (var_err_IO = 1) or (var_err_arq = 1) then
          utl_file.fremove('XMLNFE', cur_arq.file_name);
        else
          utl_file.fremove('XMLNFE', cur_arq.file_name);
        end if;
      EXCEPTION
        WHEN OTHERS THEN
          Dbms_Output.Put_Line('ERRO AO MOVIMENTAR O ARQUIVO');
          utl_file.fclose_all;
      end;
    ELSE
      utl_file.fremove('XMLNFE', cur_arq.file_name);
    END IF;
  end loop;
  utl_file.fclose_all;

end;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Basicamente você precisa criar outro cursor pra pegar as linhas e inserir na sua tabela.
Como que é a estrutura desse xml ?
Avatar do usuário
fabissilva
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Seg, 09 Set 2019 4:29 pm
Localização: Sorocaba - SP
Fabi
INSERT INTO possivel VALUES ('Nada é impossível para aquele que persiste');

Boa tarde,
dr_gori escreveu:Basicamente você precisa criar outro cursor pra pegar as linhas e inserir na sua tabela.
Como que é a estrutura desse xml ?
A estrutura esta anexo.

e os dados que preciso pegar seria conforme a query abaixo:

Selecionar tudo

SELECT c.id,
       C.NUM_NFE,
       to_date(SUBSTR(C.EMISSAO, 9, 2) || '/' || SUBSTR(C.EMISSAO, 6, 2) || '/' ||SUBSTR(C.EMISSAO, 1, 4),'dd/mm/yyyy') dtemiss,
       x.cfop,
       sum(x.vProd) +
       nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vFrete','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
       nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vIPI','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
       nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vOutro','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) + 
       nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vST','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)-
       nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vDesc','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) vdesc ,
       to_number(c.total_nf) totnf
       --,c.conteudo
  FROM tb_jun_info_nfe c,
       XMLTABLE(XMLNAMESPACES(DEFAULT 'http://www.portalfiscal.inf.br/nfe'),'nfeProc/NFe/infNFe/det' PASSING c.conteudo
                COLUMNS CFOP number PATH 'prod/CFOP',
                vProd number path 'prod/vProd') x
 where 1 = 1
 --and C.ID IN (21336)
   and to_date(SUBSTR(C.EMISSAO, 9, 2) || '/' || SUBSTR(C.EMISSAO, 6, 2) || '/' ||SUBSTR(C.EMISSAO, 1, 4),'dd/mm/yyyy') > = to_date('01/01/2020', 'dd/mm/yyyy')
 group by c.id, C.NUM_NFE, C.EMISSAO, x.CFOP, c.total_nf, c.cidade_dest
          , nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vFrete','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) 
          , nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vIPI','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) 
          , nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vOutro','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)
          , nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vST','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)
          , nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vDesc','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)
Anexos
xml.xml
etrutura do xml
(11.77 KiB) Baixado 139 vezes
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu criei uma tabela pra fazer o seu exemplo, e inseri o XML que você passou pra dentro do campo CONTEUDO.

Selecionar tudo

create table tb_jun_info_nfe
(id number
,num_nfe varchar2(100)
,emissao varchar2(100)
,conteudo xmltype
,total_nf varchar2(10)
,cidade_dest varchar2(100)
,cfop varchar2(10)
);
Então, pra extrair parte do XML, eu usei o EXTRACT.

Selecionar tudo

select extract(c.conteudo, '/nfeProc/NFe/infNFe/det','xmlns="http://www.portalfiscal.inf.br/nfe"') conteudo from tb_jun_info_nfe c where id=10
Dessa forma, neste SQL vem apenas os DET (que são os itens).
Vem isso:

Selecionar tudo

<det xmlns="http://www.portalfiscal.inf.br/nfe" nItem="1">
  <prod>
    <cProd>R3313 REI</cProd>
    <cEAN>7899143604809</cEAN>
    <xProd>COXIM CAMBIO ONIBUS O500M/1732/ O500R/1632/ OF1722 (OM926LA)</xProd>
    <NCM>87089990</NCM>
    <CEST>0107500</CEST>
    <CFOP>6403</CFOP>
    <uCom>PC</uCom>
    <qCom>3.0000</qCom>
    <vUnCom>612.47333333</vUnCom>
    <vProd>1837.42</vProd>
    <cEANTrib>7899143604809</cEANTrib>
    <uTrib>PC</uTrib>
    <qTrib>3.0000</qTrib>
    <vUnTrib>612.47333333</vUnTrib>
    <indTot>1</indTot>
  </prod>
  <imposto>
    <ICMS>
      <ICMS10>
        <orig>0</orig>
        <CST>10</CST>
        <modBC>3</modBC>
        <vBC>1837.42</vBC>
        <pICMS>12.0000</pICMS>
        <vICMS>220.49</vICMS>
        <modBCST>4</modBCST>
        <pMVAST>0.0100</pMVAST>
        <vBCST>1837.60</vBCST>
        <pICMSST>18.0000</pICMSST>
        <vICMSST>110.28</vICMSST>
      </ICMS10>
    </ICMS>
    <IPI>
      <cEnq>999</cEnq>
      <IPITrib>
        <CST>99</CST>
        <vBC>0</vBC>
        <pIPI>0</pIPI>
        <vIPI>0</vIPI>
      </IPITrib>
    </IPI>
    <PIS>
      <PISNT>
        <CST>04</CST>
      </PISNT>
    </PIS>
    <COFINS>
      <COFINSNT>
        <CST>04</CST>
      </COFINSNT>
    </COFINS>
  </imposto>
</det>
<det xmlns="http://www.portalfiscal.inf.br/nfe" nItem="2">
  <prod>
    <cProd>R477 REI</cProd>
    <cEAN>7898215795087</cEAN>
    <xProd>BUCHA OLHAL ESTABILIZADOR</xProd>
    <NCM>87089990</NCM>
    <CEST>0107500</CEST>
    <CFOP>6403</CFOP>
    <uCom>JG</uCom>
    <qCom>100.0000</qCom>
    <vUnCom>8.48000000</vUnCom>
    <vProd>848.00</vProd>
    <cEANTrib>7898215795087</cEANTrib>
    <uTrib>JG</uTrib>
    <qTrib>100.0000</qTrib>
    <vUnTrib>8.48000000</vUnTrib>
    <indTot>1</indTot>
  </prod>
  <imposto>
    <ICMS>
      <ICMS10>
        <orig>0</orig>
        <CST>10</CST>
        <modBC>3</modBC>
        <vBC>848.00</vBC>
        <pICMS>12.0000</pICMS>
        <vICMS>101.76</vICMS>
        <modBCST>4</modBCST>
        <pMVAST>0.0100</pMVAST>
        <vBCST>848.09</vBCST>
        <pICMSST>18.0000</pICMSST>
        <vICMSST>50.89</vICMSST>
      </ICMS10>
    </ICMS>
    <IPI>
      <cEnq>999</cEnq>
      <IPITrib>
        <CST>99</CST>
        <vBC>0</vBC>
        <pIPI>0</pIPI>
        <vIPI>0</vIPI>
      </IPITrib>
    </IPI>
    <PIS>
      <PISNT>
        <CST>04</CST>
      </PISNT>
    </PIS>
    <COFINS>
      <COFINSNT>
        <CST>04</CST>
      </COFINSNT>
    </COFINS>
  </imposto>
</det> 
Ai, com base nesse resultado, eu montei essa query:

Selecionar tudo

select xt.*
from   (select extract(c.conteudo, '/nfeProc/NFe/infNFe/det','xmlns="http://www.portalfiscal.inf.br/nfe"') conteudo from tb_jun_info_nfe c where id=10 ) x,
  xmltable(  XMLNAMESPACES(default 'http://www.portalfiscal.inf.br/nfe') , 'det'
  passing x.conteudo
  columns cEAN varchar2(200) path '/det/prod/cEAN' ,
          prod varchar2(200) path '/det/prod/xProd' ,
          cfop varchar2(200) path '/det/prod/CFOP',
          vprod number       path '/det/prod/vProd'
  ) xt
Que produz esse resultado:

Selecionar tudo

CEAN            PROD                                                           CFOP   VPROD
--------------- -------------------------------------------------------------- ------ ----------
7899143604809   COXIM CAMBIO ONIBUS O500M/1732/ O500R/1632/ OF1722 (OM926LA)   6403      1837.42
7898215795087   BUCHA OLHAL ESTABILIZADOR                                      6403          848

SQL> 
Agora, basta fazer um INSERT com esses dados, ou um cursor.

:-o
Avatar do usuário
fabissilva
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Seg, 09 Set 2019 4:29 pm
Localização: Sorocaba - SP
Fabi
INSERT INTO possivel VALUES ('Nada é impossível para aquele que persiste');

Como procedo para fazer o cursor, pois irei fazer o insert a partir de um período, elaborei algo assim, mas estou com dificuldades...

Selecionar tudo

  if VAR_CONTROLE = 0 then
    
    for cur_NF in (
     select nvl(MAX(IDdet) + 1, 1) into var_iddet from TB_JUN_DET_NFE;  
    
        var_iddet:= var_iddet + 1

      SELECT c.id,
             x.CFOP,
             sum(x.vProd) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vFrete','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vIPI','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vOutro','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vST','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)-
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vDesc','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) totprod
        FROM tb_jun_info_nfe c,
             XMLTABLE(XMLNAMESPACES(DEFAULT 'http://www.portalfiscal.inf.br/nfe'),'nfeProc/NFe/infNFe/det' PASSING c.conteudo
                                    COLUMNS CFOP number PATH 'prod/CFOP',
                                    vProd number path 'prod/vProd') x
       where 1 = 1
        and c.id not in (select distinct idinfo from  Tb_Jun_Det_Nfe )
        and to_date(SUBSTR(C.EMISSAO, 9, 2) || '/' || SUBSTR(C.EMISSAO, 6, 2) || '/' ||SUBSTR(C.EMISSAO, 1, 4),'dd/mm/yyyy') > = to_date('01/03/2020', 'dd/mm/yyyy')
    group by c.id, x.CFOP,
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vFrete','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vIPI','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vOutro','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vST','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vDesc','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)
    ) loop



    insert into TB_JUN_DET_NFE (iddet, idinfo, cfop, vprod)
    values (var_iddet, cur_NF.Id, cur_NF.Cfop, cur_NF.Totprod );


  END LOOP;
  end if;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Selecionar tudo

  if VAR_CONTROLE = 0 then
   
    for cur_NF in (
   
      SELECT c.id,
             x.CFOP,
             sum(x.vProd) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vFrete','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vIPI','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vOutro','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) +
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vST','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)-
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vDesc','xmlns="http://www.portalfiscal.inf.br/nfe"')),0) totprod
        FROM tb_jun_info_nfe c,
             XMLTABLE(XMLNAMESPACES(DEFAULT 'http://www.portalfiscal.inf.br/nfe'),'nfeProc/NFe/infNFe/det' PASSING c.conteudo
                                    COLUMNS CFOP number PATH 'prod/CFOP',
                                    vProd number path 'prod/vProd') x
       where 1 = 1
        and c.id not in (select distinct idinfo from  Tb_Jun_Det_Nfe )
        and to_date(SUBSTR(C.EMISSAO, 9, 2) || '/' || SUBSTR(C.EMISSAO, 6, 2) || '/' ||SUBSTR(C.EMISSAO, 1, 4),'dd/mm/yyyy') > = to_date('01/03/2020', 'dd/mm/yyyy')
    group by c.id, x.CFOP,
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vFrete','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vIPI','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vOutro','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vST','xmlns="http://www.portalfiscal.inf.br/nfe"')),0),
             nvl(to_number(extractValue(c.conteudo,'/nfeProc/NFe/infNFe/total/ICMSTot/vDesc','xmlns="http://www.portalfiscal.inf.br/nfe"')),0)
    ) loop

    --esse select funciona, mas eu sugiro usar uma sequencia aqui.
    select nvl(MAX(IDdet), 1) into var_iddet from TB_JUN_DET_NFE; 
   
    var_iddet:= var_iddet + 1

    insert into TB_JUN_DET_NFE (iddet, idinfo, cfop, vprod)
    values (var_iddet, cur_NF.Id, cur_NF.Cfop, cur_NF.Totprod );


  END LOOP;
  end if;
Avatar do usuário
fabissilva
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Seg, 09 Set 2019 4:29 pm
Localização: Sorocaba - SP
Fabi
INSERT INTO possivel VALUES ('Nada é impossível para aquele que persiste');

Deu certo!!

Obrigada 8) :D
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes