1. TYPE-POOLS:slis.
    2. ***********************************************************************
    3. **----------------------------T Y P E S------------------------------**
    4. ***********************************************************************
    5. TYPES:
    6. BEGIN OF ty_alv,
    7. sel TYPE c,
    8. icon TYPE icon_d,
    9. id TYPE i,
    10. msg TYPE char255,
    11. END OF ty_alv.
    12. ***********************************************************************
    13. **---------------------------T A B L E S-----------------------------**
    14. ***********************************************************************
    15. TABLES: sscrfields.
    16. ***********************************************************************
    17. **------------------------V A R I A B L E S--------------------------**
    18. ***********************************************************************
    19. DATA: gt_fieldcat TYPE lvc_t_fcat,
    20. gs_fieldcat TYPE lvc_s_fcat,
    21. gs_layout TYPE lvc_s_layo,
    22. g_objid LIKE wwwdata-objid VALUE sy-repid,
    23. gs_alv TYPE ty_alv,
    24. gt_alv TYPE TABLE OF ty_alv.
    25. FIELD-SYMBOLS:
    26. <fs_alv> TYPE ty_alv.
    27. ***********************************************************************
    28. **--------------------------D E F I N E------------------------------**
    29. ***********************************************************************
    30. DEFINE d_build_fieldcat.
    31. gs_fieldcat-fieldname = &1.
    32. gs_fieldcat-qfieldname = &2.
    33. gs_fieldcat-cfieldname = &3.
    34. gs_fieldcat-ref_table = &4.
    35. gs_fieldcat-ref_field = &5.
    36. gs_fieldcat-convexit = &6.
    37. gs_fieldcat-emphasize = &7.
    38. gs_fieldcat-scrtext_l = &8.
    39. gs_fieldcat-colddictxt = 'L'.
    40. append gs_fieldcat to gt_fieldcat.
    41. clear: gs_fieldcat.
    42. END-OF-DEFINITION.
    43. ***********************************************************************
    44. **-----------------S E L E C T I O N---S C R E E N-------------------**
    45. ***********************************************************************
    46. SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.
    47. PARAMETERS p_file TYPE rlgrap-filename LOWER CASE.
    48. PARAMETERS p_row TYPE n LENGTH 2 DEFAULT '2' OBLIGATORY.
    49. PARAMETERS p_col TYPE n LENGTH 2 DEFAULT '1' OBLIGATORY.
    50. SELECTION-SCREEN END OF BLOCK 001.
    51. SELECTION-SCREEN FUNCTION KEY 1.
    52. ***********************************************************************
    53. **-------------------I N I T I A L I Z A T I O N---------------------**
    54. ***********************************************************************
    55. INITIALIZATION.
    56. title1 = '选择条件'.
    57. %_p_file_%_app_%-text = '选择文件'.
    58. %_p_row_%_app_%-text = '开始行'.
    59. %_p_col_%_app_%-text = '开始列'.
    60. sscrfields-functxt_01 = '@49@下载模板'.
    61. ***********************************************************************
    62. **---------------A T S E L E C T I O N-S C R E E N-------------------**
    63. ***********************************************************************
    64. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
    65. PERFORM select_excel_file CHANGING p_file.
    66. AT SELECTION-SCREEN.
    67. CASE sscrfields-ucomm.
    68. WHEN 'FC01'.
    69. PERFORM download_template USING g_objid 'XLS' '批量导入模板.xls'.
    70. ENDCASE.
    71. ***********************************************************************
    72. **-----------------S T A R T-O F-S E L E C T I O N-------------------**
    73. ***********************************************************************
    74. START-OF-SELECTION.
    75. IF p_file IS INITIAL.
    76. MESSAGE '请选择文件' TYPE 'S'.
    77. LEAVE LIST-PROCESSING.
    78. ENDIF.
    79. "读取文件
    80. PERFORM upload_data USING p_row p_col. "数据开始的单元格行、列数,可根据实际情况更改
    81. * PERFORM check_data.
    82. PERFORM display_data.
    83. *&---------------------------------------------------------------------*
    84. *& FORM UPLOAD_DATA
    85. *&---------------------------------------------------------------------*
    86. * 读取EXCEL数据
    87. *----------------------------------------------------------------------*
    88. FORM upload_data USING uv_row uv_col .
    89. DATA:ls_structure TYPE REF TO data.
    90. DATA:lt_excel LIKE zalsmex_tabline OCCURS 0 WITH HEADER LINE.
    91. FIELD-SYMBOLS:<l_fs_intern> TYPE zalsmex_tabline."表头行
    92. FIELD-SYMBOLS:<l_fs_item> TYPE ty_alv.
    93. FIELD-SYMBOLS:<field>.
    94. DATA:lv_row TYPE i,
    95. lv_col TYPE i.
    96. DATA:lv_str TYPE c LENGTH 1.
    97. lv_row = uv_row.
    98. lv_col = uv_col.
    99. CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    100. EXPORTING
    101. filename = p_file
    102. i_begin_col = lv_col
    103. i_begin_row = lv_row
    104. i_end_col = 10
    105. i_end_row = 60000
    106. TABLES
    107. intern = lt_excel
    108. EXCEPTIONS
    109. inconsistent_parameters = 1
    110. upload_ole = 2
    111. OTHERS = 3.
    112. IF sy-subrc <> 0.
    113. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    114. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    115. ENDIF.
    116. * 转换EXCEL数据到内表
    117. CREATE DATA ls_structure LIKE gs_alv.
    118. LOOP AT lt_excel ASSIGNING <l_fs_intern>.
    119. AT NEW row.
    120. ASSIGN ls_structure->* TO <l_fs_item>.
    121. INSERT gs_alv INTO TABLE gt_alv ASSIGNING <l_fs_item>.
    122. ENDAT.
    123. ASSIGN COMPONENT <l_fs_intern>-col OF STRUCTURE <l_fs_item>
    124. TO <field>.
    125. CHECK sy-subrc EQ 0.
    126. <field> = <l_fs_intern>-value.
    127. ENDLOOP.
    128. LOOP AT gt_alv ASSIGNING <fs_alv>.
    129. CLEAR:lv_str.
    130. <fs_alv>-id = sy-tabix .
    131. <fs_alv>-icon = '@5B@'.
    132. ENDLOOP.
    133. ENDFORM. "UPLOAD_DATA
    134. *&---------------------------------------------------------------------*
    135. *& FORM CHECK_DATA
    136. *&---------------------------------------------------------------------*
    137. * TEXT
    138. *----------------------------------------------------------------------*
    139. FORM check_data.
    140. DATA: l_flag TYPE c,
    141. l_tabix TYPE i,
    142. l_msg TYPE string,
    143. l_value TYPE string,
    144. l_index TYPE i VALUE 1.
    145. DEFINE d_store_message.
    146. l_flag = 'X'.
    147. call function 'MESSAGE_STORE'
    148. exporting
    149. arbgb = &1
    150. msgty = &2
    151. txtnr = &3
    152. msgv1 = &4
    153. msgv2 = &5
    154. msgv3 = &6
    155. msgv4 = &7
    156. zeile = l_index.
    157. l_index = l_index + 1.
    158. END-OF-DEFINITION.
    159. CALL FUNCTION 'MESSAGES_INITIALIZE'.
    160. LOOP AT gt_alv ASSIGNING <fs_alv>.
    161. ** 示例
    162. * IF GS_EXCEL-FLTYPE = ''.
    163. * L_MSG = '第' && L_TABIX && '行的XX不能为空'.
    164. * D_STORE_MESSAGE: '00' 'E' '001' L_MSG '' '' ''.
    165. * ENDIF.
    166. *
    167. * MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.
    168. * APPEND GS_ALV TO GT_ALV.
    169. * CLEAR GS_ALV.
    170. ENDLOOP.
    171. IF l_flag = 'X'.
    172. CALL FUNCTION 'MESSAGES_SHOW'.
    173. LEAVE LIST-PROCESSING.
    174. ENDIF.
    175. ENDFORM. "CHECK_DATA
    176. *&---------------------------------------------------------------------*
    177. *& FORM SELECT_EXCEL_FILE
    178. *&---------------------------------------------------------------------*
    179. * TEXT
    180. *----------------------------------------------------------------------*
    181. FORM select_excel_file CHANGING p_file.
    182. DATA: lt_filetable TYPE filetable WITH HEADER LINE,
    183. l_rc TYPE i,
    184. l_action TYPE i.
    185. CALL METHOD cl_gui_frontend_services=>file_open_dialog
    186. EXPORTING
    187. default_extension = 'XLSX'
    188. default_filename = '*.XLS;*.XLSX'
    189. file_filter = cl_gui_frontend_services=>filetype_excel
    190. multiselection = ''
    191. CHANGING
    192. file_table = lt_filetable[]
    193. rc = l_rc
    194. user_action = l_action
    195. EXCEPTIONS
    196. OTHERS = 1.
    197. IF l_action NE 0.
    198. EXIT.
    199. ENDIF.
    200. READ TABLE lt_filetable INDEX 1.
    201. p_file = lt_filetable-filename.
    202. ENDFORM. "SELECT_EXCEL_FILE
    203. *&---------------------------------------------------------------------*
    204. *& FORM SET_STATUS_BAR
    205. *&---------------------------------------------------------------------*
    206. * TEXT
    207. *----------------------------------------------------------------------*
    208. FORM set_status_bar USING p_percent p_message.
    209. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    210. EXPORTING
    211. percentage = p_percent
    212. text = p_message.
    213. ENDFORM. "SET_STATUS_BAR
    214. *&---------------------------------------------------------------------*
    215. *& FORM DOWNLOAD_TEMPLATE
    216. *&---------------------------------------------------------------------*
    217. * 下载模板用
    218. * P_OBJID: SMW0中的文件ID
    219. * P_EXTENSION: 文件扩展名,如XLS、DOC
    220. * P_DEFAULT_FILENAME: 默认文件名
    221. *----------------------------------------------------------------------*
    222. FORM download_template USING p_objid p_extension p_default_filename.
    223. DATA: l_filename TYPE string,
    224. l_fullpath TYPE string,
    225. l_path TYPE string,
    226. ls_objdata TYPE wwwdatatab,
    227. l_destination TYPE rlgrap-filename,
    228. l_rc TYPE i.
    229. SELECT SINGLE relid objid INTO CORRESPONDING FIELDS OF ls_objdata FROM wwwdata
    230. WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.
    231. IF sy-subrc <> 0.
    232. MESSAGE '模板文件不存在' TYPE 'E'.
    233. ENDIF.
    234. CALL METHOD cl_gui_frontend_services=>file_save_dialog
    235. EXPORTING
    236. default_extension = p_extension
    237. default_file_name = p_default_filename
    238. CHANGING
    239. filename = l_filename
    240. path = l_path
    241. fullpath = l_fullpath
    242. EXCEPTIONS
    243. OTHERS = 1.
    244. IF l_fullpath = ''.
    245. MESSAGE '没有选择文件' TYPE 'E'.
    246. ENDIF.
    247. IF STRLEN( l_fullpath ) > 128.
    248. MESSAGE '文件名长度超出128,请重新选择文件' TYPE 'S' DISPLAY LIKE 'E'.
    249. STOP.
    250. ENDIF.
    251. l_destination = l_fullpath.
    252. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    253. EXPORTING
    254. key = ls_objdata
    255. destination = l_destination
    256. IMPORTING
    257. rc = l_rc.
    258. IF l_rc <> 0.
    259. MESSAGE '导入模板下载失败' TYPE 'E'.
    260. ENDIF.
    261. ENDFORM. "DOWNLOAD_TEMPLATE
    262. *&---------------------------------------------------------------------*
    263. *& FORM DISPLAY_DATA
    264. *&---------------------------------------------------------------------*
    265. * 显示数据
    266. *----------------------------------------------------------------------*
    267. FORM display_data.
    268. d_build_fieldcat:
    269. * 字段 单位字段 金额字段 参照表 参照字段 转码 列颜色 描述
    270. 'ICON' '' '' '' '' '' '' '状态',
    271. 'MSG' '' '' '' '' '' '' '消息文本'.
    272. gs_layout-cwidth_opt = 'X'.
    273. gs_layout-box_fname = 'SEL'.
    274. gs_layout-zebra = 'X'.
    275. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    276. EXPORTING
    277. i_callback_program = sy-repid
    278. i_callback_pf_status_set = 'PF_STATUS'
    279. i_callback_user_command = 'USER_COMMAND'
    280. it_fieldcat_lvc = gt_fieldcat
    281. is_layout_lvc = gs_layout
    282. i_default = 'X'
    283. i_save = 'A'
    284. TABLES
    285. t_outtab = gt_alv
    286. EXCEPTIONS
    287. OTHERS = 1.
    288. ENDFORM. "DISPLAY_DATA
    289. *&---------------------------------------------------------------------*
    290. *& FORM PF_STATUS
    291. *&---------------------------------------------------------------------*
    292. * TEXT
    293. *----------------------------------------------------------------------*
    294. FORM pf_status USING rt_extab TYPE slis_t_extab .
    295. SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.
    296. ENDFORM. "PF_STATUS
    297. *&---------------------------------------------------------------------*
    298. *& FORM USER_COMMAND
    299. *&---------------------------------------------------------------------*
    300. * TEXT
    301. *----------------------------------------------------------------------*
    302. FORM user_command USING r_ucomm LIKE sy-ucomm
    303. rs_selfield TYPE slis_selfield.
    304. * 设置alv内容改变事件回调
    305. DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
    306. DATA: lv_index TYPE i.
    307. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    308. IMPORTING
    309. e_grid = lr_grid.
    310. CALL METHOD lr_grid->check_changed_data.
    311. CASE r_ucomm.
    312. WHEN '&IMPORT'.
    313. READ TABLE gt_alv WITH KEY sel = 'X' TRANSPORTING NO FIELDS.
    314. IF sy-subrc <> 0.
    315. MESSAGE '请至少选择一个行项目' TYPE 'S' DISPLAY LIKE 'E'.
    316. EXIT.
    317. ELSE.
    318. "准备数据进行批导
    319. LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'.
    320. PERFORM frm_bapi_import USING gs_alv.
    321. ENDLOOP.
    322. ENDIF.
    323. ENDCASE.
    324. rs_selfield-refresh = 'X'. " 刷新ALV屏幕
    325. ENDFORM. "USER_COMMAND
    326. *&---------------------------------------------------------------------*
    327. *& Form FRM_BAPI_IMPORT
    328. *&---------------------------------------------------------------------*
    329. * text
    330. *----------------------------------------------------------------------*
    331. * -->LS_ALV text
    332. *----------------------------------------------------------------------*
    333. FORM frm_bapi_import USING ls_alv TYPE ty_alv .
    334. * 处理 BAPI 返回值
    335. DATA:lt_bapireturn LIKE TABLE OF bapiret2.
    336. DATA:ls_bapimsg TYPE bapiret2.
    337. REFRESH:lt_bapireturn[].
    338. CLEAR:ls_bapimsg.
    339. READ TABLE lt_bapireturn INTO ls_bapimsg WITH KEY type = 'S'.
    340. IF sy-subrc <> 0.
    341. DATA lv_msg TYPE string.
    342. LOOP AT lt_bapireturn INTO ls_bapimsg WHERE type CO 'AEX' .
    343. CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    344. EXPORTING
    345. msgid = ls_bapimsg-id
    346. msgnr = ls_bapimsg-number
    347. msgv1 = ls_bapimsg-message_v1
    348. msgv2 = ls_bapimsg-message_v2
    349. msgv3 = ls_bapimsg-message_v3
    350. msgv4 = ls_bapimsg-message_v4
    351. IMPORTING
    352. message_text_output = lv_msg.
    353. ENDLOOP.
    354. ls_alv-msg = lv_msg.
    355. ls_alv-icon = '@5C@'.
    356. ELSE.
    357. ls_alv-msg = '导入成功!'.
    358. CONCATENATE ls_alv-msg ls_bapimsg-message INTO ls_alv-msg.
    359. ls_alv-icon = '@5B@'.
    360. ENDIF.
    361. DATA:lv_id TYPE i.
    362. CLEAR:lv_id.
    363. lv_id = ls_alv-id.
    364. MODIFY gt_alv FROM ls_alv TRANSPORTING icon msg WHERE id = lv_id .
    365. ENDFORM. " FRM_BDC_IMPORT