主要功能说明:
1.创建GOS对象,可供用户在服务器端上传/下载批量模板
2.Excel上传数据解析
3.执行SAP事务码SHDB,录好BDC导入代码,批次调用MM02修改物料描述(显示进度条百分比%)
4.ALV显示执行结果
*&---------------------------------------------------------------------*
*& Report zmmdd01
*&---------------------------------------------------------------------*
*& Request :Test Project
*& Author : DDong (XXX, IT)
*& Creation Date : 2022/03/22
*& Purpose: Test Batch Upload To Modify Material
*&---------------------------------------------------------------------*
REPORT zmmdd01.
DATA: BEGIN OF gs_upload,
matnr LIKE rmmg1-matnr,
maktx LIKE makt-maktx,
END OF gs_upload.
DATA: gt_upload LIKE TABLE OF gs_upload.
DATA: bdc_params TYPE ctu_params.
DATA: it_bdc TYPE STANDARD TABLE OF bdcdata,
wa_bdc TYPE bdcdata,
it_message TYPE STANDARD TABLE OF bdcmsgcoll,
wa_message TYPE bdcmsgcoll,
l_mstring(100).
DATA: BEGIN OF wa_result,
matnr LIKE rmmg1-matnr,
status(8) TYPE c,
message(100) TYPE c,
END OF wa_result.
DATA: it_result LIKE TABLE OF wa_result.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: gw_fieldcat TYPE slis_fieldcat_alv.
DATA: gw_layout TYPE slis_layout_alv.
DATA: gw_grid_settings TYPE lvc_s_glay.
DEFINE add_fieldcat.
gw_fieldcat-fieldname = &1.
gw_fieldcat-seltext_m = &2.
APPEND gw_fieldcat TO gt_fieldcat.
CLEAR gw_fieldcat.
END-OF-DEFINITION.
CONSTANTS: objtype TYPE borident-objtype VALUE 'ZGOS001'.
DATA: manager TYPE REF TO cl_gos_manager,
obj TYPE borident,
gs_bc_object TYPE sibflpor.
DATA: wa_itab TYPE alsmex_tabline.
DATA: itab TYPE STANDARD TABLE OF alsmex_tabline WITH DEFAULT KEY.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : s_path TYPE rlgrap-filename DEFAULT 'c:\'.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_path.
PERFORM choose_input_file.
AT SELECTION-SCREEN OUTPUT.
* 创建GOS对象,上传模板附档
CLEAR obj.
obj-objtype = objtype.
SELECT SINGLE name FROM trdir INTO obj-objkey
WHERE name = sy-repid.
CALL FUNCTION 'SWU_OBJECT_PUBLISH'
EXPORTING
objtype = obj-objtype
objkey = obj-objkey
EXCEPTIONS
objtype_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CREATE OBJECT manager
EXPORTING
is_object = obj
is_bc_object = gs_bc_object
ip_start_direct = 'X'.
ENDIF.
START-OF-SELECTION.
IF s_path IS INITIAL.
MESSAGE 'Please select file firest!' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
* 上传excel数据
PERFORM upload_excel_data.
* 执行bdc MM02
PERFORM bdc_modfiy_material.
* 显示执行结果
PERFORM display_result.
FORM upload_excel_data.
DATA: l_index TYPE i,
l_line TYPE i.
FIELD-SYMBOLS: <fs>.
CLEAR: itab[].
* 导入excel数据到itab[]
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = s_path
i_begin_col = '1'
i_begin_row = '1'
i_end_col = '256'
i_end_row = '65536'
TABLES
intern = itab
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
DELETE itab WHERE row = 1 OR col > 2.
* itab[]数据整理到gt_upload[]
LOOP AT itab INTO wa_itab.
CONDENSE wa_itab-value.
l_index = wa_itab-col.
ASSIGN COMPONENT l_index OF STRUCTURE gs_upload TO <fs>.
<fs> = wa_itab-value.
TRANSLATE <fs> TO UPPER CASE.
AT END OF row.
APPEND gs_upload TO gt_upload.
CLEAR gs_upload.
ENDAT.
ENDLOOP.
DESCRIBE TABLE gt_upload LINES l_line.
* no upload data found!
IF l_line = 0.
MESSAGE ID 'ZDD' TYPE 'S' NUMBER 001 DISPLAY LIKE 'E'.
STOP.
ENDIF.
* upload line limit 9999!
IF l_line > 9999.
MESSAGE ID 'ZDD' TYPE 'S' NUMBER 002 DISPLAY LIKE 'E'.
STOP.
ENDIF.
ENDFORM.
FORM choose_input_file.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
mask = ''
static = 'X'
CHANGING
file_name = s_path.
ENDFORM.
FORM display_result.
* ALV fieldcat
add_fieldcat 'matnr' 'Material'.
add_fieldcat 'status' 'Status'.
add_fieldcat 'message' 'Message'.
* ALV layout
gw_layout-colwidth_optimize = 'X'.
* ALV display
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_grid_settings = gw_grid_settings
is_layout = gw_layout
it_fieldcat = gt_fieldcat[]
TABLES
t_outtab = it_result[].
ENDFORM.
FORM bdc_modfiy_material.
DATA: l_count TYPE i,
l_line TYPE i,
l_prec TYPE i,
l_prec_text(4) TYPE c.
CLEAR: it_bdc[], bdc_params.
* bdc启动参数
bdc_params-defsize = 'X'.
bdc_params-dismode = 'N'. "A:调试 N:不显示 E:错误时调试
bdc_params-updmode = 'A'. "A:异步 S:同步 L:本地更新
bdc_params-cattmode = ''.
DESCRIBE TABLE gt_upload LINES l_count.
l_line = 0.
* gt_upload值传入bdc屏幕参数
LOOP AT gt_upload INTO gs_upload.
CLEAR wa_result.
wa_result-matnr = gs_upload-matnr.
l_line = l_line + 1.
l_prec = l_line * 100 DIV l_count.
l_prec_text+0(3) = l_prec.
l_prec_text+3(1) = '%'.
* 显示bdc处理进度条百分比%
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_prec
text = l_prec_text.
* 传入bdc屏幕/OKCODE/FIELD参数
PERFORM bdc_field USING 'X' 'SAPLMGMM' '0060'.
PERFORM bdc_field USING '' 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING '' 'RMMG1-MATNR' gs_upload-matnr.
PERFORM bdc_field USING 'X' 'SAPLMGMM' '0070'.
PERFORM bdc_field USING '' 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING '' 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM bdc_field USING 'X' 'SAPLMGMM' '4004'.
PERFORM bdc_field USING '' 'BDC_OKCODE' '=BU'.
PERFORM bdc_field USING '' 'MAKT-MAKTX' gs_upload-maktx.
* 执行bdc事物码'MM02',执行错误消息保存到it_result[]
CALL TRANSACTION 'MM02' USING it_bdc OPTIONS FROM bdc_params MESSAGES INTO it_message.
WAIT UP TO '0.5' SECONDS.
IF it_message[] IS NOT INITIAL.
LOOP AT it_message INTO wa_message WHERE msgtyp = 'E' OR msgtyp = 'I' .
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = wa_message-msgid
msgnr = wa_message-msgnr
msgv1 = wa_message-msgv1
msgv2 = wa_message-msgv2
msgv3 = wa_message-msgv3
msgv4 = wa_message-msgv4
IMPORTING
message_text_output = l_mstring.
CONDENSE l_mstring.
wa_result-status = 'fail'.
wa_result-message = l_mstring.
EXIT.
ENDLOOP.
ENDIF.
IF wa_result-status IS INITIAL.
wa_result-status = 'success'.
wa_result-message = ''.
ENDIF.
APPEND wa_result TO it_result.
CLEAR: it_message[], wa_message, l_mstring, it_bdc[].
ENDLOOP.
ENDFORM.
* bdc 执行参数it_bdc[]
FORM bdc_field USING flag v1 v2.
CLEAR wa_bdc.
IF flag = 'X'.
wa_bdc-program = v1.
wa_bdc-dynpro = v2.
wa_bdc-dynbegin = 'X'.
ELSE.
wa_bdc-fnam = v1.
wa_bdc-fval = v2.
ENDIF.
APPEND wa_bdc TO it_bdc.
ENDFORM.