¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Exportar arquivo de dados em ISO-8859-15 com ABAP: Guia e solução de problemas

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 1 Vistas
0
Cargando...

Olá,

Estou tentando exportar um arquivo de dados com codificação ISO-8859-15. Esse tipo de codificação permite caracteres como €, Š, š, Ž, ž, Œ, œ ou Ÿ.

Pesquisei as ferramentas ABAP disponíveis para esse propósito, especialmente através deste excelente blog de sandra.rossi .

Aqui está o meu código de teste:

        
            *&---------------------------------------------------------------------*
            *& Report ZBC_FILE_ENCODING
            *&---------------------------------------------------------------------*
            *& Encoding test report
            *&---------------------------------------------------------------------*

            REPORT zbc_file_encoding.

            DATA: gv_file              TYPE text255,
                  gt_file              LIKE STANDARD TABLE OF gv_file,
                  gv_filename          TYPE string,
                  gv_path              TYPE string,
                  gv_fullpath          TYPE string,
                  gv_bin_filesize      TYPE i,
                  gt_bin_data          TYPE solix_tab,
                  gv_xfile             TYPE xstring,
                  gv_sfile             TYPE string,
                  gv_sap_codepage      TYPE cpcodepage,
                  gv_default_file_name TYPE string,
                  gv_external_name     TYPE tcp00a-cpattr,
                  go_abap_conv_obj     TYPE REF TO cl_abap_conv_obj,
                  gv_incode            TYPE cpcodepage,
                  gv_outcode           TYPE cpcodepage.

            gv_file = 'A;B;C;é;€;Š;š;Ž;ž;Œ;œ;Ÿ'.
            APPEND gv_file TO gt_file.
            gv_file = 'D;E;F;é;€;Š;š;Ž;ž;Œ;œ;Ÿ'.
            APPEND gv_file TO gt_file.

            LOOP AT gt_file INTO gv_file.
                CONCATENATE gv_sfile gv_file cl_abap_char_utilities=>cr_lf INTO gv_sfile.
            ENDLOOP.

            gv_external_name = 'ISO-8859-15'.

            CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
              EXPORTING
                external_name = gv_external_name
              IMPORTING
                sap_codepage  = gv_sap_codepage
              EXCEPTIONS
                OTHERS        = 1.

            IF sy-subrc NE 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF.

            CALL FUNCTION 'SCP_GET_CODEPAGE_NUMBER'
              EXPORTING
                database_also = ' '
              IMPORTING
                appl_codepage = gv_incode
              EXCEPTIONS
                OTHERS        = 1.

            IF sy-subrc NE 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF.

            gv_outcode = gv_sap_codepage.

            CREATE OBJECT go_abap_conv_obj
              EXPORTING
                incode   = gv_incode
                outcode  = gv_outcode
                miss     = 'S'
                ctrlcode = '.' 
              EXCEPTIONS
                OTHERS   = 1.

            IF sy-subrc NE 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF.

            CALL METHOD go_abap_conv_obj->convert
              EXPORTING
                inbuff    = gv_sfile
                outbufflg = gv_bin_filesize
              IMPORTING
                outbuff   = gv_xfile
              EXCEPTIONS
                OTHERS    = 1.

            IF sy-subrc NE 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF.

            CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
              EXPORTING
                buffer        = gv_xfile
              IMPORTING
                output_length = gv_bin_filesize
              TABLES
                binary_tab    = gt_bin_data.

            CONCATENATE 'test_encoding_' gv_external_name '.csv' INTO gv_default_file_name.

            CALL METHOD cl_gui_frontend_services=>file_save_dialog
              EXPORTING
                default_file_name = gv_default_file_name
              CHANGING
                filename          = gv_filename
                path              = gv_path
                fullpath          = gv_fullpath
              EXCEPTIONS
                OTHERS            = 1.

            IF sy-subrc NE 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF.

            CALL METHOD cl_gui_frontend_services=>gui_download
              EXPORTING
                bin_filesize         = gv_bin_filesize
                filename             = gv_fullpath
                filetype             = 'BIN'
                show_transfer_status = ' '
              CHANGING
                data_tab             = gt_bin_data
              EXCEPTIONS
                OTHERS               = 1.

            IF sy-subrc NE 0.
                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            ENDIF
        
    

Infelizmente, no final, não obtenho o que esperava:

O Notepad++ diz que o formato é Windows-1252, os caracteres especiais estão desordenados e até mesmo a quebra de linha não é reconhecida.

Alguma ideia do que estou fazendo de errado e como alcançar meu objetivo?

Obrigado antecipadamente pela sua ajuda.

Cumprimentos,

Marco Silva

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Acredito que ainda terá o problema do arquivo com a codificação correta, mas pelo menos no N++ você pode ver uma representação correta usando a codificação.

Atualização:

Isso é feito não adicionando o CRLF às linhas da tabela. Sem conversão das linhas da tabela. Então, apenas forneça a tabela (gt_file) e faça o download gui usando a página de códigos 1164.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá,

Preciso produzir um arquivo que legalmente deve estar na codificação ISO-8859-15. Mas suponho que o ponto principal é permitir o símbolo do Euro (€).

De qualquer forma, dado que consigo encontrar o atributo ISO-8859-15 na tabela TCP00A do SAP para o código de página 1164, não deveria o sistema ser capaz de criar o arquivo na codificação correta?

Obrigado.

Marco

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Marco!

Tem que ser ISO-8859-15 ou isso também é válido?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

É apenas uma pergunta sobre o Notepad++. Ele não pode adivinhar eficientemente qual é a página de código real (a informação não é armazenada), então há um algoritmo muito simples para detectar os primeiros bytes e adivinhar com um alto risco de falsos positivos.

Forçar manualmente o Notepad++ a considerar que é ISO-8859-15 através do menu, e mostrará os caracteres correspondentes ao conjunto de caracteres ISO-8859-15:

PS: Obrigado pelo exemplo mínimo reproduzível! (não se perde tempo com pessoas tentando responder)

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?