Convertir tabla interna code page 4110 a 1100/1160

notas-sap
sap-abap
Etiquetas: #<Tag:0x00007fb8dda15ea8> #<Tag:0x00007fb8dda15d18>

#1

Hola,

Estoy haciendo un requerimiento en SOLMAN.
En principio, estoy pasando el contenido de un spool a PDF, utilizando la función CONVERT_ABAPSPOOLJOB_2_PDF.
El problema es, que el contenido de la tabla interna que devuelve, aparece en caracteres chinos, de esta forma:

image

Entonces cuando quiero visualizar el PDF me devuelve el error ‘El archivo no comienza con %PDF-’.

Haciendo este mismo proceso en mi R3, lo realiza correctamente:

image

Estuve investigando esto y encontré que el problema viene por el code page, que se puede apreciar por la transaccion SNLS, y comparé ambos sistemas:

ECC:

image

SOLMAN:

image

Entonces, básicamente la pregunta es, ¿hay alguna función/manera en abap de pasar el contenido de mi tabla con code page 4110 a 1100?

Muchas gracias y Saludos,
Sebastián


#2

te dejo unas notas que espero ayuden

752835 - Usage of the file interfaces in Unicode systems
747615 - Tool for converting files from one code page to another
752859 - sapiconv - a tool for converting the encoding of files

saludos.


#3

Hola,
Luego de revisar varias notas, incluidas las que me paso el compañero, di con la solucion.
La clave esta en tomar en lugar de la tabla PDF, el valor de bin_file y luego convertirlo. Dejo el codigo
de ejemplo, saludos.

          CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
            EXPORTING
              src_spoolid              = lv_rqident
              no_dialog                = 'X'
              pdf_destination          = 'X'
              get_size_from_format     = lv_get_size_from_format
            IMPORTING
              pdf_bytecount            = lv_numbytes
              pdf_spoolid              = lv_pdfspoolid
              bin_file                 = lv_binfile
*            TABLES
*              pdf                      = lt_pdf
            EXCEPTIONS
              err_no_abap_spooljob     = 1
              err_no_spooljob          = 2
              err_no_permission        = 3
              err_conv_not_possible    = 4
              err_bad_destdevice       = 5
              user_cancelled           = 6
              err_spoolerror           = 7
              err_temseerror           = 8
              err_btcjob_open_failed   = 9
              err_btcjob_submit_failed = 10
              err_btcjob_close_failed  = 11.

          IF sy-subrc EQ 0.

            CALL FUNCTION 'CRM_IC_XML_XSTRING2STRING'
              EXPORTING
                inxstring = lv_binfile
              IMPORTING
                outstring = lv_strfile.

            IF lv_strfile(21) EQ '<?xml version="1.0"?>'.
              REPLACE FIRST OCCURRENCE OF '<?xml version="1.0"?>' IN lv_strfile WITH ''.
            ENDIF.

            CLEAR: lt_pdf, lt_pdf[].
            DO.
              IF lv_strfile IS INITIAL.
                EXIT.
              ENDIF.

              IF strlen( lv_strfile ) LT 134.
                lt_pdf = lv_strfile.
                CLEAR lv_strfile.
              ELSE.
                lt_pdf = lv_strfile(134).
                lv_strfile = lv_strfile+134.
              ENDIF.
              APPEND lt_pdf.
            ENDDO.

**** INICIO DE AGREGADO ****

            LOOP AT lt_pdf.
              CONCATENATE g_buffer lt_pdf INTO g_buffer.
              CLEAR lt_pdf.
            ENDLOOP.

            DO.
              ls_objcont-line = g_buffer.
              APPEND ls_objcont TO lt_objcont.
              SHIFT g_buffer LEFT BY 255 PLACES.
              IF g_buffer IS INITIAL.
                EXIT.
              ENDIF.

            ENDDO.


*** FIN DE AGREGADO ****


¿Por qué la data binaria están en letras chinas ?
#4

Hola @sconoredhot una consulta, porque eliminas la cadena <?xml version="1.0"?> ?


#5

porque en mi caso aparece al principio, y cuando tengo que llamar a una función que muestra el PDF en pantalla, la misma me devuelve el error “Su archivo no comienza con %PDF”. Pero si en tu caso no necesitas borrarla, puedes comentar esa parte!
Saludos.


#6

Hola @sconoredhot.
Como te comenté recibo una cadena de tipo RAWSTRING en donde me trae datos como el siguiente:

lv_my_rawstring = '3C627265616B666173745F6D656E753E3C666F6F643E3C6E61'.
DATA: lt_content TYPE SOLI.

Con esta data utilizo esta función:

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = lv_my_rawstring
    IMPORTING
      output_length = lv_filesize
    TABLES
      binary_tab    = lt_content.

luego

  CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'
    EXPORTING
      it_contents_bin = lt_content
    IMPORTING
      et_contents_bin = lt_content.

