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:
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:
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:
SOLMAN:
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?
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
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 ****
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.
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.
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.
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.
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.