*&---------------------------------------------------------------------*
*& Report ZMMU015
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmmu015.
TABLES:sscrfields.
*&---------------------------------------------------------------------*
*&全局数据
*&---------------------------------------------------------------------*
TYPES:BEGIN OF ty_cols_rows,
begin_col TYPE i,
begin_row TYPE i,
end_col TYPE i,
end_row TYPE i,
END OF ty_cols_rows.
DATA:gv_text TYPE string,
functxt TYPE smp_dyntxt.
DATA:gt_data LIKE TABLE OF alsmex_tabline.
DATA:gs_cols_rows TYPE ty_cols_rows.
DATA:gs_fieldcat TYPE lvc_s_fcat, "字段工作区
gt_fieldcat TYPE lvc_t_fcat.
DATA:gs_layout TYPE lvc_s_layo.
DATA:BEGIN OF gs_alv,
sel TYPE char1,
werks TYPE eord-werks,
matnr TYPE eord-matnr,
lifnr TYPE eord-lifnr,
ekorg TYPE eord-ekorg,
meins TYPE eord-meins,
flifn TYPE eord-flifn,
notkz TYPE eord-notkz,
autet TYPE eord-autet,
vdatu TYPE eord-vdatu,
bdatu TYPE eord-bdatu,
status TYPE icon-id,
text TYPE char255,
END OF gs_alv,
gt_alv LIKE TABLE OF gs_alv.
*&---------------------------------------------------------------------*
*&选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_file TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK bk1.
SELECTION-SCREEN FUNCTION KEY 1.
*&---------------------------------------------------------------------*
*&初始化
*&---------------------------------------------------------------------*
INITIALIZATION.
PERFORM frm_init_botton.
*&---------------------------------------------------------------------*
*&AT SELECTION-SCREEN ON VALUE-REQUEST
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
****文件上传路径搜索帮助
PERFORM f4_p_file.
*&---------------------------------------------------------------------*
*&AT SELECTION-SCREEN.
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
"模板下载
CASE sscrfields-ucomm..
WHEN 'FC01'.
PERFORM frm_download_file.
ENDCASE.
*&---------------------------------------------------------------------*
*&START-OF-SELECTION.
*&---------------------------------------------------------------------*
START-OF-SELECTION.
"数据上传
PERFORM frm_upload_file.
"数据处理
PERFORM frm_process_data.
*&---------------------------------------------------------------------*
*&END-OF-SELECTION.
*&---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM frm_pre_fieldcat. "设置字段
PERFORM frm_set_layout. "设置布局
PERFORM frm_show_alv.
*&---------------------------------------------------------------------*
*& Form F4_P_FILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f4_p_file .
DATA:lt_tab TYPE filetable,
lv_qty TYPE i, "返回的文件数量
ls_wa TYPE string.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = '选择文件' "窗口标题
default_filename = '' "默认文件名
multiselection = '' "是否多选,X=一次性可多选,空=单选
file_filter = 'Excel表格| *.xls;*.xlsx;*.xlsm'
CHANGING
file_table = lt_tab "返回的文件结果
rc = lv_qty. "返回的文件个数
LOOP AT lt_tab INTO ls_wa.
p_file = ls_wa."文件选择框内 = 返回的所选文件路径
ENDLOOP.
CALL METHOD cl_gui_cfw=>flush.
ENDFORM. " F4_P_FILE
*&---------------------------------------------------------------------*
*& Form frm_init_botton
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_botton .
CLEAR functxt.
functxt-icon_id = icon_export. "图标,可以通过ICON查找
functxt-icon_text = '模板下载'."描述
sscrfields-functxt_01 = functxt.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_download_file .
DATA:lv_init_path TYPE string,
lv_title TYPE string,
lv_path TYPE string,
lv_fpath TYPE string,
lv_file TYPE rlgrap-filename.
DATA:ls_wdatb LIKE wwwdatatab,
lv_subrc TYPE sy-subrc,
lv_msg TYPE string.
DATA:lv_objid TYPE w3objid,
lv_fname TYPE string.
lv_objid = 'ZMMU015'.
lv_fname = '货源清单批导'.
"获取桌面路径
CALL METHOD cl_gui_frontend_services=>get_desktop_directory
CHANGING
desktop_directory = lv_init_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
EXIT.
ENDIF.
"保存文件
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title
default_extension = 'xlsx'
default_file_name = lv_fname
initial_directory = lv_init_path
file_filter = 'EXCEL文件(*.xlsx)||全部文件(*.*)||'
prompt_on_overwrite = 'X'
CHANGING
filename = lv_fname
path = lv_path
fullpath = lv_fpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CLEAR:lv_file.
lv_file = lv_fpath.
IF lv_file IS NOT INITIAL.
"判断文件模板是否存在
SELECT SINGLE
relid
objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_wdatb
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = lv_objid.
IF ls_wdatb IS INITIAL.
MESSAGE TEXT-e03 TYPE 'E'.
ELSE.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_wdatb
destination = lv_file
IMPORTING
rc = lv_subrc.
IF lv_subrc <> 0.
MESSAGE TEXT-e02 TYPE 'E'.
ELSE.
CLEAR:lv_msg.
CONCATENATE '模板下载到本地文件' lv_file INTO lv_msg.
MESSAGE lv_msg TYPE 'S'.
ENDIF.
ENDIF.
ELSE.
MESSAGE TEXT-e01 TYPE 'E' .
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_upload_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_upload_file .
IF p_file IS INITIAL.
MESSAGE '文件路径不能为空' TYPE 'E'.
ENDIF.
CLEAR:gs_cols_rows.
gs_cols_rows-begin_col = '1'.
gs_cols_rows-begin_row = '2'.
gs_cols_rows-end_row = '99999'.
gs_cols_rows-end_col = '10'.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = gs_cols_rows-begin_col
i_begin_row = gs_cols_rows-begin_row
i_end_col = gs_cols_rows-end_col
i_end_row = gs_cols_rows-end_row
TABLES
intern = gt_data
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF gt_data IS INITIAL.
MESSAGE '模板中无数据,请确认' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_process_data .
DATA:BEGIN OF ls_excle,
werks TYPE eord-werks,
matnr TYPE eord-matnr,
lifnr TYPE eord-lifnr,
ekorg TYPE eord-ekorg,
meins TYPE eord-meins,
flifn TYPE eord-flifn,
notkz TYPE eord-notkz,
autet TYPE eord-autet,
vdatu TYPE eord-vdatu,
bdatu TYPE eord-bdatu,
END OF ls_excle,
lt_excle LIKE TABLE OF ls_excle.
DATA:gv_struc TYPE string,
gv_table TYPE string.
FIELD-SYMBOLS: <fv_field>.
LOOP AT gt_data INTO DATA(ls_data).
ASSIGN COMPONENT ls_data-col OF STRUCTURE ls_excle TO <fv_field>.
<fv_field> = ls_data-value.
"物料增加前导零
IF ls_data-col = 2.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <fv_field>
IMPORTING
output = <fv_field>.
ENDIF.
"供应商增加前导零
IF ls_data-col = 3.
<fv_field> = |{ <fv_field> ALPHA = IN }|.
ENDIF.
AT END OF row.
APPEND ls_excle TO lt_excle.
CLEAR:ls_excle.
ENDAT.
CLEAR:ls_data.
ENDLOOP.
SORT lt_excle BY werks matnr.
LOOP AT lt_excle INTO ls_excle.
MOVE-CORRESPONDING ls_excle TO gs_alv.
APPEND gs_alv TO gt_alv.
CLEAR:ls_excle,gs_alv.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_pre_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_pre_fieldcat .
CLEAR gs_fieldcat.
REFRESH gt_fieldcat.
* "===手动赋值fieldcat===
DEFINE set_fieldcat.
CLEAR: gs_fieldcat.
gs_fieldcat-fieldname = &1 .
gs_fieldcat-coltext = &2.
gs_fieldcat-edit = &3.
gs_fieldcat-ref_table = &4.
gs_fieldcat-ref_field = &5.
gs_fieldcat-icon = &6.
gs_fieldcat-checkbox = &7.
gs_fieldcat-convexit = &8.
gs_fieldcat-lowercase = 'X'.
APPEND gs_fieldcat TO gt_fieldcat .
END-OF-DEFINITION.
* set_fieldcat 'SEL' '选择' 'X' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'WERKS' '工厂代码' '' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'MATNR' 'SAP物料编码' '' '' '' '' '' 'MATN1'."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'LIFNR' '供应商编码' '' '' '' '' '' 'ALPHA'."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'EKORG' '采购组织' '' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'MEINS' '订单单位' '' '' '' '' '' 'CUNIT'."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'FLIFN' '固定货源' '' '' '' '' 'X' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'NOTKZ' '冻结货源' '' '' '' '' 'X' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'AUTET' 'MRP' '' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'VDATU' '有效时间从' '' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'BDATU' '有效时间到' '' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'STATUS' '状态' '' '' '' 'X' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
set_fieldcat 'TEXT' '消息' '' '' '' '' '' ''."列/名称/可编辑/参考表/参考字段/图标/复选框/例程转换
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout-cwidth_opt = 'X'.
gs_layout-box_fname = 'SEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_show_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_alv .
FIELD-SYMBOLS <fs_table> TYPE table .
ASSIGN gt_alv TO <fs_table> .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
i_callback_pf_status_set = 'FRM_SUB_STATUS_SET'
i_callback_user_command = 'FRM_SUB_USER_COMMAND'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = <fs_table>
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SUB_STATUS_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_sub_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS'.
SET TITLEBAR 'TITLE'.
ENDFORM. "SUB_STATUS_SET
*&---------------------------------------------------------------------*
*& Form FRM_SUB_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_sub_user_command USING s_ucomm TYPE sy-ucomm
re_selfield TYPE slis_selfield.
re_selfield-col_stable = 'X'.
re_selfield-row_stable = 'X'.
re_selfield-refresh = 'X'.
CASE s_ucomm.
WHEN 'ZSAVE'.
PERFORM frm_save_data."数据保存
ENDCASE.
ENDFORM. "SUB_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form frm_save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_save_data .
DATA:lt_eordu LIKE TABLE OF eordu WITH HEADER LINE.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE sel EQ 'X'
AND status NE icon_green_light.
AT NEW matnr.
CLEAR:lt_eordu[],lt_eordu.
ENDAT.
MOVE-CORRESPONDING <fs_alv> TO lt_eordu.
lt_eordu-erdat = sy-datum.
lt_eordu-ernam = sy-uname.
lt_eordu-kz = 'I'.
APPEND lt_eordu.
AT END OF matnr.
CALL FUNCTION 'ME_INITIALIZE_SOURCE_LIST'.
CALL FUNCTION 'ME_DIRECT_INPUT_SOURCE_LIST'
EXPORTING
i_matnr = lt_eordu-matnr
i_werks = lt_eordu-werks
TABLES
t_eord = lt_eordu[]
EXCEPTIONS
plant_missing = 1
material_missing = 2
OTHERS = 3.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
<fs_alv>-status = icon_red_light.
CONCATENATE sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO <fs_alv>-text SEPARATED BY ','.
ELSE.
CALL FUNCTION 'ME_POST_SOURCE_LIST_NEW'
EXPORTING
i_matnr = lt_eordu-matnr.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
<fs_alv>-status = icon_green_light.
<fs_alv>-text = '保存成功'.
ENDIF.
ENDAT.
ENDLOOP.
IF sy-subrc NE 0.
MESSAGE '请选中未保存成功的行进行操作,请确认' TYPE 'E'.
ENDIF.
ENDFORM.