开发中通常会在接口传输文件附件 例如PDF.TXT等文件(通常文件以字符流的形式传 这里以BASE64加密字符串传输PDF举例 )存入对应检验批的附件清单内。
常用的几种对象类型:
采购订单:BUS2012
销售订单:BUS2032
DN交货单:LIKP
销售发票:VBRK
采购发票:BUS2081
会计凭证:BUS6035
检验批号:BUS2045
可以在TOJTT表中查找相关对象类型
可以在SRGBTBREL表中查看已存在附件
* IF it_items[] IS INITIAL.
* RETURN.
* ELSE.
* CLEAR:gt_items.
* gt_items = CORRESPONDING #( it_items[] ). ""获取传输来的内表
* PERFORM sub_set_pdf CHANGING e_type e_msg.
* ENDIF.
FORM sub_set_pdf CHANGING cv_type TYPE bapi_mtype
cv_msg TYPE bapi_msg.
INCLUDE <cntn01>.
DATA:l_base64 TYPE string.
DATA:ls_binrel TYPE gbinrel,
ls_obja TYPE borident,
ls_roleb TYPE borident,
lt_binrel_attrib TYPE TABLE OF brelattr.
DATA:lt_swcont TYPE TABLE OF swcont WITH HEADER LINE,
l_pure_filename TYPE char30, ""文件名
l_pure_extension TYPE sdbad-funct, ""文件格式
ls_attsize TYPE int4,
lo_swc_obj TYPE swc_object..
DATA:l_xstr TYPE xstring, ""PDF字符串解析后解码的xstring文件
lt_pdf_tab TYPE solix_tab, ""将xstring转换为SAP内表
l_length TYPE i, ""xstring 文件大小
l_folder_id TYPE sofdk. ""读取数据文件根ID
LOOP AT gt_items INTO gs_items.
CLEAR:l_base64 ,
ls_binrel ,
ls_obja ,
ls_roleb ,
lt_binrel_attrib ,
lt_swcont ,
l_pure_filename ,
l_pure_extension,
ls_attsize ,
lo_swc_obj ,
l_xstr ,
lt_pdf_tab ,
l_length ,
l_folder_id .
IF gs_items-pdfstring IS INITIAL.""此处为得到的流字符串
l_base64 = gs_items-pdfstring .
ELSE.
CONTINUE.
ENDIF.
*<!--- BASE64转xstring
CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
EXPORTING
input = l_base64
unescape = 'X'
IMPORTING
output = l_xstr
EXCEPTIONS
failed = 1
OTHERS = 2.
*<!--- xstring转sap内表
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = l_xstr
IMPORTING
output_length = l_length
TABLES
binary_tab = lt_pdf_tab.
*<!--- 读取当前数据ID
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
region = 'B'
IMPORTING
folder_id = l_folder_id
EXCEPTIONS
communication_failure = 1
owner_not_exist = 2
system_failure = 3
x_error = 4
OTHERS = 5.
*<!--- 转换文件
ls_roleb-objtype = 'MESSAGE'.
ls_obja-objtype = 'BUS2045'.
ls_obja-objkey = gs_items-prueflos.
l_pure_filename = |{ ls_obja-objkey }{ '-检验报告' }{ sy-datum }{ sy-uzeit }|.
l_pure_extension = 'pdf'.
swc_create_object lo_swc_obj 'MESSAGE' ''.
swc_set_element lt_swcont 'NO_DIALOG' 'X'.
swc_set_element lt_swcont 'DOCUMENTTITLE' l_pure_filename. ""文件名
swc_set_table lt_swcont 'Content_Hex' lt_pdf_tab. ""文件内容
swc_set_element lt_swcont 'DOCUMENTTYPE' l_pure_extension. ""文件格式
swc_set_element lt_swcont 'DOCUMENTSIZE' l_length. ""文件大小
swc_refresh_object lo_swc_obj.
swc_call_method lo_swc_obj 'CREATE' lt_swcont.
swc_get_object_key lo_swc_obj ls_roleb-objkey.
CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
EXPORTING
obj_rolea = ls_obja
obj_roleb = ls_roleb
relationtype = 'ATTA'
IMPORTING
binrel = ls_binrel
TABLES
binrel_attrib = lt_binrel_attrib
EXCEPTIONS
no_model = 1
internal_error = 2
unknown = 3
OTHERS = 4.
IF sy-subrc EQ 0.
cv_type = 'S'.
MESSAGE s043(sgos_msg) INTO cv_msg.""已成功创建附件
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = cv_msg.
cv_type = 'E'.
ENDIF.
ENDLOOP.