¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Exportar archivo de datos en ISO-8859-15 con ABAP: Guía y solución de problemas

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

Hello,

Estoy intentando exportar un archivo de datos en codificación ISO-8859-15. Este tipo de código permite caracteres como €, Š, š, Ž, ž, Œ, œ o Ÿ.

He investigado las herramientas ABAP disponibles para este propósito, especialmente a través de este excelente blog de sandra.rossi .

Aquí puedes encontrar mi código de prueba:

        
            *&---------------------------------------------------------------------*
            *& 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
        
    

Lamentablemente, al final, no obtengo lo que esperaba:

Notepad++ dice que el formato es Windows-1252, los caracteres especiales están desordenados e incluso el retorno de carro y avance de línea no son reconocidos.

¿Alguna idea de qué estoy haciendo mal y cómo lograr mi objetivo?

Gracias de antemano por tu ayuda.

Saludos cordiales,

Marco Silva

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

4 Respuestas

0
Cargando...

Creo que aún tendrás el problema del archivo en sí utilizando la codificación correcta, pero al menos en N++ puedes ver una representación correcta utilizando la codificación.

Actualización:

esto se hace no agregando el CRLF a las líneas de la tabla. Sin conversión de las líneas de la tabla. así que solo suministra la tabla (gt_file) y realiza la descarga gui usando la página de códigos 1164.

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

Hola,

Tengo que producir un archivo que legalmente debería estar en la codificación ISO-8859-15. Pero supongo que el punto principal es permitir el símbolo del Euro (€).

De todos modos, dado que puedo encontrar el atributo ISO-8859-15 en la tabla TCP00A de SAP para el código de página 1164, ¿no debería ser capaz el sistema de crear el archivo en la codificación correcta?

Gracias.

Marco

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

¡Hola Marco!

¿Tiene que ser ISO-8859-15 o también es válido esto?

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

Es solo una pregunta sobre Notepad++. No puede adivinar eficientemente cuál es la página de código real (la información no está almacenada), por lo que hay un algoritmo muy simple para detectar los primeros bytes y adivinar con un alto riesgo de falsos positivos.

Forzar manualmente a Notepad++ a considerar que es ISO-8859-15 a través del menú, y mostrará los caracteres correspondientes al conjunto de caracteres ISO-8859-15:

PD: ¡gracias por el ejemplo mínimo reproducible! (no se pierde tiempo por las personas que intentan 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?