TYPE-POOLS:slis.
***********************************************************************
**----------------------------T Y P E S------------------------------**
***********************************************************************
TYPES:
BEGIN OF ty_alv,
sel TYPE c,
icon TYPE icon_d,
id TYPE i,
msg TYPE char255,
END OF ty_alv.
***********************************************************************
**---------------------------T A B L E S-----------------------------**
***********************************************************************
TABLES: sscrfields.
***********************************************************************
**------------------------V A R I A B L E S--------------------------**
***********************************************************************
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo,
g_objid LIKE wwwdata-objid VALUE sy-repid,
gs_alv TYPE ty_alv,
gt_alv TYPE TABLE OF ty_alv.
FIELD-SYMBOLS:
<fs_alv> TYPE ty_alv.
***********************************************************************
**--------------------------D E F I N E------------------------------**
***********************************************************************
DEFINE d_build_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-qfieldname = &2.
gs_fieldcat-cfieldname = &3.
gs_fieldcat-ref_table = &4.
gs_fieldcat-ref_field = &5.
gs_fieldcat-convexit = &6.
gs_fieldcat-emphasize = &7.
gs_fieldcat-scrtext_l = &8.
gs_fieldcat-colddictxt = 'L'.
append gs_fieldcat to gt_fieldcat.
clear: gs_fieldcat.
END-OF-DEFINITION.
***********************************************************************
**-----------------S E L E C T I O N---S C R E E N-------------------**
***********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.
PARAMETERS p_file TYPE rlgrap-filename LOWER CASE.
PARAMETERS p_row TYPE n LENGTH 2 DEFAULT '2' OBLIGATORY.
PARAMETERS p_col TYPE n LENGTH 2 DEFAULT '1' OBLIGATORY.
SELECTION-SCREEN END OF BLOCK 001.
SELECTION-SCREEN FUNCTION KEY 1.
***********************************************************************
**-------------------I N I T I A L I Z A T I O N---------------------**
***********************************************************************
INITIALIZATION.
title1 = '选择条件'.
%_p_file_%_app_%-text = '选择文件'.
%_p_row_%_app_%-text = '开始行'.
%_p_col_%_app_%-text = '开始列'.
sscrfields-functxt_01 = '@49@下载模板'.
***********************************************************************
**---------------A T S E L E C T I O N-S C R E E N-------------------**
***********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM select_excel_file CHANGING p_file.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM download_template USING g_objid 'XLS' '批量导入模板.xls'.
ENDCASE.
***********************************************************************
**-----------------S T A R T-O F-S E L E C T I O N-------------------**
***********************************************************************
START-OF-SELECTION.
IF p_file IS INITIAL.
MESSAGE '请选择文件' TYPE 'S'.
LEAVE LIST-PROCESSING.
ENDIF.
"读取文件
PERFORM upload_data USING p_row p_col. "数据开始的单元格行、列数,可根据实际情况更改
* PERFORM check_data.
PERFORM display_data.
*&---------------------------------------------------------------------*
*& FORM UPLOAD_DATA
*&---------------------------------------------------------------------*
* 读取EXCEL数据
*----------------------------------------------------------------------*
FORM upload_data USING uv_row uv_col .
DATA:ls_structure TYPE REF TO data.
DATA:lt_excel LIKE zalsmex_tabline OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS:<l_fs_intern> TYPE zalsmex_tabline."表头行
FIELD-SYMBOLS:<l_fs_item> TYPE ty_alv.
FIELD-SYMBOLS:<field>.
DATA:lv_row TYPE i,
lv_col TYPE i.
DATA:lv_str TYPE c LENGTH 1.
lv_row = uv_row.
lv_col = uv_col.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = lv_col
i_begin_row = lv_row
i_end_col = 10
i_end_row = 60000
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* 转换EXCEL数据到内表
CREATE DATA ls_structure LIKE gs_alv.
LOOP AT lt_excel ASSIGNING <l_fs_intern>.
AT NEW row.
ASSIGN ls_structure->* TO <l_fs_item>.
INSERT gs_alv INTO TABLE gt_alv ASSIGNING <l_fs_item>.
ENDAT.
ASSIGN COMPONENT <l_fs_intern>-col OF STRUCTURE <l_fs_item>
TO <field>.
CHECK sy-subrc EQ 0.
<field> = <l_fs_intern>-value.
ENDLOOP.
LOOP AT gt_alv ASSIGNING <fs_alv>.
CLEAR:lv_str.
<fs_alv>-id = sy-tabix .
<fs_alv>-icon = '@5B@'.
ENDLOOP.
ENDFORM. "UPLOAD_DATA
*&---------------------------------------------------------------------*
*& FORM CHECK_DATA
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM check_data.
DATA: l_flag TYPE c,
l_tabix TYPE i,
l_msg TYPE string,
l_value TYPE string,
l_index TYPE i VALUE 1.
DEFINE d_store_message.
l_flag = 'X'.
call function 'MESSAGE_STORE'
exporting
arbgb = &1
msgty = &2
txtnr = &3
msgv1 = &4
msgv2 = &5
msgv3 = &6
msgv4 = &7
zeile = l_index.
l_index = l_index + 1.
END-OF-DEFINITION.
CALL FUNCTION 'MESSAGES_INITIALIZE'.
LOOP AT gt_alv ASSIGNING <fs_alv>.
** 示例
* IF GS_EXCEL-FLTYPE = ''.
* L_MSG = '第' && L_TABIX && '行的XX不能为空'.
* D_STORE_MESSAGE: '00' 'E' '001' L_MSG '' '' ''.
* ENDIF.
*
* MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.
* APPEND GS_ALV TO GT_ALV.
* CLEAR GS_ALV.
ENDLOOP.
IF l_flag = 'X'.
CALL FUNCTION 'MESSAGES_SHOW'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. "CHECK_DATA
*&---------------------------------------------------------------------*
*& FORM SELECT_EXCEL_FILE
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM select_excel_file CHANGING p_file.
DATA: lt_filetable TYPE filetable WITH HEADER LINE,
l_rc TYPE i,
l_action TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
default_extension = 'XLSX'
default_filename = '*.XLS;*.XLSX'
file_filter = cl_gui_frontend_services=>filetype_excel
multiselection = ''
CHANGING
file_table = lt_filetable[]
rc = l_rc
user_action = l_action
EXCEPTIONS
OTHERS = 1.
IF l_action NE 0.
EXIT.
ENDIF.
READ TABLE lt_filetable INDEX 1.
p_file = lt_filetable-filename.
ENDFORM. "SELECT_EXCEL_FILE
*&---------------------------------------------------------------------*
*& FORM SET_STATUS_BAR
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM set_status_bar USING p_percent p_message.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = p_percent
text = p_message.
ENDFORM. "SET_STATUS_BAR
*&---------------------------------------------------------------------*
*& FORM DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
* 下载模板用
* P_OBJID: SMW0中的文件ID
* P_EXTENSION: 文件扩展名,如XLS、DOC
* P_DEFAULT_FILENAME: 默认文件名
*----------------------------------------------------------------------*
FORM download_template USING p_objid p_extension p_default_filename.
DATA: l_filename TYPE string,
l_fullpath TYPE string,
l_path TYPE string,
ls_objdata TYPE wwwdatatab,
l_destination TYPE rlgrap-filename,
l_rc TYPE i.
SELECT SINGLE relid objid INTO CORRESPONDING FIELDS OF ls_objdata FROM wwwdata
WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.
IF sy-subrc <> 0.
MESSAGE '模板文件不存在' TYPE 'E'.
ENDIF.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
default_extension = p_extension
default_file_name = p_default_filename
CHANGING
filename = l_filename
path = l_path
fullpath = l_fullpath
EXCEPTIONS
OTHERS = 1.
IF l_fullpath = ''.
MESSAGE '没有选择文件' TYPE 'E'.
ENDIF.
IF STRLEN( l_fullpath ) > 128.
MESSAGE '文件名长度超出128,请重新选择文件' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
l_destination = l_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_objdata
destination = l_destination
IMPORTING
rc = l_rc.
IF l_rc <> 0.
MESSAGE '导入模板下载失败' TYPE 'E'.
ENDIF.
ENDFORM. "DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& FORM DISPLAY_DATA
*&---------------------------------------------------------------------*
* 显示数据
*----------------------------------------------------------------------*
FORM display_data.
d_build_fieldcat:
* 字段 单位字段 金额字段 参照表 参照字段 转码 列颜色 描述
'ICON' '' '' '' '' '' '' '状态',
'MSG' '' '' '' '' '' '' '消息文本'.
gs_layout-cwidth_opt = 'X'.
gs_layout-box_fname = 'SEL'.
gs_layout-zebra = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
it_fieldcat_lvc = gt_fieldcat
is_layout_lvc = gs_layout
i_default = 'X'
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
OTHERS = 1.
ENDFORM. "DISPLAY_DATA
*&---------------------------------------------------------------------*
*& FORM PF_STATUS
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM pf_status USING rt_extab TYPE slis_t_extab .
SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.
ENDFORM. "PF_STATUS
*&---------------------------------------------------------------------*
*& FORM USER_COMMAND
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
* 设置alv内容改变事件回调
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: lv_index TYPE i.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
CASE r_ucomm.
WHEN '&IMPORT'.
READ TABLE gt_alv WITH KEY sel = 'X' TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
MESSAGE '请至少选择一个行项目' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ELSE.
"准备数据进行批导
LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'.
PERFORM frm_bapi_import USING gs_alv.
ENDLOOP.
ENDIF.
ENDCASE.
rs_selfield-refresh = 'X'. " 刷新ALV屏幕
ENDFORM. "USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_BAPI_IMPORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->LS_ALV text
*----------------------------------------------------------------------*
FORM frm_bapi_import USING ls_alv TYPE ty_alv .
* 处理 BAPI 返回值
DATA:lt_bapireturn LIKE TABLE OF bapiret2.
DATA:ls_bapimsg TYPE bapiret2.
REFRESH:lt_bapireturn[].
CLEAR:ls_bapimsg.
READ TABLE lt_bapireturn INTO ls_bapimsg WITH KEY type = 'S'.
IF sy-subrc <> 0.
DATA lv_msg TYPE string.
LOOP AT lt_bapireturn INTO ls_bapimsg WHERE type CO 'AEX' .
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_bapimsg-id
msgnr = ls_bapimsg-number
msgv1 = ls_bapimsg-message_v1
msgv2 = ls_bapimsg-message_v2
msgv3 = ls_bapimsg-message_v3
msgv4 = ls_bapimsg-message_v4
IMPORTING
message_text_output = lv_msg.
ENDLOOP.
ls_alv-msg = lv_msg.
ls_alv-icon = '@5C@'.
ELSE.
ls_alv-msg = '导入成功!'.
CONCATENATE ls_alv-msg ls_bapimsg-message INTO ls_alv-msg.
ls_alv-icon = '@5B@'.
ENDIF.
DATA:lv_id TYPE i.
CLEAR:lv_id.
lv_id = ls_alv-id.
MODIFY gt_alv FROM ls_alv TRANSPORTING icon msg WHERE id = lv_id .
ENDFORM. " FRM_BDC_IMPORT