Добрый день. Хочу попросить помощи у более опытных коллег Абаперов.
Есть некий код индусов, который должен прикреплять файл к ритейл материалу.
Файл формата EXCEL ( 2003 наверно потому что xls )
В результате этот код не работает. Файл прикрепляется , но после открытия прикреплённого файла видно что он повреждён - целая куча иероглифов и технических символов.
Code:
REPORT z_gos_attachment NO STANDARD PAGE HEADING
LINE-COUNT 132.
*———————————————————————*
* SELECTION SCREEN *
*———————————————————————*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS:
p_file TYPE localfile DEFAULT '/ftp-storage/data/inbound/ERP/MM42/014220174.xls' LOWER CASE, " APPLICATION FILE path
p_objid TYPE swo_typeid DEFAULT '000000000014220174', " ANY OBJECT LIKE material no/vendor
"/customer/po/pr etc
p_bo TYPE swo_objtyp DEFAULT 'BUS1001001'.
" business object like lfa1 for vendor
selection-screen end of block b1.
DATA:
l_xstring type xstring,
l_doc_size type i,
li_content TYPE STANDARD TABLE OF soli,
li_objhead TYPE STANDARD TABLE OF soli,
lwa_folmem_k TYPE sofmk,
lwa_note TYPE borident,
lwa_object TYPE borident,
lwa_obj_id TYPE soodk,
lwa_content TYPE soli,
lwa_fol_id TYPE soodk,
lwa_obj_data TYPE sood1,
lv_ep_note TYPE borident-objkey,
lv_lifnr TYPE lifnr,
lv_file TYPE string,
lv_filename TYPE c LENGTH 100, " FILE NAME AND ext
lv_extension TYPE c LENGTH 4.
" extension only
* Refresh data
refresh: li_content[], li_objhead[].
* Open corresponding DMS files
OPEN DATASET p_file FOR INPUT IN BINARY MODE.
IF sy-subrc EQ 0.
* WHILE sy-subrc = 0.
* READ DATASET p_file INTO lwa_content.
** Do not put Sy-subrc eq 0 here. Please add the last line of the file,
** though sy-subrc may fail
* APPEND lwa_content TO li_content.
* ENDWHILE.
READ DATASET p_file into l_xstring.
* Close file
CLOSE DATASET p_file.
*--------------------------------------------------------------------*
* ANOTHER WAY OF READING FILE
*Convert string to binary format
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = l_xstring
* APPEND_TO_TABLE = ' '
IMPORTING
output_length = l_doc_size
TABLES
binary_tab = li_content.
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
* YET ANOTHER WAY OF CONVERTING FILE.
*data: lt_solix_tab type solix_tab.
* lt_solix_tab = cl_document_bcs=>xstring_to_solix( l_xstring ).
*--------------------------------------------------------------------*
* In this example we are attaching in Vendor.
* Converting according to your requirement.. For example for Material,
* it should be 18 chars
* Convert Vendor
* CALL FUNCTION 'conversion_exit_alpha_input'
* EXPORTING
* input = p_objid
* IMPORTING
* output = lv_lifnr.
* Convert to BIN
* CALL FUNCTION 'SO_CONVERT_CONTENTS_BIN'
* EXPORTING
* it_contents_bin = li_content[]
* IMPORTING
* et_contents_bin = li_content[].
* Get folder id
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
region = 'B'
IMPORTING
folder_id = lwa_fol_id
EXCEPTIONS
communication_failure = 1
owner_not_exist = 2
system_failure = 3
x_error = 4
OTHERS = 5.
* Sy-subrc check not required
* Keeping file in string data type
lv_file = p_file.
* You may not need this step. But no harm in adding this
* Get file name and extension
* CALL FUNCTION 'CH_SPLIT_FILENAME'
* EXPORTING
* complete_filename = lv_file
* IMPORTING
* extension = lv_extension
* name_with_ext = lv_filename
* EXCEPTIONS
* invalid_drive = 1
* invalid_path = 2
* OTHERS = 3.
data: lr_filepath type REF TO cl_fs_path.
lr_filepath ?= cl_fs_path=>create( p_file ).
lv_filename = lr_filepath->get_file_name( ).
lv_extension = lr_filepath->get_file_extension( ).
IF sy-subrc EQ 0.
* Object header
CLEAR lwa_content.
CONCATENATE '&SO_FILENAME=' lv_filename INTO lwa_content.
APPEND lwa_content TO li_objhead.
CLEAR lwa_content.
lwa_content = '&SO_FORMAT=BIN'.
append lwa_content to li_objhead.
ENDIF.
* lwa_object-objkey = lv_lifnr.
lwa_object-objkey = p_objid.
* For example, business object name for PO is BUS2012,
* business object for PR is BUS2105,
* business object for Vendor is LFA1 etc
lwa_object-objtype = p_bo.
* lwa_object-logsys = lv_logical_system.
lwa_obj_data-objsns = 'O'.
lwa_obj_data-objla = sy-langu.
lwa_obj_data-objnam = 'MESSAGE'. "Я ИДИЁТ, УБЕЙТЕ МИНЯ КТО-НИБУДЬ! from zmm_input_newsku
lwa_obj_data-objdes = 'test description'.
replace all OCCURRENCES OF '.' in lv_extension with ''.
lwa_obj_data-file_ext = lv_extension.
TRANSLATE lwa_obj_data-file_ext TO UPPER CASE.
* This is very important step. If your object size does not match with the input
* file size, then your object might get attached, but it will show error while you
* try to open it.
* If you have a way, where you can read the input file size directly, then assign
* it directly else, use the below formula
* lwa_obj_data-objlen = lines( li_content ) * 255.
lwa_obj_data-objlen = l_doc_size.
* lwa_obj_data-extct = 'K'.
* Insert data
CALL FUNCTION 'SO_OBJECT_INSERT'
EXPORTING
folder_id = lwa_fol_id
object_type = 'EXT'
object_hd_change = lwa_obj_data
IMPORTING
object_id = lwa_obj_id
TABLES
objhead = li_objhead
objcont = li_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.
IF sy-subrc = 0 AND lwa_object-objkey IS NOT INITIAL.
lwa_folmem_k-foltp = lwa_fol_id-objtp.
lwa_folmem_k-folyr = lwa_fol_id-objyr.
lwa_folmem_k-folno = lwa_fol_id-objno.
* Please note: lwa_fol_id and lwa_obj_id are different work areas
lwa_folmem_k-doctp = lwa_obj_id-objtp.
lwa_folmem_k-docyr = lwa_obj_id-objyr.
lwa_folmem_k-docno = lwa_obj_id-objno.
lv_ep_note = lwa_folmem_k.
lwa_note-objtype = 'MESSAGE'.
* lwa_note-logsys = lv_logical_system.
lwa_note-objkey = lv_ep_note.
* Link it
CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
EXPORTING
obj_rolea = lwa_object
obj_roleb = lwa_note
relationtype = 'ATTA'
EXCEPTIONS
no_model = 1
internal_error = 2
unknown = 3
OTHERS = 4.
IF sy-subrc EQ 0.
* Commit it
COMMIT WORK.
WRITE:/ 'attached successfully'.
ENDIF.
ELSE.
MESSAGE 'error WHILE opening file' TYPE 'I'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDIF.
Есть ещё пример полностью рабочего кода , но там идёт загрузка с PC , я пробовал параметры с того варианта заполнять ничего не помогло.
В общем перерыл уже весь SCN , кучу различных вариантов перепробовал методом тыка , ничего не помогает.
Есть какие-нибудь идеи ?