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