Aprenda PL/SQL

UTL_File.Put_line não está quebrando a linha

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Sex, 11 Jul 2008 10:38 am

Olá a todos.
Estou com um pequeno problema em uma procedure que deve preencher um arquivo.txt para geração do sintegra.

O problema é que, no lançamento de um dos registros, o UTL_File.Put_line não está quebrando a linha e está gravando tudo como uma unica linha.

Alguém saberia me dizer o que está acontecendo?

Código: Selecionar todos
-- Registro 54
    n_cod_emp_nf := -1;
    n_cod_publico := -1;
    n_num_nota := -1;
    n_cod_ser_nota := -1;
    v_cont  := 1;
    v_nota  := 0;
    v_reg   := 0;
   
    For reg_54 In (Select Max('54'||rpad(replace(replace(replace(nvl(p.num_cnpj,'0'),'.',''),'/',''),'-',''),14,'0')||
                                lpad(nvl(s.mod_nota,0),2,0)||
                                rpad(nvl(sn.des_ser_nota,' '),3,' ')||
                                lpad(nvl(n.num_nota,0),6,'0')||
                                lpad(replace(nvl(cf.num_cfop,''),'.',''),4,'0')||
                                lpad(nvl(cs.cod_sit_trib,0),3,'0')||
                                lpad(nvl(v_cont,0),3,0)||
                                rpad(nvl(i.cod_produto,''),14,' ')) l_r54a,
                                sfn_formata_numerico(nvl(sum(i.qtd_tot_prd),0),11,3) l_r54b,
                                sfn_formata_numerico(nvl(sum(i.val_unitario*i.qtd_tot_prd),0),12,2) l_r54c,
                                sfn_formata_numerico(nvl(sum(i.val_desconto),0),12,2) l_r54d,
                                sfn_formata_numerico(nvl(sum(i.val_bas_icms),0),12,2) l_r54e,
                                sfn_formata_numerico(nvl(sum(i.val_bas_sub),0),12,2) l_r54f,
                                sfn_formata_numerico(nvl(sum(i.val_ipi_prod),0),12,2) l_r54g,
                                sfn_formata_numerico(nvl(sum(i.per_icms_prd),0),4,2) l_r54h,
                                --chr(13) l_r54,
                           i.cod_empresa, i.cod_publico,i.num_nota, i.cod_ser_nota, cf.cod_cfop, i.per_icms_prd,n.dat_emissao,p.num_cnpj
                      From nota_fiscal n, publico p, serie_nota s, item_prd_nf i, tipo_operac t,
                          logradouro l, cidade c, unid_federac u, serie_nota sn, tab_cst cs,cfop cf
                      Where n.cod_publico = p.cod_publico (+) And
                            s.cod_ser_nota = n.cod_ser_nota (+) And
                            n.cod_empresa = i.cod_empresa And
                            n.cod_publico = i.cod_publico And
                            n.num_nota = i.num_nota And
                            n.cod_ser_nota = i.cod_ser_nota And
                            i.cod_tip_oper = t.cod_tip_oper And
                            p.cod_pais_end = l.cod_pais And
                            p.num_cep_end = l.num_cep And
                            l.cod_cidade = c.cod_cidade And
                            c.cod_uf = u.cod_uf And
                            n.cod_ser_nota = sn.cod_ser_nota And
                            t.cod_tab_cst = cs.cod_tab_cst And
                            t.cod_cfop = cf.cod_cfop and
                            n.dat_emissao Between d_inicio And d_fim and
                            t.sit_sintegra = 'S'
                      Group By i.cod_empresa, i.cod_publico,i.num_nota, i.cod_ser_nota, cf.cod_cfop, i.per_icms_prd,n.dat_emissao,p.num_cnpj                         
                      Order By cf.cod_cfop,to_char(n.dat_emissao,'yyyymmdd'), p.num_cnpj, i.num_nota)
      Loop
       v_reg := v_reg +1;
       if v_reg <> 1 then
        if v_nota = reg_54.num_nota then
           v_cont := v_cont +1;
        else
           v_cont := 1;
           v_nota := reg_54.num_nota;
        end if;
       else
        v_nota := reg_54.num_nota;
       end if;

        v_cont_54 := v_cont_54 +1;
        If reg_54.cod_empresa != n_cod_emp_nf And
           reg_54.cod_publico != n_cod_publico And
           reg_54.num_nota != n_num_nota And
           reg_54.cod_ser_nota != n_cod_ser_nota
          Then
            n_ord_item_nf := 1;
            n_cod_emp_nf := reg_54.cod_empresa;
            n_cod_publico := reg_54.cod_publico;
            n_num_nota := reg_54.num_nota;
            n_cod_ser_nota := reg_54.cod_ser_nota;
          Else n_ord_item_nf := n_ord_item_nf + 1;
        End If;
        vc2_tp_reg_54 := substr(reg_54.l_r54a,1,34)||lpad(v_cont,3,0)||substr(reg_54.l_r54a,38);
        vc2_tp_reg_54 := vc2_tp_reg_54 || reg_54.l_r54b||reg_54.l_r54c||reg_54.l_r54d||reg_54.l_r54e||reg_54.l_r54f||reg_54.l_r54g||reg_54.l_r54h||reg_54.l_r54; 
        --UTL_File.new_line(file => vo_arq_saida, lines => 1);
        UTL_File.Put_line(vo_arq_saida,vc2_tp_reg_54);
      End Loop;
ehimura
Localização: Barretos - SP

Mensagemem Ter, 15 Jul 2008 8:21 am

E aeeee beleza brother ...

O que esta acontecendo é que você esta concatenando ao invés de quebrar a linha.

Tente fazer assim:
Código: Selecionar todos
vc2_tp_reg_54 := vc2_tp_reg_54 ||chr(10)|| reg_54.l_r54b|| chr(10) ||  reg_54.l_r54c||chr(10) || 54.l_r54d|| chr(10) ||reg_54.l_r54e||chr(10) ||reg_54.l_r54f||chr(10) ||reg_54.l_r54g||chr(10) ||reg_54.l_r54h||chr(10) ||reg_54.l_r54;


Abraço
Julian Campagnoli
Localização: MG e SP

Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem