01
前言
GOS(generic object service)通用对象服务,可以用来添加单据附件等功能,位于标准单据的左上角,如下图所示。
创建附件标准功能是一次只能上传一个文件,本文介绍通过增强方式
实现一次选择多个文件同时上传。
02
解决方法
1. SE24进入类CL_GOS_SRV_ATTACHMENT_CREATE,通过增强创建一个新方法ZEXECUTE,参数同EXECUTE方法一致。
2.方法ZEXECUTE代码如下
METHOD zexecute .
DATA lp_attachment TYPE swo_typeid..
DATA lt_attachment TYPE hrasr00bor_tab.
DATA ls_attachment TYPE sibflporb.
DATA: lt_file_table TYPE filetable,
lv_current_directory TYPE string,
lv_rc TYPE i,
lv_len TYPE so_doc_len,
lt_content TYPE soli_tab,
ls_obj_id TYPE soodk,
ls_obj_data TYPE sood1,
lt_objhead TYPE STANDARD TABLE OF soli,
lv_ext TYPE string,
lv_fname TYPE string,
lv_path TYPE string,
lv_filename TYPE string,
ls_note TYPE borident,
lv_ep_note TYPE borident-objkey,
lo_objhead TYPE REF TO cl_bcs_objhead,
lv_obj_type TYPE soodk-objtp,
lv_object_type TYPE soodk-objtp,
lv_put_to_kpro TYPE sonv-flag,
lv_filetype TYPE rlgrap-filetype,
ls_boridenta TYPE borident,
ls_boridentb TYPE borident,
ls_document TYPE sood4,
ls_folder_id TYPE sofdk.
gs_lporb-instid. =
gs_lporb-typeid. =
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
region = 'B'
IMPORTING
folder_id = ls_folder_id
EXCEPTIONS
OTHERS = 0.
ls_folder_id-foltp. =
ls_folder_id-folyr. =
ls_folder_id-folno. =
get current directory
CALL METHOD cl_gui_frontend_services=>directory_get_current
CHANGING
current_directory = lv_current_directory
EXCEPTIONS
directory_get_current_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
import multiple files from PC
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Import Files' ##NO_TEXT
initial_directory = lv_current_directory
multiselection = abap_true
CHANGING
file_table = lt_file_table
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0 AND lv_rc > 0.
LOOP AT lt_file_table ASSIGNING FIELD-SYMBOL(<lfs_file>).
CLEAR: lv_path, lv_filename, lv_fname, lv_ext, lv_len, lt_content,
ls_obj_id, lo_objhead, lv_object_type,lv_put_to_kpro,
lt_objhead .
lv_path = <lfs_file>-filename.
IF lv_path IS NOT INITIAL.
CALL FUNCTION 'SO_OBJECT_UPLOAD'
EXPORTING
filetype = lv_filetype
path_and_file = lv_path
no_dialog = 'X'
IMPORTING
filelength = lv_len
act_filetype = lv_filetype
act_filename = <lfs_file>-filename
act_objtype = lv_object_type
file_put_to_kpro = lv_put_to_kpro
TABLES
objcont = lt_content
EXCEPTIONS
file_read_error = 1
invalid_type = 2
x_error = 3
object_type_not_allowed = 4
kpro_insert_error = 5
file_to_large = 6
OTHERS = 7.
IF sy-subrc = 0.
lv_object_type. =
lv_len. =
IF NOT lv_put_to_kpro IS INITIAL.
'K'. =
ENDIF.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = lv_path
IMPORTING
stripped_name = lv_filename.
lo_objhead = cl_bcs_objhead=>create( lt_objhead[] ).
lv_filename ).
lv_filetype ).
cl_bcs_vsi_profile=>get_profile( ) ).
lo_objhead->mt_objhead. =
TRY .
method to split filename to name & extension
cl_bcs_utilities=>split_name( EXPORTING iv_name = lv_filename IMPORTING ev_name = lv_fname ev_extension = lv_ext ).
CATCH cx_bcs.
CLEAR: lv_path,lv_filename, lv_fname, lv_ext.
ENDTRY.
ls_obj_data-objdes = lv_fname. =
IF NOT lv_ext IS INITIAL.
lv_ext. =
lv_obj_type = 'EXT'.
ELSEIF lv_ext = ls_obj_data-file_ext.
lv_obj_type = 'EXT'.
ELSEIF lv_ext IS INITIAL.
lv_obj_type = 'BIN'.
ENDIF.
add the attachment data to the folder
CALL FUNCTION 'SO_OBJECT_INSERT'
EXPORTING
folder_id = ls_folder_id
object_type = lv_obj_type
object_hd_change = ls_obj_data
IMPORTING
object_id = ls_obj_id
TABLES
objhead = lt_objhead
objcont = lt_content
EXCEPTIONS
active_user_not_exist = 35
communication_failure = 71
component_not_available = 1
dl_name_exist = 3
folder_no_authorization = 5
folder_not_exist = 6
object_type_not_exist = 17
operation_no_authorization = 21
owner_not_exist = 22
parameter_error = 23
substitute_not_active = 31
substitute_not_defined = 32
system_failure = 72
x_error = 1000.
IF sy-subrc = 0.
MOVE: ls_obj_id-objtp TO ls_document-objtp,
TO ls_document-objyr,
TO ls_document-objno.
'MESSAGE'. =
ls_document(34). =
MESSAGE s109(so).
IF NOT ls_boridenta-objkey IS INITIAL.
link the folder data and BO for attachment in gos
CALL FUNCTION 'BINARY_RELATION_CREATE'
EXPORTING
obj_rolea = ls_boridenta
obj_roleb = ls_boridentb
relationtype = 'ATTA'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
APPEND ls_document(34) TO lt_attachment.
ENDIF.
ELSE.
APPEND ls_document(34) TO lt_attachment.
ENDIF.
ELSE.
CASE sy-subrc.
WHEN 35.
MESSAGE a054(so) WITH sy-uname.
WHEN 71.
MESSAGE i071(so).
WHEN 3.
MESSAGE i350(so).
WHEN 5.
MESSAGE i009(so).
WHEN 6.
MESSAGE i005(so).
WHEN 17.
MESSAGE i101(so).
WHEN 21.
MESSAGE i015(so).
WHEN 22.
MESSAGE i113(so).
WHEN 23.
MESSAGE a004(so).
WHEN 31.
MESSAGE i802(so).
WHEN 32.
MESSAGE i801(so) WITH sy-uname.
WHEN 72.
MESSAGE i133(so).
ENDCASE.
EXIT.
ENDIF.
ELSE.
CASE sy-subrc.
WHEN 1.
MESSAGE i422(so) WITH lv_filetype.
WHEN 2.
MESSAGE i322(so).
WHEN 3.
MESSAGE i444(so).
WHEN 4.
MESSAGE i425(so).
WHEN 5.
MESSAGE i424(so).
ENDCASE.
EXIT.
ENDIF.
ENDIF.
ENDLOOP.
ELSE.
MESSAGE s118(so).
ENDIF.
IF lt_attachment[] IS INITIAL.
MESSAGE s042(sgos_msg).
ELSEIF ls_boridenta-objkey IS INITIAL AND
NOT lt_attachment[] IS INITIAL.
LOOP AT lt_attachment INTO lp_attachment.
lp_attachment. =
'MESSAGE'. =
'BO'. =
APPEND ls_attachment TO gt_attachments.
ENDLOOP.
ELSE.
MESSAGE s043(sgos_msg).
RAISE EVENT commit_required.
RAISE EVENT service_succeeded
EXPORTING eo_service = me.
ENDIF.
ENDMETHOD.
3.方法EXECUTE开始处添加隐式增强,代码和截图如下所示
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Class CL_GOS_SRV_ATTACHMENT_CREATE, Method EXECUTE, Start A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1 ZENH_CREATE_ATTACHMENT1. "active version
*
ME->ZEXECUTE( ).
RETURN.
ENDENHANCEMENT.
*$*$-End: (1)---------------------------------------------------------------------------------$*$*
03
效果展示
04
结语
文末打个广告:有伙伴有项目合作需求可以私信联系,公司形式完整项目或者个人形式远程人天皆可。
温馨提示
如果你喜欢本文,请分享给有需要的朋友,想要获得更多信息,请关注我,若有问题以及建议,请在文末留言或者私信。