La tabla lt_content devuelve los carateres en chino. Si o si tengo que utilizar las dos funciones para poder generar mi archivo XML, he intentado mandarle en la primera función de tipo char pero al utilizar la segunda función si o si la salida es en chino.
Espero tu apoyo @sconoredhot.
Saludos.


#7

En lugar de esa función, ¿probaste comenzar usando esta, como pasé en el ejemplo?

CALL FUNCTION 'CRM_IC_XML_XSTRING2STRING'
              EXPORTING
                inxstring = lv_binfile
              IMPORTING
                outstring = lv_strfile.

Saludos,
Sebastián


#8

Si he probado, pero para poder insertar el archivo XML en la FB03 tengo que utilizar la siguiente función:

CALL FUNCTION 'SO_OBJECT_INSERT'

Al cual le envío una tabla que de TIPO SOLI resultante de la función:

CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'

#9

@jmore21 revisa por favor el código de arriba, le agregué la parte
para que te quede una tabla tipo SOLI.

Espero te sirva!
Saludos.


#10

Hola @sconoredhot te comparto mi código para ver si lo puedes montar en tu servidor Unicode. Antes de ello crear un archivo XML en tu directorio local y ver con que número de documento de pago cuentas. El adjunto ha crearse se guardará en la TX FB03

  DATA: lv_binario64      TYPE xstring,
        lv_xstring_xml    TYPE xstring,
        lv_string_xml     TYPE string,
        lv_str_xml        TYPE string,
        lv_str_xml2       TYPE string,
        lv_ep_note        TYPE borident-objkey,
        lv_filesize       TYPE i,
        lv_nfilas         TYPE i,
        lv_null           TYPE x.

  DATA: wa_fol_id    TYPE soodk,
        wa_obj_data  TYPE sood1,                   "SAPoffice: atributos
        wa_target_bo TYPE borident,                "Bussiness Object
        wa_folmem_k  TYPE sofmk,
        wa_obj_id    TYPE soodk,
        wa_note      TYPE borident,
        lwa_content  TYPE soli.

  DATA: ltd_content TYPE STANDARD TABLE OF soli,
        ltd_objhead TYPE STANDARD TABLE OF soli.

  DATA: ob_abap_conv_in_ce TYPE REF TO cl_abap_conv_in_ce .

  CLEAR: lv_binario64.

****** Esto es para pruebas

CLEAR: lv_binario64.

DATA IT_CONTENT   TYPE STANDARD TABLE OF SOLI.

CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    filename                      = 'D:\my_true_xml.XML' /* Cambiar por un archivo XML con contenido mediano de tu direcotorio local  */
  tables
    data_tab                      = IT_CONTENT.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

DATA : xstr TYPE xstring,
       lv_mystring  TYPE string.

CALL FUNCTION 'SOTR_SERV_TABLE_TO_STRING'
* EXPORTING
*   FLAG_NO_LINE_BREAKS       = 'X'
*   LINE_LENGTH               =
*   LANGU                     = SY-LANGU
 IMPORTING
   TEXT                       = lv_mystring
  TABLES
    text_tab                  = IT_CONTENT
          .

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text           = lv_mystring
*   MIMETYPE       = ' '
*   ENCODING       =
  IMPORTING
    BUFFER         = xstr
* EXCEPTIONS
*   FAILED         = 1
*   OTHERS         = 2
          .


  lv_binario64 = xstr.

TRY.

  CALL METHOD cl_abap_conv_in_ce=>CREATE
    EXPORTING
      input         = lv_binario64
      replacement   = '?'
      ignore_cerr   = abap_true
    RECEIVING
      conv          = ob_abap_conv_in_ce.

  CATCH cx_parameter_invalid_range.
  CATCH cx_sy_codepage_converter_init.

ENDTRY.

* Convierto el archivo en XML

TRY.

  CALL METHOD ob_abap_conv_in_ce->read
    IMPORTING
      data  = lv_string_xml.

    CATCH cx_sy_conversion_codepage .

    CATCH cx_sy_codepage_converter_init .

    CATCH cx_parameter_invalid_type .

    CATCH cx_parameter_invalid_range .

ENDTRY.

CLEAR: lv_string_xml.

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer                = lv_binario64
*   APPEND_TO_TABLE       = ' '
  IMPORTING
   OUTPUT_LENGTH          = lv_filesize
  tables
    binary_tab            = ltd_content.


  CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'
    EXPORTING
      it_contents_bin = ltd_content
    IMPORTING
      et_contents_bin = ltd_content.


  CALL FUNCTION 'SCMS_BINARY_TO_STRING'
    EXPORTING
      input_length        = lv_filesize
*     FIRST_LINE          = 0
*     LAST_LINE           = 0
*     MIMETYPE            = ' '
*     ENCODING            =
    IMPORTING
      TEXT_BUFFER         = lv_string_xml
