1.效果图:

image.png

2.源代码:

  1. REPORT zcode_generator_batch_input.
  2. TYPE-POOLS: ole2.
  3. TABLES: sscrfields.
  4. SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.
  5. SELECTION-SCREEN BEGIN OF LINE.
  6. SELECTION-SCREEN COMMENT (28) text1.
  7. SELECTION-SCREEN POSITION 29.
  8. PARAMETERS p_prog TYPE programm.
  9. SELECTION-SCREEN PUSHBUTTON 74(10) gen USER-COMMAND gen.
  10. SELECTION-SCREEN END OF LINE.
  11. SELECTION-SCREEN BEGIN OF LINE.
  12. SELECTION-SCREEN COMMENT (28) text2.
  13. SELECTION-SCREEN POSITION 29.
  14. PARAMETERS p_addr TYPE char4 DEFAULT 'A2'.
  15. SELECTION-SCREEN END OF LINE.
  16. SELECTION-SCREEN BEGIN OF LINE.
  17. SELECTION-SCREEN COMMENT (28) text3.
  18. SELECTION-SCREEN POSITION 29.
  19. PARAMETERS p_fname TYPE filename LOWER CASE DEFAULT '导入模板.xls'.
  20. SELECTION-SCREEN END OF LINE.
  21. SELECTION-SCREEN ULINE.
  22. SELECTION-SCREEN COMMENT /1(79) cmt1.
  23. SELECTION-SCREEN COMMENT /1(79) cmt2.
  24. SELECTION-SCREEN COMMENT /1(79) cmt3.
  25. SELECTION-SCREEN COMMENT /1(79) cmt4.
  26. SELECTION-SCREEN COMMENT /1(79) cmt5.
  27. SELECTION-SCREEN COMMENT /1(79) cmt6.
  28. SELECTION-SCREEN END OF BLOCK 001.
  29. SELECTION-SCREEN FUNCTION KEY 1.
  30. SELECTION-SCREEN FUNCTION KEY 2.
  31. SELECTION-SCREEN FUNCTION KEY 3.
  32. SELECTION-SCREEN FUNCTION KEY 4.
  33. *----------------------------------------------------------------------*
  34. * CLASS lcl_alv_event_handler DEFINITION
  35. *----------------------------------------------------------------------*
  36. *
  37. *----------------------------------------------------------------------*
  38. CLASS lcl_alv_event_handler DEFINITION.
  39. PUBLIC SECTION.
  40. METHODS:
  41. handle_f4 FOR EVENT onf4
  42. OF cl_gui_alv_grid
  43. IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells.
  44. ENDCLASS. "lcl_alv_event_handler DEFINITION
  45. TYPES:
  46. BEGIN OF typ_field,
  47. fieldname TYPE fieldname,
  48. ref_table TYPE lvc_rtname,
  49. ref_field TYPE lvc_rfname,
  50. convexit TYPE convexit,
  51. scrtext_l TYPE scrtext_l,
  52. typ_field TYPE C LENGTH 60,
  53. mark TYPE C LENGTH 60,
  54. END OF typ_field.
  55. DATA:
  56. go_docking_con TYPE REF TO cl_gui_docking_container,
  57. go_alv_fields TYPE REF TO cl_gui_alv_grid,
  58. go_event_fields TYPE REF TO lcl_alv_event_handler.
  59. DATA:
  60. gt_fields TYPE TABLE OF typ_field,
  61. gs_field TYPE typ_field.
  62. DATA:
  63. gt_fieldcat_fields TYPE lvc_t_fcat,
  64. gs_fieldcat TYPE lvc_s_fcat,
  65. gt_f4_fields TYPE lvc_t_f4,
  66. gs_f4 TYPE lvc_s_f4,
  67. gt_exclude TYPE ui_functions,
  68. gs_layout TYPE lvc_s_layo.
  69. DATA:
  70. ok_code TYPE sy-ucomm,
  71. g_flag_error TYPE C,
  72. g_indxid TYPE indx_srtfd,
  73. gt_codes TYPE TABLE OF string,
  74. g_code TYPE string,
  75. go_excel TYPE ole2_object,
  76. go_books TYPE ole2_object,
  77. go_book TYPE ole2_object,
  78. go_sheet TYPE ole2_object,
  79. go_cell TYPE ole2_object,
  80. g_row TYPE I,
  81. g_col TYPE I,
  82. g_value TYPE string.
  83. DEFINE d_build_fieldcat.
  84. gs_fieldcat-fieldname = &3.
  85. gs_fieldcat-EDIT = &4.
  86. gs_fieldcat-CHECKBOX = &5.
  87. gs_fieldcat-f4availabl = &6.
  88. gs_fieldcat-outputlen = &7.
  89. gs_fieldcat-coltext = &8.
  90. APPEND gs_fieldcat TO &1.
  91. CLEAR gs_fieldcat.
  92. IF &6 = 'X'.
  93. gs_f4-fieldname = &3.
  94. gs_f4-register = 'X'.
  95. INSERT gs_f4 INTO TABLE &2.
  96. CLEAR gs_f4.
  97. ENDIF.
  98. END-OF-DEFINITION.
  99. DEFINE append_code.
  100. APPEND &1 TO gt_codes.
  101. END-OF-DEFINITION.
  102. *----------------------------------------------------------------------*
  103. * CLASS lcl_alv_event_handler IMPLEMENTATION
  104. *----------------------------------------------------------------------*
  105. *
  106. *----------------------------------------------------------------------*
  107. CLASS lcl_alv_event_handler IMPLEMENTATION .
  108. METHOD handle_f4.
  109. PERFORM handle_f4 USING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells.
  110. ENDMETHOD. "HANDLE_F4
  111. ENDCLASS. "lcl_alv_event_handler IMPLEMENTATION
  112. INITIALIZATION.
  113. title1 = '参数设置'.
  114. text1 = '程序(SMW0中模板文件ID与程序名相同)'.
  115. text2 = '数据区域的左上角地址'.
  116. text3 = '文件模板名称'.
  117. gen = '生成程序'.
  118. cmt1 = '说明:'.
  119. cmt2 = '1、请手动创建Report类型的程序,并激活'.
  120. cmt3 = '2、为使生成的程序可以“下载模板”的功能,请在SMW0中使用与程序名称相同的ID上传Excel模板'.
  121. cmt4 = '3、本程序自动COPY标准的ALV GUI状态到生成程序,但需要手动激活'.
  122. cmt5 = '4、需要手动为STATUS_ALV增加两个按钮IMPORT和ERRORS,用以“导入数据”和“显示错误”'.
  123. cmt6 = '5、程序中预留了调用BDC的Form,内有宏代码、示例代码'.
  124. sscrfields-functxt_01 = '保存设置'.
  125. sscrfields-functxt_02 = '加载设置'.
  126. sscrfields-functxt_03 = '下载到Excel'.
  127. sscrfields-functxt_04 = '从Excel上载'.
  128. AT SELECTION-SCREEN OUTPUT.
  129. CHECK go_docking_con IS INITIAL.
  130. "创建容器
  131. CREATE OBJECT go_docking_con
  132. EXPORTING
  133. ratio = 70
  134. side = cl_gui_docking_container=>dock_at_bottom.
  135. "创建FIELDS的ALV
  136. CREATE OBJECT go_alv_fields
  137. EXPORTING
  138. i_parent = go_docking_con.
  139. "事件响应
  140. CREATE OBJECT go_event_fields.
  141. SET HANDLER go_event_fields->handle_f4 FOR go_alv_fields.
  142. "显示ALV
  143. PERFORM alv_prepare_toolbar TABLES gt_exclude.
  144. PERFORM alv_prepare_layout CHANGING gs_layout.
  145. d_build_fieldcat:
  146. gt_fieldcat_fields gt_f4_fields 'FIELDNAME' 'X' ' ' ' ' 15 '字段名',
  147. gt_fieldcat_fields gt_f4_fields 'REF_TABLE' 'X' ' ' 'X' 16 '参照表',
  148. gt_fieldcat_fields gt_f4_fields 'REF_FIELD' 'X' ' ' 'X' 20 '参照字段',
  149. gt_fieldcat_fields gt_f4_fields 'CONVEXIT' 'X' ' ' 'X' 7 '转换例程',
  150. gt_fieldcat_fields gt_f4_fields 'SCRTEXT_L' 'X' ' ' ' ' 20 '字段描述'.
  151. gs_layout-grid_title = '字段设置'.
  152. CALL METHOD go_alv_fields->set_table_for_first_display
  153. EXPORTING
  154. it_toolbar_excluding = gt_exclude
  155. is_layout = gs_layout
  156. CHANGING
  157. it_outtab = gt_fields
  158. it_fieldcatalog = gt_fieldcat_fields.
  159. "注册事件
  160. go_alv_fields->register_f4_for_fields( EXPORTING it_f4 = gt_f4_fields ).
  161. go_alv_fields->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
  162. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
  163. PERFORM f4_prog.
  164. AT SELECTION-SCREEN.
  165. go_alv_fields->check_changed_data( ).
  166. g_indxid = p_prog && 'GB'.
  167. ok_code = sy-ucomm.
  168. CLEAR sy-ucomm.
  169. CASE ok_code.
  170. WHEN 'FC01'.
  171. EXPORT FIELDS = gt_fields TO DATABASE indx(st) ID g_indxid.
  172. WHEN 'FC02'.
  173. IMPORT FIELDS = gt_fields FROM DATABASE indx(st) ID g_indxid.
  174. PERFORM alv_refresh_display.
  175. WHEN 'FC03'.
  176. PERFORM download.
  177. WHEN 'FC04'.
  178. PERFORM upload.
  179. PERFORM alv_refresh_display.
  180. WHEN 'GEN'.
  181. PERFORM CHECK.
  182. CHECK g_flag_error IS INITIAL.
  183. PERFORM process_data.
  184. PERFORM GENERATE.
  185. ENDCASE.
  186. *&---------------------------------------------------------------------*
  187. *& Form alv_prepare_toolbar
  188. *&---------------------------------------------------------------------*
  189. * text
  190. *----------------------------------------------------------------------*
  191. FORM alv_prepare_toolbar TABLES pt_exclude TYPE ui_functions.
  192. REFRESH: pt_exclude.
  193. APPEND cl_gui_alv_grid=>mc_fc_maximum TO pt_exclude.
  194. APPEND cl_gui_alv_grid=>mc_fc_minimum TO pt_exclude.
  195. APPEND cl_gui_alv_grid=>mc_fc_subtot TO pt_exclude.
  196. APPEND cl_gui_alv_grid=>mc_fc_sum TO pt_exclude.
  197. APPEND cl_gui_alv_grid=>mc_fc_average TO pt_exclude.
  198. APPEND cl_gui_alv_grid=>mc_mb_sum TO pt_exclude.
  199. APPEND cl_gui_alv_grid=>mc_mb_subtot TO pt_exclude.
  200. APPEND cl_gui_alv_grid=>mc_fc_sort_asc TO pt_exclude.
  201. APPEND cl_gui_alv_grid=>mc_fc_sort_dsc TO pt_exclude.
  202. APPEND cl_gui_alv_grid=>mc_fc_find TO pt_exclude.
  203. APPEND cl_gui_alv_grid=>mc_fc_filter TO pt_exclude.
  204. APPEND cl_gui_alv_grid=>mc_fc_print TO pt_exclude.
  205. APPEND cl_gui_alv_grid=>mc_fc_print_prev TO pt_exclude.
  206. APPEND cl_gui_alv_grid=>mc_mb_export TO pt_exclude.
  207. APPEND cl_gui_alv_grid=>mc_fc_graph TO pt_exclude.
  208. APPEND cl_gui_alv_grid=>mc_mb_export TO pt_exclude.
  209. APPEND cl_gui_alv_grid=>mc_mb_view TO pt_exclude.
  210. APPEND cl_gui_alv_grid=>mc_fc_detail TO pt_exclude.
  211. APPEND cl_gui_alv_grid=>mc_fc_help TO pt_exclude.
  212. APPEND cl_gui_alv_grid=>mc_fc_info TO pt_exclude.
  213. APPEND cl_gui_alv_grid=>mc_mb_variant TO pt_exclude.
  214. APPEND cl_gui_alv_grid=>mc_fc_refresh TO pt_exclude.
  215. APPEND cl_gui_alv_grid=>mc_fc_check TO pt_exclude.
  216. APPEND cl_gui_alv_grid=>mc_fc_loc_copy TO pt_exclude.
  217. * APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row TO pt_exclude.
  218. * APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row TO pt_exclude.
  219. APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row TO pt_exclude.
  220. * APPEND cl_gui_alv_grid=>mc_fc_loc_append_row TO pt_exclude.
  221. APPEND cl_gui_alv_grid=>mc_fc_loc_undo TO pt_exclude.
  222. APPEND cl_gui_alv_grid=>mc_fc_loc_cut TO pt_exclude.
  223. APPEND cl_gui_alv_grid=>mc_mb_paste TO pt_exclude.
  224. ENDFORM. "alv_prepare_toolbar
  225. *&---------------------------------------------------------------------*
  226. *& Form alv_prepare_layout
  227. *&---------------------------------------------------------------------*
  228. * text
  229. *----------------------------------------------------------------------*
  230. * -->PS_LAYOUT text
  231. *----------------------------------------------------------------------*
  232. FORM alv_prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
  233. ps_layout-zebra = 'X'.
  234. ps_layout-sel_mode = 'A'.
  235. ps_layout-smalltitle = 'X'.
  236. ENDFORM. "alv_prepare_layout
  237. *&---------------------------------------------------------------------*
  238. *& Form handle_f4
  239. *&---------------------------------------------------------------------*
  240. * text
  241. *----------------------------------------------------------------------*
  242. FORM handle_f4 USING e_fieldname TYPE lvc_fname
  243. e_fieldvalue TYPE lvc_value
  244. es_row_no TYPE lvc_s_roid
  245. er_event_data TYPE REF TO cl_alv_event_data
  246. et_bad_cells TYPE lvc_t_modi.
  247. DATA: ls_row TYPE lvc_s_row,
  248. ls_col TYPE lvc_s_col,
  249. ls_modi TYPE lvc_s_modi,
  250. l_tabname TYPE tabname,
  251. l_fieldtext TYPE fieldtext,
  252. l_convexit TYPE convexit.
  253. FIELD-SYMBOLS: <lt_modi> TYPE lvc_t_modi.
  254. er_event_data->m_event_handled = 'X'.
  255. CASE e_fieldname.
  256. WHEN 'REF_TABLE'.
  257. PERFORM f4_dd_table(rsaqddic) USING 'SAPLAQJD_CNTRL'
  258. '0300'
  259. 'G_DYN_0300-TNAME'
  260. CHANGING e_fieldvalue. "搜索帮助代码,来于SQVI中“插入表”的搜索帮助
  261. WHEN 'REF_FIELD'.
  262. READ TABLE gt_fields INDEX es_row_no-row_id INTO gs_field.
  263. CHECK gs_field-ref_table IS NOT INITIAL.
  264. l_tabname = gs_field-ref_table.
  265. l_fieldtext = gs_field-scrtext_l.
  266. l_convexit = gs_field-convexit.
  267. PERFORM f4_field USING l_tabname CHANGING e_fieldvalue l_fieldtext l_convexit.
  268. WHEN 'CONVEXIT'.
  269. PERFORM f4_convexit CHANGING e_fieldvalue.
  270. WHEN OTHERS.
  271. EXIT.
  272. ENDCASE.
  273. ASSIGN er_event_data->m_data->* TO <lt_modi>.
  274. ls_modi-row_id = es_row_no-row_id."
  275. ls_modi-fieldname = e_fieldname.
  276. ls_modi-VALUE = e_fieldvalue.
  277. APPEND ls_modi TO <lt_modi>.
  278. IF e_fieldname = 'REF_FIELD'.
  279. ls_modi-row_id = es_row_no-row_id."
  280. ls_modi-fieldname = 'SCRTEXT_L'.
  281. ls_modi-VALUE = l_fieldtext.
  282. APPEND ls_modi TO <lt_modi>.
  283. ls_modi-row_id = es_row_no-row_id."
  284. ls_modi-fieldname = 'CONVEXIT'.
  285. ls_modi-VALUE = l_convexit.
  286. APPEND ls_modi TO <lt_modi>.
  287. ENDIF.
  288. ENDFORM. "handle_f4
  289. *&---------------------------------------------------------------------*
  290. *& Form F4_PROG
  291. *&---------------------------------------------------------------------*
  292. * 程序名称的搜索帮助(同SE38)
  293. *----------------------------------------------------------------------*
  294. FORM f4_prog .
  295. DATA: lt_dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.
  296. lt_dynpfields-fieldname = 'P_PROG'.
  297. APPEND lt_dynpfields.
  298. CALL FUNCTION 'DYNP_VALUES_READ'
  299. EXPORTING
  300. dyname = sy-repid
  301. dynumb = sy-dynnr
  302. TABLES
  303. dynpfields = lt_dynpfields[].
  304. READ TABLE lt_dynpfields INDEX 1.
  305. p_prog = lt_dynpfields-fieldvalue.
  306. CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
  307. EXPORTING
  308. object_type = 'PROG'
  309. object_name = p_prog
  310. suppress_selection = 'X'
  311. IMPORTING
  312. object_name_selected = p_prog
  313. EXCEPTIONS
  314. cancel = 01.
  315. ENDFORM. " F4_PROG
  316. *&---------------------------------------------------------------------*
  317. *& Form PROCESS_DATA
  318. *&---------------------------------------------------------------------*
  319. * 处理数据
  320. *----------------------------------------------------------------------*
  321. FORM process_data .
  322. LOOP AT gt_fields INTO gs_field.
  323. IF gs_field-ref_table IS INITIAL.
  324. gs_field-typ_field = gs_field-ref_field.
  325. ELSE.
  326. gs_field-typ_field = gs_field-ref_table && '-' && gs_field-ref_field.
  327. ENDIF.
  328. CONCATENATE ' "' gs_field-scrtext_l INTO gs_field-mark.
  329. MODIFY gt_fields FROM gs_field TRANSPORTING typ_field mark.
  330. ENDLOOP.
  331. ENDFORM. " PROCESS_DATA
  332. *&---------------------------------------------------------------------*
  333. *& Form generate
  334. *&---------------------------------------------------------------------*
  335. * 生成程序
  336. *----------------------------------------------------------------------*
  337. FORM GENERATE.
  338. DATA: l_rc(5).
  339. REFRESH gt_codes.
  340. CHECK p_prog(1) = 'Y' OR p_prog(1) = 'Z'.
  341. IF STRLEN( p_prog ) > 20.
  342. MESSAGE '程序名长度不能超过20' TYPE 'E' DISPLAY LIKE 'I'. "主要是因为EXPORT TO DATABASEINDXID的长度为22位的限制
  343. ENDIF.
  344. SELECT SINGLE progname INTO p_prog FROM reposrc WHERE progname = p_prog.
  345. IF sy-subrc = 0.
  346. * MESSAGE '程序已经存在' TYPE 'E' DISPLAY LIKE 'I'.
  347. ENDIF.
  348. "程序名
  349. PERFORM gen_report_name.
  350. "TYPE-POOLSTABLES
  351. PERFORM gen_includes.
  352. "SELECTION-SCREEN
  353. PERFORM gen_selection_screen.
  354. "类型定义
  355. PERFORM gen_types.
  356. "数据定义
  357. PERFORM gen_data_defination.
  358. "宏定义
  359. PERFORM gen_macro_defination.
  360. "初始化
  361. PERFORM gen_initialization.
  362. "AT SELECTION-SCREEN
  363. PERFORM gen_at_selection_screen.
  364. "START-OF-SELECTION
  365. PERFORM gen_start_of_selection.
  366. "FORM CHECK_AUTH
  367. PERFORM gen_form_check_auth.
  368. "FORM UPLOAD_DATA
  369. PERFORM gen_form_upload_data.
  370. "FORM CHECK_DATA
  371. PERFORM gen_form_check_data.
  372. "FORM SELECT_EXCEL_FILE
  373. PERFORM gen_form_select_excel_file.
  374. "FORM SET_STATUS_BAR
  375. PERFORM gen_form_set_status_bar.
  376. "FORM DOWNLOAD_TEMPLATE
  377. PERFORM gen_form_download_template.
  378. "FORM DISPLAY_DATA
  379. PERFORM gen_form_display_data.
  380. "FORM PF_STATUS_ALV
  381. PERFORM gen_form_pf_status_alv.
  382. "FORM USER_COMMAND_ALV
  383. PERFORM gen_form_user_command_alv.
  384. "FORM CALL_BDC
  385. PERFORM gen_form_call_bdc.
  386. INSERT REPORT p_prog FROM gt_codes.
  387. PERFORM copy_status_diff_progs_new IN PROGRAM saplsmpe IF FOUND
  388. USING 'X' 'SAPLKKBL' p_prog 'STANDARD_FULLSCREEN' 'STATUS_ALV'
  389. CHANGING l_rc.
  390. ENDFORM. "GENERATE
  391. *&---------------------------------------------------------------------*
  392. *& Form GEN_REPORT_NAME
  393. *&---------------------------------------------------------------------*
  394. * text
  395. *----------------------------------------------------------------------*
  396. FORM gen_report_name .
  397. CONCATENATE 'REPORT' p_prog INTO g_code SEPARATED BY space.
  398. g_code = g_code && '.'.
  399. append_code: g_code, ''.
  400. ENDFORM. " GEN_REPORT_NAME
  401. *&---------------------------------------------------------------------*
  402. *& Form GEN_INCLUDES
  403. *&---------------------------------------------------------------------*
  404. * text
  405. *----------------------------------------------------------------------*
  406. FORM gen_includes .
  407. append_code:
  408. 'TYPE-POOLS:OLE2. ',
  409. ' ',
  410. 'TABLES: SSCRFIELDS. ',
  411. ' '.
  412. ENDFORM. " GEN_INCLUDES
  413. *&---------------------------------------------------------------------*
  414. *& Form GEN_SELECTION_SCREEN
  415. *&---------------------------------------------------------------------*
  416. * text
  417. *----------------------------------------------------------------------*
  418. FORM gen_selection_screen .
  419. append_code:
  420. 'SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE TITLE1. ',
  421. 'PARAMETERS P_FILE TYPE C LENGTH 1024 LOWER CASE. ',
  422. 'SELECTION-SCREEN END OF BLOCK 001. ',
  423. 'SELECTION-SCREEN FUNCTION KEY 1. ',
  424. ' '.
  425. ENDFORM. " GEN_SELECTION_SCREEN
  426. *&---------------------------------------------------------------------*
  427. *& Form GEN_TYPES
  428. *&---------------------------------------------------------------------*
  429. * text
  430. *----------------------------------------------------------------------*
  431. FORM gen_types .
  432. DATA: l_mark TYPE C LENGTH 60.
  433. append_code:
  434. 'TYPES:',
  435. ' BEGIN OF TY_EXCEL,'.
  436. LOOP AT gt_fields INTO gs_field.
  437. CONCATENATE gs_field-fieldname 'TYPE' gs_field-typ_field INTO g_code SEPARATED BY space.
  438. CONCATENATE g_code ',' gs_field-mark INTO g_code.
  439. SHIFT g_code RIGHT BY 4 PLACES.
  440. append_code g_code.
  441. ENDLOOP.
  442. append_code:
  443. ' END OF TY_EXCEL, ',
  444. ' ',
  445. ' BEGIN OF TY_ALV, ',
  446. ' SEL TYPE C. ',
  447. ' INCLUDE TYPE TY_EXCEL. ',
  448. 'TYPES: ',
  449. ' END OF TY_ALV. ',
  450. ' '.
  451. ENDFORM. " GEN_TYPES
  452. *&---------------------------------------------------------------------*
  453. *& Form GEN_DATA_DEFINATION
  454. *&---------------------------------------------------------------------*
  455. * text
  456. *----------------------------------------------------------------------*
  457. FORM gen_data_defination .
  458. append_code:
  459. 'DATA: GT_FIELDCAT TYPE LVC_T_FCAT, ',
  460. ' GS_FIELDCAT TYPE LVC_S_FCAT, ',
  461. ' GS_LAYOUT TYPE LVC_S_LAYO, ',
  462. ' G_OBJID LIKE WWWDATA-OBJID VALUE SY-REPID, ',
  463. ' GS_EXCEL TYPE TY_EXCEL, ',
  464. ' GT_EXCEL TYPE TABLE OF TY_EXCEL, ',
  465. ' GS_ALV TYPE TY_ALV, ',
  466. ' GT_ALV TYPE TABLE OF TY_ALV. ',
  467. ' '.
  468. ENDFORM. " GEN_DATA_DEFINATION
  469. *&---------------------------------------------------------------------*
  470. *& Form gen_macro_defination
  471. *&---------------------------------------------------------------------*
  472. * text
  473. *----------------------------------------------------------------------*
  474. FORM gen_macro_defination .
  475. append_code:
  476. 'DEFINE D_BUILD_FIELDCAT. ',
  477. ' GS_FIELDCAT-FIELDNAME = &1. ',
  478. ' GS_FIELDCAT-QFIELDNAME = &2. ',
  479. ' GS_FIELDCAT-CFIELDNAME = &3. ',
  480. ' GS_FIELDCAT-REF_TABLE = &4. ',
  481. ' GS_FIELDCAT-REF_FIELD = &5. ',
  482. ' GS_FIELDCAT-CONVEXIT = &6. ',
  483. ' GS_FIELDCAT-EMPHASIZE = &7. ',
  484. ' GS_FIELDCAT-SCRTEXT_L = &8. ',
  485. ' GS_FIELDCAT-COLDDICTXT = ''L''. ',
  486. ' APPEND GS_FIELDCAT TO GT_FIELDCAT. ',
  487. ' CLEAR: GS_FIELDCAT. ',
  488. 'END-OF-DEFINITION. ',
  489. ' '.
  490. ENDFORM. "gen_macro_defination
  491. *&---------------------------------------------------------------------*
  492. *& Form GEN_INITIALIZATION
  493. *&---------------------------------------------------------------------*
  494. * text
  495. *----------------------------------------------------------------------*
  496. FORM gen_initialization .
  497. append_code:
  498. 'INITIALIZATION. ',
  499. ' TITLE1 = ''选择条件''. ',
  500. ' %_P_FILE_%_APP_%-TEXT = ''选择文件''. ',
  501. ' SSCRFIELDS-FUNCTXT_01 = ''@49@下载模板''. ',
  502. ' '.
  503. ENDFORM. " GEN_INITIALIZATION
  504. *&---------------------------------------------------------------------*
  505. *& Form GEN_AT_SELECTION_SCREEN
  506. *&---------------------------------------------------------------------*
  507. * text
  508. *----------------------------------------------------------------------*
  509. FORM gen_at_selection_screen .
  510. append_code:
  511. 'AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. ',
  512. ' PERFORM SELECT_EXCEL_FILE CHANGING P_FILE. ',
  513. ' ',
  514. 'AT SELECTION-SCREEN. ',
  515. ' CASE SSCRFIELDS-UCOMM. ',
  516. ' WHEN ''FC01''. '.
  517. CONCATENATE ' PERFORM DOWNLOAD_TEMPLATE USING G_OBJID ''XLS'' ''' p_fname '''.' INTO g_code.
  518. append_code g_code.
  519. append_code:
  520. ' ENDCASE. ',
  521. ' ',
  522. ' "检查权限 ',
  523. ' PERFORM CHECK_AUTH. ',
  524. ' '.
  525. ENDFORM. "GEN_AT_SELECTION_SCREEN
  526. *&---------------------------------------------------------------------*
  527. *& Form GEN_START_OF_SELECTION
  528. *&---------------------------------------------------------------------*
  529. * text
  530. *----------------------------------------------------------------------*
  531. FORM gen_start_of_selection .
  532. append_code:
  533. 'START-OF-SELECTION. ',
  534. ' IF P_FILE IS INITIAL. ',
  535. ' MESSAGE ''请选择文件'' TYPE ''S''. ',
  536. ' LEAVE LIST-PROCESSING. ',
  537. ' ENDIF. ',
  538. ' ',
  539. ' "读取文件 '.
  540. CONCATENATE ' PERFORM UPLOAD_DATA USING ''' p_addr '''. "数据开始的单元格,可根据实际情况更改' INTO g_code.
  541. append_code g_code.
  542. append_code:
  543. ' PERFORM CHECK_DATA. ',
  544. ' PERFORM DISPLAY_DATA. ',
  545. ' '.
  546. ENDFORM. " GEN_START_OF_SELECTION
  547. *&---------------------------------------------------------------------*
  548. *& Form GEN_FORM_CHECK_AUTH
  549. *&---------------------------------------------------------------------*
  550. * text
  551. *----------------------------------------------------------------------*
  552. FORM gen_form_check_auth.
  553. append_code:
  554. '*&---------------------------------------------------------------------*',
  555. '*& FORM CHECK_AUTH ',
  556. '*&---------------------------------------------------------------------*',
  557. '* 检查权限 ',
  558. '*----------------------------------------------------------------------*',
  559. 'FORM CHECK_AUTH. ',
  560. '* AUTHORITY-CHECK OBJECT ''M_BANF_WRK'' ',
  561. '* ID ''ACTVT'' FIELD ''01'' ',
  562. '* ID ''WERKS'' FIELD P_WERKS. ',
  563. '* IF SY-SUBRC <> 0. ',
  564. '* MESSAGE ''您没有该工厂的操作权限'' TYPE ''E''. ',
  565. '* ENDIF. ',
  566. 'ENDFORM. "CHECK_AUTH '.
  567. ENDFORM. "GEN_FORM_CHECK_AUTH
  568. *&---------------------------------------------------------------------*
  569. *& Form GEN_FORM_UPLOAD_DATA
  570. *&---------------------------------------------------------------------*
  571. * text
  572. *----------------------------------------------------------------------*
  573. FORM gen_form_upload_data .
  574. append_code:
  575. '*&---------------------------------------------------------------------*',
  576. '*& FORM UPLOAD_DATA ',
  577. '*&---------------------------------------------------------------------*',
  578. '* TEXT ',
  579. '*----------------------------------------------------------------------*',
  580. 'FORM UPLOAD_DATA USING P_TOP_LEFT_ADDR TYPE STRING. ',
  581. ' ',
  582. ' DATA: BEGIN OF LT_LINES OCCURS 0, ',
  583. ' ROW(4096) TYPE C, ',
  584. ' END OF LT_LINES, ',
  585. ' BEGIN OF LT_FIELDS OCCURS 0, ',
  586. ' VALUE(500) TYPE C, ',
  587. ' END OF LT_FIELDS, ',
  588. ' LO_EXCEL TYPE OLE2_OBJECT, ',
  589. ' LO_BOOKS TYPE OLE2_OBJECT, ',
  590. ' LO_BOOK TYPE OLE2_OBJECT, ',
  591. ' LO_SHEET TYPE OLE2_OBJECT, ',
  592. ' LO_USEDRANGE TYPE OLE2_OBJECT, ',
  593. ' LO_USEDROWS TYPE OLE2_OBJECT, ',
  594. ' LO_USEDCOLS TYPE OLE2_OBJECT, ',
  595. ' LO_CELL_BOTTOM_RIGHT TYPE OLE2_OBJECT, ',
  596. ' LO_RANGE TYPE OLE2_OBJECT, ',
  597. ' LO_CELL_TOP_LEFT TYPE OLE2_OBJECT, ',
  598. ' L_TOPROW TYPE I, ',
  599. ' L_LEFTCOL TYPE I, ',
  600. ' L_USEDROWS TYPE I, ',
  601. ' L_USEDCOLS TYPE I, ',
  602. ' L_MAXROW TYPE I, ',
  603. ' L_MAXCOL TYPE I, ',
  604. ' L_ADDR TYPE STRING, ',
  605. ' L_ROWINDEX TYPE STRING, ',
  606. ' L_COUNT TYPE STRING, ',
  607. ' L_MSG TYPE STRING. ',
  608. ' FIELD-SYMBOLS <L_FIELDVALUE> TYPE ANY. ',
  609. ' ',
  610. ' "创建EXCEL程序 ',
  611. ' CREATE OBJECT LO_EXCEL ''EXCEL.APPLICATION''. ',
  612. ' IF SY-SUBRC <> 0. ',
  613. ' MESSAGE ''创建EXCEL APPLICATION失败!'' TYPE ''S'' DISPLAY LIKE ''E''.',
  614. ' LEAVE LIST-PROCESSING. ',
  615. ' ENDIF. ',
  616. ' ',
  617. ' "打开EXCEL文件 ',
  618. ' CALL METHOD OF LO_EXCEL ''WORKBOOKS'' = LO_BOOKS. ',
  619. ' CALL METHOD OF LO_BOOKS ''OPEN'' = LO_BOOK ',
  620. ' EXPORTING ',
  621. ' #1 = P_FILE. ',
  622. ' IF SY-SUBRC <> 0. ',
  623. ' MESSAGE ''打开EXCEL文件失败!'' TYPE ''S'' DISPLAY LIKE ''E''. ',
  624. ' LEAVE LIST-PROCESSING. ',
  625. ' ENDIF. ',
  626. ' ',
  627. ' "取最大行和最大列 ',
  628. ' CALL METHOD OF LO_EXCEL ''ACTIVESHEET'' = LO_SHEET. ',
  629. ' CALL METHOD OF LO_SHEET ''USEDRANGE'' = LO_USEDRANGE. ',
  630. ' GET PROPERTY OF LO_USEDRANGE ''ROW'' = L_TOPROW. ',
  631. ' GET PROPERTY OF LO_USEDRANGE ''COLUMN'' = L_LEFTCOL. ',
  632. ' CALL METHOD OF LO_USEDRANGE ''ROWS'' = LO_USEDROWS. ',
  633. ' GET PROPERTY OF LO_USEDROWS ''COUNT'' = L_USEDROWS. ',
  634. ' CALL METHOD OF LO_USEDRANGE ''COLUMNS'' = LO_USEDCOLS. ',
  635. ' GET PROPERTY OF LO_USEDCOLS ''COUNT'' = L_USEDCOLS. ',
  636. ' L_MAXROW = L_TOPROW + L_USEDROWS - 1. ',
  637. ' L_MAXCOL = L_LEFTCOL + L_USEDCOLS - 1. ',
  638. ' ',
  639. ' "确定数据范围 ',
  640. ' CALL METHOD OF LO_SHEET ''CELLS'' = LO_CELL_BOTTOM_RIGHT ',
  641. ' EXPORTING ',
  642. ' #1 = L_MAXROW ',
  643. ' #2 = L_MAXCOL. ',
  644. ' CALL METHOD OF LO_SHEET ''RANGE'' = LO_RANGE ',
  645. ' EXPORTING ',
  646. ' #1 = P_TOP_LEFT_ADDR ',
  647. ' #2 = LO_CELL_BOTTOM_RIGHT. ',
  648. ' GET PROPERTY OF LO_RANGE ''ROW'' = L_TOPROW. ',
  649. ' GET PROPERTY OF LO_RANGE ''COLUMN'' = L_LEFTCOL. ',
  650. ' CALL METHOD OF LO_SHEET ''CELLS'' = LO_CELL_TOP_LEFT ',
  651. ' EXPORTING ',
  652. ' #1 = L_TOPROW ',
  653. ' #2 = L_LEFTCOL. ',
  654. ' GET PROPERTY OF LO_CELL_TOP_LEFT ''ADDRESS'' = L_ADDR ',
  655. ' EXPORTING ',
  656. ' #1 = 0 ',
  657. ' #2 = 0. ',
  658. ' IF L_ADDR <> P_TOP_LEFT_ADDR. "无数据 ',
  659. ' CALL METHOD OF LO_BOOK ''CLOSE''. ',
  660. ' CALL METHOD OF LO_EXCEL ''QUIT''. ',
  661. ' MESSAGE ''文件中无有效数据!'' TYPE ''S'' DISPLAY LIKE ''E''. ',
  662. ' LEAVE LIST-PROCESSING. ',
  663. ' ENDIF. ',
  664. ' ',
  665. ' "替换CHR(13)+CHR(10) WITH CHR(10) 【CHR(13)属于EXCEL单元格内容中的非正常输入字符,必会导致ABAP内表数据串行】',
  666. ' SET PROPERTY OF LO_EXCEL ''DISPLAYALERTS'' = 0. ',
  667. ' CALL METHOD OF LO_RANGE ''REPLACE'' ',
  668. ' EXPORTING ',
  669. ' #1 = CL_ABAP_CHAR_UTILITIES=>CR_LF "000D000A CHR(13) + CHR(10)',
  670. ' #2 = CL_ABAP_CHAR_UTILITIES=>NEWLINE. "000A CHR(10)',
  671. ' ',
  672. ' "复制数据 ',
  673. ' CALL METHOD OF LO_RANGE ''COPY''. ',
  674. ' CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT ',
  675. ' IMPORTING ',
  676. ' DATA = LT_LINES[] ',
  677. ' EXCEPTIONS ',
  678. ' OTHERS = 1. ',
  679. ' ',
  680. ' "关闭EXCEL ',
  681. ' CALL METHOD OF LO_BOOK ''CLOSE''. ',
  682. ' CALL METHOD OF LO_EXCEL ''QUIT''. ',
  683. ' ',
  684. ' "拆分数据 ',
  685. ' LOOP AT LT_LINES. ',
  686. ' L_ROWINDEX = SY-TABIX + L_TOPROW - 1. ',
  687. ' SPLIT LT_LINES-ROW AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE LT_FIELDS.',
  688. ' LOOP AT LT_FIELDS. ',
  689. ' L_COUNT = SY-TABIX. ',
  690. ' ASSIGN COMPONENT SY-TABIX OF STRUCTURE GS_EXCEL TO <L_FIELDVALUE>.',
  691. ' CHECK SY-SUBRC = 0. ',
  692. ' CATCH SYSTEM-EXCEPTIONS CONVT_NO_NUMBER = 1 OTHERS = 2. ',
  693. ' <L_FIELDVALUE> = LT_FIELDS-VALUE. ',
  694. ' ENDCATCH. ',
  695. ' IF SY-SUBRC <> 0. ',
  696. ' CONCATENATE ''第'' L_ROWINDEX ''行中第'' L_COUNT ''个字段的值'' GS_FIELDCAT-FIELDNAME ''在格式转换时出错,请检查!'' INTO L_MSG.',
  697. ' MESSAGE L_MSG TYPE ''S'' DISPLAY LIKE ''E''. ',
  698. ' LEAVE LIST-PROCESSING. ',
  699. ' ENDIF. ',
  700. ' UNASSIGN <L_FIELDVALUE>. ',
  701. ' ENDLOOP. ',
  702. ' ',
  703. ' APPEND GS_EXCEL TO GT_EXCEL. ',
  704. ' CLEAR GS_EXCEL. ',
  705. ' ENDLOOP. ',
  706. 'ENDFORM. "UPLOAD_DATA '.
  707. ENDFORM. " GEN_FORM_UPLOAD_DATA
  708. *&---------------------------------------------------------------------*
  709. *& Form GEN_FORM_CHECK_DATA
  710. *&---------------------------------------------------------------------*
  711. * text
  712. *----------------------------------------------------------------------*
  713. FORM gen_form_check_data .
  714. append_code:
  715. '*&---------------------------------------------------------------------*',
  716. '*& FORM CHECK_DATA ',
  717. '*&---------------------------------------------------------------------*',
  718. '* TEXT ',
  719. '*----------------------------------------------------------------------*',
  720. 'FORM CHECK_DATA. ',
  721. ' DATA: L_FLAG TYPE C, ',
  722. ' L_TABIX TYPE I, ',
  723. ' L_MSG TYPE STRING, ',
  724. ' L_VALUE TYPE STRING, ',
  725. ' L_INDEX TYPE I VALUE 1. ',
  726. ' ',
  727. ' DEFINE D_STORE_MESSAGE. ',
  728. ' L_FLAG = ''X''. ',
  729. ' CALL FUNCTION ''MESSAGE_STORE'' ',
  730. ' EXPORTING ',
  731. ' ARBGB = &1 ',
  732. ' MSGTY = &2 ',
  733. ' TXTNR = &3 ',
  734. ' MSGV1 = &4 ',
  735. ' MSGV2 = &5 ',
  736. ' MSGV3 = &6 ',
  737. ' MSGV4 = &7 ',
  738. ' ZEILE = L_INDEX. ',
  739. ' L_INDEX = L_INDEX + 1. ',
  740. ' END-OF-DEFINITION. ',
  741. ' ',
  742. ' CALL FUNCTION ''MESSAGES_INITIALIZE''. ',
  743. ' ',
  744. ' LOOP AT GT_EXCEL INTO GS_EXCEL. '.
  745. LOOP AT gt_fields INTO gs_field.
  746. CHECK gs_field-convexit IS NOT INITIAL.
  747. CONCATENATE ' "' gs_field-scrtext_l '-转码' INTO g_code.
  748. append_code g_code.
  749. CONCATENATE ' CALL FUNCTION ''CONVERSION_EXIT_' gs_field-convexit '_INPUT''' INTO g_code.
  750. append_code g_code.
  751. append_code ' EXPORTING'.
  752. CONCATENATE ' INPUT = GS_EXCEL-' gs_field-fieldname INTO g_code.
  753. append_code g_code.
  754. append_code:
  755. ' IMPORTING ',
  756. ' OUTPUT = L_VALUE ',
  757. ' EXCEPTIONS ',
  758. ' LENGTH_ERROR = 1 ',
  759. ' OTHERS = 2. ',
  760. ' IF SY-SUBRC <> 0. ',
  761. ' ENDIF. ',
  762. ' '.
  763. ENDLOOP.
  764. append_code:
  765. '* 示例 ',
  766. '* L_MSG = '''' && L_TABIX && ''行的采购申请编码不能为空''. ',
  767. '* D_STORE_MESSAGE: ''00'' ''E'' ''001'' L_MSG '''' '''' ''''. ',
  768. ' ',
  769. ' MOVE-CORRESPONDING GS_EXCEL TO GS_ALV. ',
  770. ' APPEND GS_ALV TO GT_ALV. ',
  771. ' CLEAR GS_ALV. ',
  772. ' ENDLOOP. ',
  773. ' ',
  774. ' IF L_FLAG = ''X''. ',
  775. ' CALL FUNCTION ''MESSAGES_SHOW''. ',
  776. ' LEAVE LIST-PROCESSING. ',
  777. ' ENDIF. ',
  778. 'ENDFORM. "CHECK_DATA '.
  779. ENDFORM. "GEN_FORM_CHECK_DATA ',
  780. *&---------------------------------------------------------------------*
  781. *& Form GEN_FORM_SELECT_EXCEL_FILE
  782. *&---------------------------------------------------------------------*
  783. * text
  784. *----------------------------------------------------------------------*
  785. FORM gen_form_select_excel_file .
  786. append_code:
  787. '*&---------------------------------------------------------------------*',
  788. '*& FORM SELECT_EXCEL_FILE ',
  789. '*&---------------------------------------------------------------------*',
  790. '* TEXT ',
  791. '*----------------------------------------------------------------------*',
  792. 'FORM SELECT_EXCEL_FILE CHANGING P_FILE. ',
  793. ' DATA: LT_FILETABLE TYPE FILETABLE WITH HEADER LINE, ',
  794. ' L_RC TYPE I, ',
  795. ' L_ACTION TYPE I. ',
  796. ' ',
  797. ' CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG ',
  798. ' EXPORTING ',
  799. ' DEFAULT_EXTENSION = ''XLS'' ',
  800. ' DEFAULT_FILENAME = ''*.XLS;*.XLSX'' ',
  801. ' FILE_FILTER = ''EXCEL FILE (*.XLS;*.XLSX)'' ',
  802. ' MULTISELECTION = '''' ',
  803. ' CHANGING ',
  804. ' FILE_TABLE = LT_FILETABLE[] ',
  805. ' RC = L_RC ',
  806. ' USER_ACTION = L_ACTION ',
  807. ' EXCEPTIONS ',
  808. ' OTHERS = 1. ',
  809. ' IF L_ACTION NE 0. ',
  810. ' EXIT. ',
  811. ' ENDIF. ',
  812. ' ',
  813. ' READ TABLE LT_FILETABLE INDEX 1. ',
  814. ' P_FILE = LT_FILETABLE-FILENAME. ',
  815. 'ENDFORM. "SELECT_EXCEL_FILE '.
  816. ENDFORM. " GEN_FORM_SELECT_EXCEL_FILE
  817. *&---------------------------------------------------------------------*
  818. *& Form gen_form_set_status_bar
  819. *&---------------------------------------------------------------------*
  820. * text
  821. *----------------------------------------------------------------------*
  822. FORM gen_form_set_status_bar.
  823. append_code:
  824. '*&---------------------------------------------------------------------*',
  825. '*& FORM SET_STATUS_BAR ',
  826. '*&---------------------------------------------------------------------*',
  827. '* TEXT ',
  828. '*----------------------------------------------------------------------*',
  829. 'FORM SET_STATUS_BAR USING P_PERCENT P_MESSAGE. ',
  830. ' CALL FUNCTION ''SAPGUI_PROGRESS_INDICATOR'' ',
  831. ' EXPORTING ',
  832. ' PERCENTAGE = P_PERCENT ',
  833. ' TEXT = P_MESSAGE. ',
  834. 'ENDFORM. "SET_STATUS_BAR '.
  835. ENDFORM. "gen_form_set_status_bar ',
  836. *&---------------------------------------------------------------------*
  837. *& Form gen_form_download_template
  838. *&---------------------------------------------------------------------*
  839. * text
  840. *----------------------------------------------------------------------*
  841. FORM gen_form_download_template.
  842. append_code:
  843. '*&---------------------------------------------------------------------*',
  844. '*& FORM DOWNLOAD_TEMPLATE ',
  845. '*&---------------------------------------------------------------------*',
  846. '* 下载模板用 ',
  847. '* P_OBJID: SMW0中的文件ID ',
  848. '* P_EXTENSION: 文件扩展名,如XLS、DOC ',
  849. '* P_DEFAULT_FILENAME: 默认文件名 ',
  850. '*----------------------------------------------------------------------*',
  851. 'FORM DOWNLOAD_TEMPLATE USING P_OBJID P_EXTENSION P_DEFAULT_FILENAME. ',
  852. ' DATA: L_FILENAME TYPE STRING, ',
  853. ' L_FULLPATH TYPE STRING, ',
  854. ' L_PATH TYPE STRING, ',
  855. ' LS_OBJDATA TYPE WWWDATATAB, ',
  856. ' L_DESTINATION TYPE RLGRAP-FILENAME, ',
  857. ' L_RC TYPE I. ',
  858. ' ',
  859. ' SELECT SINGLE RELID OBJID INTO CORRESPONDING FIELDS OF LS_OBJDATA FROM WWWDATA WHERE SRTF2 = 0 AND RELID = ''MI'' AND OBJID = P_OBJID.',
  860. ' IF SY-SUBRC <> 0. ',
  861. ' MESSAGE ''模板文件不存在'' TYPE ''E''. ',
  862. ' ENDIF. ',
  863. ' ',
  864. ' CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG ',
  865. ' EXPORTING ',
  866. ' DEFAULT_EXTENSION = P_EXTENSION ',
  867. ' DEFAULT_FILE_NAME = P_DEFAULT_FILENAME ',
  868. ' CHANGING ',
  869. ' FILENAME = L_FILENAME ',
  870. ' PATH = L_PATH ',
  871. ' FULLPATH = L_FULLPATH ',
  872. ' EXCEPTIONS ',
  873. ' OTHERS = 1. ',
  874. ' IF L_FULLPATH = ''''. ',
  875. ' MESSAGE ''没有选择文件'' TYPE ''E''. ',
  876. ' ENDIF. ',
  877. ' ',
  878. ' IF STRLEN( L_FULLPATH ) > 128. ',
  879. ' MESSAGE ''文件名长度超出128,请重新选择文件'' TYPE ''S'' DISPLAY LIKE ''E''.',
  880. ' STOP. ',
  881. ' ENDIF. ',
  882. ' ',
  883. ' L_DESTINATION = L_FULLPATH. ',
  884. ' CALL FUNCTION ''DOWNLOAD_WEB_OBJECT'' ',
  885. ' EXPORTING ',
  886. ' KEY = LS_OBJDATA ',
  887. ' DESTINATION = L_DESTINATION ',
  888. ' IMPORTING ',
  889. ' RC = L_RC. ',
  890. ' IF L_RC <> 0. ',
  891. ' MESSAGE ''导入模板下载失败'' TYPE ''E''. ',
  892. ' ENDIF. ',
  893. 'ENDFORM. "DOWNLOAD_TEMPLATE '.
  894. ENDFORM. "gen_form_download_template
  895. *&---------------------------------------------------------------------*
  896. *& Form GEN_FORM_DISPLAY_DATA
  897. *&---------------------------------------------------------------------*
  898. * text
  899. *----------------------------------------------------------------------*
  900. FORM gen_form_display_data .
  901. append_code:
  902. '*&---------------------------------------------------------------------*',
  903. '*& FORM DISPLAY_DATA ',
  904. '*&---------------------------------------------------------------------*',
  905. '* 显示数据 ',
  906. '*----------------------------------------------------------------------*',
  907. 'FORM DISPLAY_DATA. ',
  908. ' D_BUILD_FIELDCAT: ',
  909. '* 字段 单位字段 金额字段 参照表 参照字段 转码 列颜色 描述'.
  910. LOOP AT gt_fields INTO gs_field.
  911. IF sy-tabix = LINES( gt_fields ).
  912. g_code = '.'.
  913. ELSE.
  914. g_code = ','.
  915. ENDIF.
  916. CONCATENATE ' ''' gs_field-fieldname ''' ''' ''' ''' ''' '''
  917. gs_field-ref_table ''' ''' gs_field-ref_field ''' ''' gs_field-convexit ''' ''' ''' '''
  918. gs_field-scrtext_l ''''
  919. g_code
  920. INTO g_code.
  921. append_code g_code.
  922. ENDLOOP.
  923. append_code ''.
  924. "LAYOUT
  925. append_code:
  926. ' GS_LAYOUT-CWIDTH_OPT = ''X''.',
  927. ' GS_LAYOUT-BOX_FNAME = ''SEL''.',
  928. ''.
  929. append_code:
  930. ' CALL FUNCTION ''REUSE_ALV_GRID_DISPLAY_LVC'' ',
  931. ' EXPORTING ',
  932. ' I_CALLBACK_PROGRAM = SY-REPID ',
  933. ' I_CALLBACK_PF_STATUS_SET = ''PF_STATUS'' ',
  934. ' I_CALLBACK_USER_COMMAND = ''USER_COMMAND'' ',
  935. ' IT_FIELDCAT_LVC = GT_FIELDCAT ',
  936. ' IS_LAYOUT_LVC = GS_LAYOUT ',
  937. ' I_DEFAULT = ''X'' ',
  938. ' I_SAVE = ''A'' ',
  939. ' TABLES ',
  940. ' T_OUTTAB = GT_ALV ',
  941. ' EXCEPTIONS ',
  942. ' OTHERS = 1. '.
  943. "ALV展示
  944. append_code 'ENDFORM. "DISPLAY_DATA'.
  945. ENDFORM. " GEN_FORM_DISPLAY_DATA
  946. *&---------------------------------------------------------------------*
  947. *& Form GEN_FORM_PF_STATUS_ALV
  948. *&---------------------------------------------------------------------*
  949. * text
  950. *----------------------------------------------------------------------*
  951. FORM gen_form_pf_status_alv .
  952. append_code:
  953. '*&---------------------------------------------------------------------*',
  954. '*& FORM PF_STATUS ',
  955. '*&---------------------------------------------------------------------*',
  956. '* TEXT ',
  957. '*----------------------------------------------------------------------*',
  958. 'FORM PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB . ',
  959. ' SET PF-STATUS ''STATUS_ALV'' EXCLUDING RT_EXTAB. ',
  960. 'ENDFORM. "PF_STATUS '.
  961. ENDFORM. " GEN_FORM_PF_STATUS_ALV
  962. *&---------------------------------------------------------------------*
  963. *& Form GEN_FORM_USER_COMMAND_ALV
  964. *&---------------------------------------------------------------------*
  965. * text
  966. *----------------------------------------------------------------------*
  967. FORM gen_form_user_command_alv .
  968. append_code:
  969. '*&---------------------------------------------------------------------*',
  970. '*& FORM USER_COMMAND ',
  971. '*&---------------------------------------------------------------------*',
  972. '* TEXT ',
  973. '*----------------------------------------------------------------------*',
  974. 'FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM ',
  975. ' RS_SELFIELD TYPE SLIS_SELFIELD. ',
  976. ' CASE R_UCOMM. ',
  977. ' WHEN ''IMPORT''. ',
  978. ' READ TABLE GT_ALV WITH KEY SEL = ''X'' TRANSPORTING NO FIELDS. ',
  979. ' IF SY-SUBRC <> 0. ',
  980. ' MESSAGE ''请至少选择一个行项目'' TYPE ''S'' DISPLAY LIKE ''E''. ',
  981. ' EXIT. ',
  982. ' ENDIF. ',
  983. ' ',
  984. ' CALL FUNCTION ''MESSAGES_INITIALIZE''. ',
  985. ' ',
  986. ' "准备数据进行批导 ',
  987. ' LOOP AT GT_ALV INTO GS_ALV WHERE SEL = ''X''. ',
  988. ' ',
  989. ' ENDLOOP. ',
  990. ' ',
  991. ' WHEN ''ERRORS''. ',
  992. ' CALL FUNCTION ''MESSAGES_SHOW''. ',
  993. ' ENDCASE. ',
  994. 'ENDFORM. "USER_COMMAND '.
  995. ENDFORM. " GEN_FORM_USER_COMMAND_ALV
  996. *&---------------------------------------------------------------------*
  997. *& Form gen_form_call_bdc
  998. *&---------------------------------------------------------------------*
  999. * text
  1000. *----------------------------------------------------------------------*
  1001. FORM gen_form_call_bdc.
  1002. append_code:
  1003. '*&---------------------------------------------------------------------*',
  1004. '*& FORM CALL_BDC ',
  1005. '*&---------------------------------------------------------------------*',
  1006. '* TEXT ',
  1007. '*----------------------------------------------------------------------*',
  1008. 'FORM CALL_BDC . ',
  1009. ' DATA: LT_BDC TYPE TABLE OF BDCDATA, ',
  1010. ' LS_BDC TYPE BDCDATA, ',
  1011. ' L_OPT TYPE CTU_PARAMS, ',
  1012. ' LT_MESSAGES TYPE TABLE OF BDCMSGCOLL, ',
  1013. ' LS_MESSAGE TYPE BDCMSGCOLL. ',
  1014. ' ',
  1015. ' DEFINE D_GEN_BDC_CODE. ',
  1016. ' LS_BDC-PROGRAM = &1. ',
  1017. ' LS_BDC-DYNPRO = &2. ',
  1018. ' LS_BDC-DYNBEGIN = &3. ',
  1019. ' LS_BDC-FNAM = &4. ',
  1020. ' LS_BDC-FVAL = &5. ',
  1021. ' APPEND LS_BDC TO LT_BDC. ',
  1022. ' CLEAR: LS_BDC. ',
  1023. ' END-OF-DEFINITION. ',
  1024. ' ',
  1025. ' CALL FUNCTION ''MESSAGES_INITIALIZE''. ',
  1026. ' ',
  1027. ' L_OPT-DISMODE = ''N''. ',
  1028. ' L_OPT-DEFSIZE = ''X''. ',
  1029. ' ',
  1030. '* D_GEN_BDC_CODE: ',
  1031. '* ''SAPLCOMK'' ''0120'' ''X'' '''' '''', ',
  1032. '* '''' '''' '''' ''BDC_CURSOR'' ''RESBD-MATNR(01)'', ',
  1033. '* '''' '''' '''' ''BDC_OKCODE'' ''=KEIN''. ',
  1034. '* ',
  1035. '* CALL TRANSACTION ''CO02'' USING LT_BDC OPTIONS FROM L_OPT MESSAGES INTO LT_MESSAGES.',
  1036. ' ',
  1037. ' LOOP AT LT_MESSAGES INTO LS_MESSAGE. ',
  1038. ' CALL FUNCTION ''MESSAGE_STORE'' ',
  1039. ' EXPORTING ',
  1040. ' ARBGB = LS_MESSAGE-MSGID ',
  1041. ' MSGTY = LS_MESSAGE-MSGTYP ',
  1042. ' MSGV1 = LS_MESSAGE-MSGV1 ',
  1043. ' MSGV2 = LS_MESSAGE-MSGV2 ',
  1044. ' MSGV3 = LS_MESSAGE-MSGV3 ',
  1045. ' MSGV4 = LS_MESSAGE-MSGV4 ',
  1046. ' TXTNR = LS_MESSAGE-MSGNR ',
  1047. ' ZEILE = SY-TABIX. ',
  1048. ' ENDLOOP. ',
  1049. ' ',
  1050. ' REFRESH: LT_BDC, LT_MESSAGES. ',
  1051. 'ENDFORM. " CALL_BDC '.
  1052. ENDFORM. "gen_form_call_bdc
  1053. *&---------------------------------------------------------------------*
  1054. *& Form f4_field
  1055. *&---------------------------------------------------------------------*
  1056. * text
  1057. *----------------------------------------------------------------------*
  1058. FORM f4_field USING p_tabname TYPE tabname
  1059. CHANGING p_fieldname p_fieldtext p_convexit.
  1060. DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE,
  1061. lt_dfies_tab TYPE TABLE OF dfies WITH HEADER LINE,
  1062. BEGIN OF lt_fields OCCURS 0,
  1063. fieldname TYPE fieldname,
  1064. fieldtext TYPE fieldtext,
  1065. keyflag TYPE keyflag,
  1066. datatype TYPE dynptype,
  1067. leng TYPE ddleng,
  1068. DECIMALS TYPE DECIMALS,
  1069. convexit TYPE convexit,
  1070. END OF lt_fields.
  1071. CALL FUNCTION 'DDIF_FIELDINFO_GET'
  1072. EXPORTING
  1073. tabname = p_tabname
  1074. langu = sy-langu
  1075. TABLES
  1076. dfies_tab = lt_dfies_tab[]
  1077. EXCEPTIONS
  1078. not_found = 1
  1079. internal_error = 2
  1080. OTHERS = 3.
  1081. CHECK sy-subrc = 0.
  1082. DELETE lt_dfies_tab WHERE fieldname = 'MANDT'.
  1083. LOOP AT lt_dfies_tab.
  1084. lt_fields-fieldname = lt_dfies_tab-fieldname.
  1085. lt_fields-fieldtext = lt_dfies_tab-fieldtext.
  1086. lt_fields-keyflag = lt_dfies_tab-keyflag .
  1087. lt_fields-datatype = lt_dfies_tab-datatype .
  1088. lt_fields-leng = lt_dfies_tab-leng .
  1089. lt_fields-DECIMALS = lt_dfies_tab-DECIMALS .
  1090. lt_fields-convexit = lt_dfies_tab-convexit .
  1091. APPEND lt_fields.
  1092. ENDLOOP.
  1093. "调用F4
  1094. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  1095. EXPORTING
  1096. retfield = 'FIELDNAME'
  1097. window_title = '选择'
  1098. value_org = 'S'
  1099. TABLES
  1100. value_tab = lt_fields[]
  1101. return_tab = lt_return[].
  1102. IF lt_return[] IS NOT INITIAL.
  1103. READ TABLE lt_return INDEX 1.
  1104. p_fieldname = lt_return-fieldval.
  1105. READ TABLE lt_fields WITH KEY fieldname = p_fieldname.
  1106. p_fieldtext = lt_fields-fieldtext.
  1107. p_convexit = lt_fields-convexit.
  1108. ENDIF.
  1109. ENDFORM. "f4_field
  1110. *&---------------------------------------------------------------------*
  1111. *& Form f4_convexit
  1112. *&---------------------------------------------------------------------*
  1113. * text
  1114. *----------------------------------------------------------------------*
  1115. FORM f4_convexit CHANGING p_convexit.
  1116. STATICS call_times TYPE I.
  1117. DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE,
  1118. BEGIN OF lt_convexits OCCURS 0,
  1119. convexit TYPE convexit,
  1120. TEXT TYPE fieldtext,
  1121. END OF lt_convexits.
  1122. "从表TFDIR中取CONVERSION_EXIT*的函数,太多了,此处只列出常用的几个
  1123. IF call_times IS INITIAL.
  1124. MESSAGE '系统中的转换例程太多,此处只列出常用的一些' TYPE 'I'.
  1125. ADD 1 TO call_times.
  1126. ENDIF.
  1127. lt_convexits-convexit = 'ALPHA'. lt_convexits-TEXT = '前导零'. APPEND lt_convexits.
  1128. lt_convexits-convexit = 'MATN1'. lt_convexits-TEXT = '物料号'. APPEND lt_convexits.
  1129. lt_convexits-convexit = 'CUNIT'. lt_convexits-TEXT = '计量单位'. APPEND lt_convexits.
  1130. lt_convexits-convexit = 'KONPD'. lt_convexits-TEXT = '项目编码'. APPEND lt_convexits.
  1131. lt_convexits-convexit = 'ABPSP'. lt_convexits-TEXT = 'WBS编码'. APPEND lt_convexits.
  1132. lt_convexits-convexit = 'PARVW'. lt_convexits-TEXT = '合作伙伴'. APPEND lt_convexits.
  1133. "调用F4
  1134. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  1135. EXPORTING
  1136. retfield = 'CONVEXIT'
  1137. window_title = '选择'
  1138. value_org = 'S'
  1139. TABLES
  1140. value_tab = lt_convexits[]
  1141. return_tab = lt_return[].
  1142. IF lt_return[] IS NOT INITIAL.
  1143. READ TABLE lt_return INDEX 1.
  1144. p_convexit = lt_return-fieldval.
  1145. ENDIF.
  1146. ENDFORM. "f4_convexit
  1147. *&---------------------------------------------------------------------*
  1148. *& Form download
  1149. *&---------------------------------------------------------------------*
  1150. * 下载到Excel
  1151. *----------------------------------------------------------------------*
  1152. FORM download.
  1153. DATA: l_file TYPE string,
  1154. l_path TYPE string,
  1155. l_fullpath TYPE string,
  1156. l_action TYPE I.
  1157. CALL METHOD cl_gui_frontend_services=>file_save_dialog
  1158. EXPORTING
  1159. default_file_name = l_file
  1160. CHANGING
  1161. filename = l_file
  1162. path = l_path
  1163. fullpath = l_fullpath
  1164. user_action = l_action.
  1165. CHECK l_action = 0.
  1166. PERFORM create_excel_app.
  1167. PERFORM open_workbook USING l_fullpath.
  1168. * =========FIELDS==========
  1169. CALL METHOD OF
  1170. go_book
  1171. 'Sheets' = go_sheet
  1172. EXPORTING
  1173. #1 = 'FIELDS'.
  1174. IF sy-subrc <> 0.
  1175. MESSAGE '打开FIELDS工作表失败' TYPE 'E'.
  1176. ENDIF.
  1177. LOOP AT gt_fields INTO gs_field.
  1178. g_row = sy-tabix + 1.
  1179. PERFORM set_cell_value USING g_row 1 gs_field-fieldname.
  1180. PERFORM set_cell_value USING g_row 2 gs_field-ref_table.
  1181. PERFORM set_cell_value USING g_row 3 gs_field-ref_field.
  1182. PERFORM set_cell_value USING g_row 4 gs_field-convexit.
  1183. PERFORM set_cell_value USING g_row 5 gs_field-scrtext_l.
  1184. ENDLOOP.
  1185. CALL METHOD cl_gui_cfw=>flush.
  1186. CALL METHOD OF
  1187. go_book
  1188. 'SAVE'.
  1189. SET PROPERTY OF go_excel 'Visible' = 1.
  1190. MESSAGE '已下载到Excel文件中,请查看' TYPE 'S'.
  1191. ENDFORM. "download
  1192. *&---------------------------------------------------------------------*
  1193. *& Form upload
  1194. *&---------------------------------------------------------------------*
  1195. * 从Excel上载
  1196. *----------------------------------------------------------------------*
  1197. FORM upload.
  1198. DATA: lt_list TYPE TABLE OF spopli WITH HEADER LINE,
  1199. l_answer TYPE C,
  1200. lt_filetable TYPE filetable WITH HEADER LINE,
  1201. l_rc TYPE I,
  1202. l_action TYPE I,
  1203. l_flag_close TYPE C.
  1204. IF go_excel IS NOT INITIAL.
  1205. lt_list-varoption = '从刚下载的Excel文件上载'. APPEND lt_list.
  1206. lt_list-varoption = '选择新的Excel文件进行上载'. APPEND lt_list.
  1207. CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
  1208. EXPORTING
  1209. textline1 = '如果还未关闭已经下载的Excel,可以选择从该Excel文件上载'
  1210. titel = '选择'
  1211. IMPORTING
  1212. answer = l_answer
  1213. TABLES
  1214. t_spopli = lt_list[].
  1215. CHECK l_answer <> 'A'.
  1216. ENDIF.
  1217. IF go_excel IS INITIAL OR l_answer = 2.
  1218. CALL METHOD cl_gui_frontend_services=>file_open_dialog
  1219. EXPORTING
  1220. default_extension = 'XLS'
  1221. default_filename = '*.xls;*.xlsx'
  1222. file_filter = 'Excel File (*.xls;*.xlsx)'
  1223. multiselection = ''
  1224. CHANGING
  1225. file_table = lt_filetable[]
  1226. rc = l_rc
  1227. user_action = l_action
  1228. EXCEPTIONS
  1229. file_open_dialog_failed = 1
  1230. cntl_error = 2
  1231. error_no_gui = 3
  1232. not_supported_by_gui = 4
  1233. OTHERS = 5.
  1234. CHECK l_action = 0.
  1235. PERFORM create_excel_app.
  1236. READ TABLE lt_filetable INDEX 1.
  1237. PERFORM open_workbook USING lt_filetable-filename.
  1238. l_flag_close = 'X'.
  1239. ENDIF.
  1240. CLEAR: gt_fields.
  1241. * =========FIELDS==========
  1242. CALL METHOD OF
  1243. go_book
  1244. 'Sheets' = go_sheet
  1245. EXPORTING
  1246. #1 = 'FIELDS'.
  1247. IF sy-subrc <> 0.
  1248. MESSAGE '打开FIELDS工作表失败' TYPE 'E'.
  1249. ENDIF.
  1250. WHILE 1 = 1.
  1251. CLEAR: gs_field.
  1252. g_row = sy-INDEX + 1.
  1253. PERFORM get_cell_value USING g_row 1 CHANGING gs_field-fieldname.
  1254. IF gs_field-fieldname IS INITIAL.
  1255. EXIT.
  1256. ENDIF.
  1257. PERFORM get_cell_value USING g_row 2 CHANGING gs_field-ref_table.
  1258. PERFORM get_cell_value USING g_row 3 CHANGING gs_field-ref_field.
  1259. PERFORM get_cell_value USING g_row 4 CHANGING gs_field-convexit.
  1260. PERFORM get_cell_value USING g_row 5 CHANGING gs_field-scrtext_l.
  1261. APPEND gs_field TO gt_fields.
  1262. ENDWHILE.
  1263. IF l_flag_close = 'X'.
  1264. CALL METHOD OF
  1265. go_book
  1266. 'Close'.
  1267. CALL METHOD OF
  1268. go_excel
  1269. 'QUIT'.
  1270. FREE OBJECT: go_sheet, go_book, go_books, go_excel.
  1271. ENDIF.
  1272. MESSAGE '上载完成' TYPE 'S'.
  1273. ENDFORM. "upload
  1274. *&---------------------------------------------------------------------*
  1275. *& Form create_excel_app
  1276. *&---------------------------------------------------------------------*
  1277. * text
  1278. *----------------------------------------------------------------------*
  1279. FORM create_excel_app.
  1280. IF go_excel IS INITIAL.
  1281. CREATE OBJECT go_excel 'Excel.Application'.
  1282. IF sy-subrc <> 0.
  1283. MESSAGE '创建Excel程序失败' TYPE 'E'.
  1284. ENDIF.
  1285. ENDIF.
  1286. ENDFORM. "create_excel_app
  1287. *&---------------------------------------------------------------------*
  1288. *& Form open_workbook
  1289. *&---------------------------------------------------------------------*
  1290. * text
  1291. *----------------------------------------------------------------------*
  1292. FORM open_workbook USING p_path.
  1293. CALL METHOD OF
  1294. go_excel
  1295. 'Workbooks' = go_books.
  1296. CALL METHOD OF
  1297. go_books
  1298. 'Open' = go_book
  1299. EXPORTING
  1300. #1 = p_path.
  1301. IF sy-subrc <> 0.
  1302. MESSAGE '打开Excel文件失败' TYPE 'E'.
  1303. ENDIF.
  1304. ENDFORM. "open_workbook
  1305. *&---------------------------------------------------------------------*
  1306. *& Form set_cell_value
  1307. *&---------------------------------------------------------------------*
  1308. * text
  1309. *----------------------------------------------------------------------*
  1310. FORM set_cell_value USING p_row TYPE I
  1311. p_col TYPE I
  1312. p_value.
  1313. g_row = p_row.
  1314. g_col = p_col.
  1315. g_value = p_value.
  1316. CALL METHOD OF
  1317. go_sheet
  1318. 'CELLS' = go_cell
  1319. NO
  1320. FLUSH
  1321. EXPORTING
  1322. #1 = g_row
  1323. #2 = g_col.
  1324. SET PROPERTY OF go_cell 'Value' = g_value NO FLUSH.
  1325. ENDFORM. "set_cell_value
  1326. *&---------------------------------------------------------------------*
  1327. *& Form get_cell_value
  1328. *&---------------------------------------------------------------------*
  1329. * text
  1330. *----------------------------------------------------------------------*
  1331. FORM get_cell_value USING p_row TYPE I
  1332. p_col TYPE I
  1333. CHANGING p_value.
  1334. CALL METHOD OF
  1335. go_sheet
  1336. 'CELLS' = go_cell
  1337. EXPORTING
  1338. #1 = p_row
  1339. #2 = p_col.
  1340. GET PROPERTY OF go_cell 'Value' = p_value.
  1341. ENDFORM. "get_cell_value
  1342. *&---------------------------------------------------------------------*
  1343. *& Form CHECK
  1344. *&---------------------------------------------------------------------*
  1345. * text
  1346. *----------------------------------------------------------------------*
  1347. FORM CHECK .
  1348. DATA: l_index TYPE I VALUE 1,
  1349. l_tabix TYPE I,
  1350. lt_fields TYPE TABLE OF typ_field,
  1351. l_msg TYPE string,
  1352. l_flag TYPE C.
  1353. DEFINE d_store_message.
  1354. g_flag_error = 'X'.
  1355. CALL FUNCTION 'MESSAGE_STORE'
  1356. EXPORTING
  1357. arbgb = '00'
  1358. msgty = 'E'
  1359. txtnr = '001'
  1360. msgv1 = l_msg
  1361. msgv2 = ''
  1362. msgv3 = ''
  1363. msgv4 = ''
  1364. zeile = l_index.
  1365. l_index = l_index + 1.
  1366. END-OF-DEFINITION.
  1367. CALL FUNCTION 'MESSAGES_INITIALIZE'.
  1368. CLEAR g_flag_error.
  1369. IF gt_fields IS INITIAL.
  1370. l_msg = '字段设置为空'.
  1371. d_store_message.
  1372. ENDIF.
  1373. "字段重复校验
  1374. lt_fields = gt_fields.
  1375. SORT lt_fields BY fieldname.
  1376. DELETE ADJACENT DUPLICATES FROM lt_fields COMPARING fieldname.
  1377. IF LINES( lt_fields ) <> LINES( gt_fields ).
  1378. l_msg = '字段设置:存在重复字段'.
  1379. d_store_message.
  1380. ENDIF.
  1381. "字段设置
  1382. LOOP AT gt_fields INTO gs_field.
  1383. l_tabix = sy-tabix.
  1384. IF gs_field-fieldname IS INITIAL.
  1385. l_msg = '字段设置:行' && l_tabix && ',字段不能为空'.
  1386. d_store_message.
  1387. ENDIF.
  1388. IF gs_field-ref_table IS NOT INITIAL.
  1389. SELECT SINGLE tabname INTO gs_field-ref_table FROM dd02l WHERE tabname = gs_field-ref_table AND as4vers = 'A'.
  1390. IF sy-subrc <> 0.
  1391. l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field-fieldname && '的参照表' && gs_field-ref_table && '不存在或未激活'.
  1392. d_store_message.
  1393. ELSEIF gs_field-ref_field IS NOT INITIAL.
  1394. PERFORM check_field_exist USING gs_field-ref_table gs_field-ref_field CHANGING l_flag.
  1395. IF l_flag = 'X'.
  1396. l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field-fieldname && '的参照表' && gs_field-ref_table && '中参照字段' && gs_field-ref_field &&'不存在或未激活'.
  1397. d_store_message.
  1398. ENDIF.
  1399. ENDIF.
  1400. ELSE.
  1401. IF gs_field-ref_field IS NOT INITIAL.
  1402. SELECT SINGLE rollname INTO gs_field-ref_field FROM dd04l WHERE rollname = gs_field-ref_field AND as4vers = 'A'.
  1403. IF sy-subrc <> 0.
  1404. l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field-fieldname && '的参照字段(数据元素)' && gs_field-ref_field &&'不存在或未激活'.
  1405. d_store_message.
  1406. ENDIF.
  1407. ENDIF.
  1408. ENDIF.
  1409. ENDLOOP.
  1410. IF g_flag_error = 'X'.
  1411. CALL FUNCTION 'MESSAGES_SHOW'.
  1412. ENDIF.
  1413. ENDFORM. " CHECK
  1414. *&---------------------------------------------------------------------*
  1415. *& Form ALV_REFRESH_DISPLAY
  1416. *&---------------------------------------------------------------------*
  1417. * text
  1418. *----------------------------------------------------------------------*
  1419. FORM alv_refresh_display .
  1420. go_alv_fields->refresh_table_display( ).
  1421. ENDFORM. " ALV_REFRESH_DISPLAY
  1422. *&---------------------------------------------------------------------*
  1423. *& Form check_field_exist
  1424. *&---------------------------------------------------------------------*
  1425. * text
  1426. *----------------------------------------------------------------------*
  1427. FORM check_field_exist USING p_tabname TYPE tabname
  1428. p_fieldname TYPE fieldname
  1429. CHANGING p_flag TYPE C.
  1430. DATA: l_fieldname TYPE fieldname.
  1431. CLEAR p_flag.
  1432. SELECT SINGLE fieldname INTO l_fieldname FROM dd03l
  1433. WHERE tabname = p_tabname AND fieldname = p_fieldname AND as4local = 'A'.
  1434. CHECK sy-subrc <> 0.
  1435. p_flag = 'X'.
  1436. ENDFORM. "check_field_exist