*     OUTPUT_LENGTH       =
    tables
      binary_tab          = ltd_content
*   EXCEPTIONS
*     FAILED              = 1
*     OTHERS              = 2
.

  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.


DATA: lwa_xml TYPE SOLI.
DATA: ltd_xml TYPE STANDARD TABLE OF SOLI.
DATA: lv_rini TYPE i VALUE 1,
      lv_rfin TYPE i VALUE 255,
      lv_sbuffer TYPE string,
      lv_ftime TYPE abap_bool VALUE abap_false.

CLEAR: lv_sbuffer.


***--Displaying xml
*cl_abap_browser=>show_xml(
*  exporting
*    xml_string   =  lv_string_xml ).   " XML in String


  CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
    EXPORTING
      region                = 'B'                 "adress folder root
    IMPORTING
      folder_id             = wa_fol_id
    EXCEPTIONS
      communication_failure = 1
      owner_not_exist       = 2
      system_failure        = 3
      x_error               = 4
      OTHERS                = 5.

   wa_obj_data-objsns = 'O'.             "Objeto: Carácter (privado, funcional, etc.); O=Estándar
   wa_obj_data-objla  = sy-langu.         "Idioma en que se ha creado el documento

   DATA: lv_file_name TYPE string,
         lv_ext_serie TYPE string.

   CONCATENATE 'S0001-' 'MI XML'  INTO wa_obj_data-objdes.

   wa_obj_data-file_ext   = 'XML'.            "Extención del archivo

   CALL FUNCTION 'SO_OBJECT_INSERT'
      EXPORTING
        folder_id                  = wa_fol_id
        object_type                = 'EXT'
        object_hd_change           = wa_obj_data
      IMPORTING
        object_id                  = wa_obj_id
      TABLES
        objhead                    = ltd_objhead
        objcont                    = ltd_content
      EXCEPTIONS
        active_user_not_exist      = 1
        communication_failure      = 2
        component_not_available    = 3
        dl_name_exist              = 4
        folder_not_exist           = 5
        folder_no_authorization    = 6
        object_type_not_exist      = 7
        operation_no_authorization = 8
        owner_not_exist            = 9
        parameter_error            = 10
        substitute_not_active      = 11
        substitute_not_defined     = 12
        system_failure             = 13
        x_error                    = 14
        OTHERS                     = 15.

        DATA: lv_bukrs_docrel TYPE string.

        CONCATENATE '<sociedad>'  '<nro doc de pago>' INTO lv_bukrs_docrel.

        CONCATENATE lv_bukrs_docrel  '<año>' INTO  wa_target_bo-objkey.

   IF sy-subrc = 0 AND wa_target_bo-objkey IS NOT INITIAL.
*      Creamos el fichero como BO para que pueda adjuntarse.
       wa_folmem_k-foltp = wa_fol_id-objtp.
       wa_folmem_k-folyr = wa_fol_id-objyr.
       wa_folmem_k-folno = wa_fol_id-objno.
       wa_folmem_k-doctp = wa_obj_id-objtp.
       wa_folmem_k-docyr = wa_obj_id-objyr.
       wa_folmem_k-docno = wa_obj_id-objno.
       lv_ep_note        = wa_folmem_k.
       wa_note-objtype   = 'MESSAGE'.
       wa_note-objkey    = lv_ep_note.

       wa_target_bo-objtype = 'BKPF'.

* Adjuntar documento al BO deseado

       CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
           EXPORTING
             obj_rolea      = wa_target_bo
             obj_roleb      = wa_note
             relationtype   = 'ATTA'
           EXCEPTIONS
             no_model       = 1
             internal_error = 2
             unknown        = 3
             OTHERS         = 4.

       IF sy-subrc IS INITIAL.
* Error
       ELSE.
* Else
       ENDIF.

   ELSE.
* Other case
       RETURN.
   ENDIF.

Por favor recurro a tu apoyo constante, ojalá podamos lograr el objetivo para luego publicarlo como tutorial en este foro.
Gracias por tu tiempo.
Saludos.


#11

Buenas,

Ahi me vas a tener que disculpar pero el servidor en el que estoy trabajando hoy en dia, que tuve
problemas de unicode es un solman, no un R3, la transacción FB03 ahí no existe ;(.
Espero tengas suerte con tu requerimiento.

Saludos.


#12

gracias de todas formas @sconoredhot, una vez que lo tenga solucionado lo subo como tutorial en este foros. Gracias por tu apoyo.


#13

Hola @sconoredhot, para comentarte que pude solucionar el tema de los caracteres NULL en el archivo XML generado y era utilizando una nueva función en la inserción del archivo SO_DOCUMENT_INSERT_API1 enviando mi valor a generar en hexadecimal en una tabla tipo SOLIX que acepta más caracteres que una tipo SOLI. En unos días coloco la solución a modo de tutorial. Muchas gracias por tu apoyo.


#14

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.