项目部分批导逻辑和函数本身功能类似,所以新建的本程序

执行效果

image.png

程序代码

  1. *&---------------------------------------------------------------------*
  2. * 程序名 : ZBATCH_FUNCIN
  3. * 程序类型 : 批导程序
  4. * 描述 : 基于函数的批导
  5. * 修正 :
  6. *&---------------------------------------------------------------------*
  7. * 000 2022/02/28 - - 新增
  8. * 版本 修改日期 修改人员 修改请求号 修改原因
  9. *&---------------------------------------------------------------------*
  10. REPORT zbatch_funcin.
  11. * 通过调用之前实现的接口逻辑 批导相关数据
  12. * 由于报错消息问题 通过单条处理
  13. *&----------------------------------------------------------------------
  14. * Variables
  15. *&----------------------------------------------------------------------
  16. DATA: gs_layout TYPE lvc_s_layo,
  17. gt_fieldcat TYPE lvc_t_fcat.
  18. DATA: gv_column_num TYPE i.
  19. DATA: gv_struct TYPE rsfbpara-structure.
  20. FIELD-SYMBOLS: <gt_display> TYPE STANDARD TABLE.
  21. DATA: gv_str TYPE string.
  22. DATA: p_noalv TYPE c.
  23. *&----------------------------------------------------------------------
  24. * Select Screen
  25. *&----------------------------------------------------------------------
  26. SELECTION-SCREEN BEGIN OF BLOCK blck1 WITH FRAME.
  27. PARAMETERS: p_func TYPE rs38l_fnam AS LISTBOX VISIBLE LENGTH 20 MODIF ID fuc USER-COMMAND fuc. " 方法函数
  28. SELECTION-SCREEN SKIP.
  29. " 特殊:非所有字段可通过本函数处理
  30. PARAMETERS: p_spcil TYPE c AS CHECKBOX.
  31. " 自动映射列
  32. PARAMETERS: p_auto TYPE c AS CHECKBOX USER-COMMAND aut DEFAULT 'X'.
  33. SELECTION-SCREEN SKIP 2.
  34. " 备注:
  35. SELECTION-SCREEN COMMENT 1(40) TEXT-001.
  36. SELECTION-SCREEN SKIP.
  37. " 通过接口处理,第一行需为接口字段名(非中文描述)
  38. SELECTION-SCREEN COMMENT 5(40) TEXT-002 MODIF ID aut.
  39. SELECTION-SCREEN SKIP.
  40. " 顶格开始处理,第三行开始读数
  41. SELECTION-SCREEN COMMENT 5(40) TEXT-003.
  42. SELECTION-SCREEN END OF BLOCK blck1.
  43. *&----------------------------------------------------------------------
  44. * Initialization
  45. *&----------------------------------------------------------------------
  46. INITIALIZATION.
  47. PERFORM frm_init_funclist.
  48. *&----------------------------------------------------------------------
  49. * At Selection-Screen Output
  50. *&----------------------------------------------------------------------
  51. AT SELECTION-SCREEN OUTPUT.
  52. LOOP AT SCREEN.
  53. IF screen-name = 'P_SPCIL'.
  54. screen-input = 0.
  55. MODIFY SCREEN.
  56. ENDIF.
  57. IF screen-group1 = 'AUT'.
  58. IF p_auto = ''.
  59. screen-output = 0.
  60. ELSE.
  61. screen-output = 1.
  62. ENDIF.
  63. MODIFY SCREEN.
  64. ENDIF.
  65. IF screen-name = 'P_FUNC'.
  66. screen-required = 2.
  67. MODIFY SCREEN.
  68. ENDIF.
  69. ENDLOOP.
  70. *&----------------------------------------------------------------------
  71. * Start-Of-Selection
  72. *&----------------------------------------------------------------------
  73. AT SELECTION-SCREEN.
  74. IF p_func = 'ZFMPS_201'.
  75. p_spcil = ''.
  76. ELSE.
  77. p_spcil = 'X'.
  78. ENDIF.
  79. *&----------------------------------------------------------------------
  80. * Start-Of-Selection
  81. *&----------------------------------------------------------------------
  82. START-OF-SELECTION.
  83. IF p_func IS INITIAL.
  84. MESSAGE s055(00) DISPLAY LIKE 'E'.
  85. STOP.
  86. ENDIF.
  87. PERFORM frm_check_func.
  88. PERFORM frm_init_column. " 初始化列 及 内表
  89. PERFORM frm_upload_field. " 上载数据
  90. PERFORM frm_set_layout.
  91. PERFORM frm_alv_display.
  92. *&---------------------------------------------------------------------*
  93. *& Form frm_init_funclist
  94. *&---------------------------------------------------------------------*
  95. *& 初始化 函数列表
  96. *&---------------------------------------------------------------------*
  97. FORM frm_init_funclist .
  98. DATA: lv_name TYPE vrm_id,
  99. lt_list TYPE vrm_values,
  100. ls_value LIKE LINE OF lt_list.
  101. ls_value-key = 'ZFMSD_201'.
  102. ls_value-text = '客户创建'.
  103. APPEND ls_value TO lt_list.
  104. CLEAR ls_value.
  105. ls_value-key = 'ZFMPS_201'.
  106. ls_value-text = '项目创建'.
  107. APPEND ls_value TO lt_list.
  108. CLEAR ls_value.
  109. lv_name = 'P_FUNC'.
  110. CALL FUNCTION 'VRM_SET_VALUES'
  111. EXPORTING
  112. id = lv_name
  113. values = lt_list.
  114. ENDFORM.
  115. *&---------------------------------------------------------------------*
  116. *& Form frm_init_column
  117. *&---------------------------------------------------------------------*
  118. *& 初始化列
  119. *&---------------------------------------------------------------------*
  120. FORM frm_init_column .
  121. DATA: lcl_comps_struct TYPE REF TO cl_abap_structdescr.
  122. DATA: lv_structure TYPE rsfbpara-structure." 结构
  123. DATA: lt_comps_struct TYPE abap_component_tab.
  124. DATA: lo_req_tab TYPE REF TO data.
  125. DATA: lt_dfies TYPE ddfields.
  126. DATA: lv_inside TYPE i.
  127. " 此部分仅按结构处理
  128. CASE p_func.
  129. WHEN 'ZFMSD_201'.
  130. lv_structure = 'ZSSD201'.
  131. lv_inside = 6.
  132. WHEN 'ZFMPS_201'.
  133. lv_structure = 'ZSPS201'.
  134. WHEN OTHERS.
  135. MESSAGE '未编写相关逻辑' TYPE 'S' DISPLAY LIKE 'E'.
  136. STOP.
  137. ENDCASE.
  138. gv_struct = lv_structure.
  139. " 获取结构字段
  140. lcl_comps_struct ?= cl_abap_typedescr=>describe_by_name( lv_structure ).
  141. lt_comps_struct = lcl_comps_struct->get_components( ).
  142. " 总列数
  143. gv_column_num = lines( lt_comps_struct ) + lv_inside.
  144. " 新增用于显示的字段
  145. INSERT VALUE #( name = 'MSG' type = cl_abap_elemdescr=>get_c( '50' ) ) INTO lt_comps_struct INDEX 1.
  146. INSERT VALUE #( name = 'ICON' type = cl_abap_elemdescr=>get_c( '4' ) ) INTO lt_comps_struct INDEX 1.
  147. " 创建 显示内表
  148. DATA(lo_req_type) = cl_abap_structdescr=>create( lt_comps_struct ).
  149. DATA(lo_req_tabdesc) = cl_abap_tabledescr=>create(
  150. p_line_type = lo_req_type
  151. p_table_kind = cl_abap_tabledescr=>tablekind_std
  152. p_unique = abap_false ).
  153. CREATE DATA lo_req_tab TYPE HANDLE lo_req_tabdesc.
  154. ASSIGN lo_req_tab->* TO <gt_display>.
  155. " 生成 fieldcat
  156. lt_dfies = cl_salv_data_descr=>read_structdescr( lo_req_type ).
  157. MOVE-CORRESPONDING lt_dfies TO gt_fieldcat.
  158. LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<ls_fieldcat>).
  159. CASE <ls_fieldcat>-fieldname.
  160. WHEN 'ICON'.
  161. <ls_fieldcat>-seltext = 'icon'.
  162. <ls_fieldcat>-coltext = 'icon'.
  163. WHEN 'MSG'.
  164. <ls_fieldcat>-seltext = 'message'.
  165. <ls_fieldcat>-coltext = 'message'.
  166. WHEN OTHERS.
  167. ENDCASE.
  168. ENDLOOP.
  169. ENDFORM.
  170. *&---------------------------------------------------------------------*
  171. *& Form frm_upload_field
  172. *&---------------------------------------------------------------------*
  173. *& 上载数据
  174. *&---------------------------------------------------------------------*
  175. FORM frm_upload_field .
  176. DATA: lt_upload LIKE TABLE OF zalsmex_tabline1.
  177. DATA: lv_path TYPE rlgrap-filename.
  178. DATA: lt_fieldcat LIKE gt_fieldcat.
  179. DATA: lr_export TYPE REF TO data,
  180. lr_line TYPE REF TO data.
  181. DATA: lt_fieldnames TYPE TABLE OF lvc_fname.
  182. FIELD-SYMBOLS: <lt_import> TYPE STANDARD TABLE.
  183. MOVE-CORRESPONDING gt_fieldcat TO lt_fieldcat.
  184. DELETE lt_fieldcat WHERE fieldname = 'ICON'.
  185. DELETE lt_fieldcat WHERE fieldname = 'MSG'.
  186. LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<ls_fieldcat>).
  187. CLEAR <ls_fieldcat>-tabname.
  188. <ls_fieldcat>-datatype = 'CHAR'.
  189. <ls_fieldcat>-inttype = 'C'.
  190. <ls_fieldcat>-intlen = '255'.
  191. <ls_fieldcat>-domname = 'CHAR255'.
  192. CLEAR <ls_fieldcat>-ref_table.
  193. ENDLOOP.
  194. " 创建内表
  195. CALL METHOD cl_alv_table_create=>create_dynamic_table
  196. EXPORTING
  197. it_fieldcatalog = lt_fieldcat
  198. IMPORTING
  199. ep_table = lr_export
  200. EXCEPTIONS
  201. generate_subpool_dir_full = 1
  202. OTHERS = 2.
  203. IF sy-subrc <> 0.
  204. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  205. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  206. ENDIF.
  207. ASSIGN lr_export->* TO <lt_import>.
  208. CREATE DATA lr_line LIKE LINE OF <lt_import>.
  209. ASSIGN lr_line->* TO FIELD-SYMBOL(<ls_import>).
  210. CALL FUNCTION 'WS_FILENAME_GET'
  211. EXPORTING
  212. def_path = 'C'
  213. mode = 'O'
  214. title = '打开文件'
  215. IMPORTING
  216. filename = lv_path
  217. EXCEPTIONS
  218. inv_winsys = 1
  219. no_batch = 2
  220. selection_cancel = 3
  221. selection_error = 4
  222. OTHERS = 5.
  223. IF sy-subrc <> 0.
  224. MESSAGE '用户已取消' TYPE 'S' DISPLAY LIKE 'E'.
  225. STOP.
  226. ENDIF.
  227. CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
  228. EXPORTING
  229. filename = lv_path
  230. i_begin_col = 1
  231. i_begin_row = 1
  232. i_end_col = gv_column_num
  233. i_end_row = 50000
  234. TABLES
  235. intern = lt_upload
  236. EXCEPTIONS
  237. inconsistent_parameters = 1
  238. upload_ole = 2
  239. OTHERS = 3.
  240. IF sy-subrc <> 0.
  241. MESSAGE e001(00) WITH 'EXCELL:' lv_path '打开失败!' .
  242. ENDIF.
  243. LOOP AT lt_upload INTO DATA(ls_upload).
  244. " --> 特殊逻辑
  245. " CONTINUE 之后 不会执行 后续所有语句(包含AT END
  246. " 第一行作为内表
  247. IF ls_upload-row = 1 AND p_auto = 'X'.
  248. APPEND ls_upload-value TO lt_fieldnames.
  249. CONTINUE.
  250. ENDIF.
  251. " 第二行跳过
  252. CHECK ls_upload-row <> 2.
  253. IF p_auto = ''.
  254. ASSIGN COMPONENT ls_upload-col OF STRUCTURE <ls_import> TO FIELD-SYMBOL(<lv_value>).
  255. IF sy-subrc = 0 AND <lv_value> IS ASSIGNED.
  256. <lv_value> = ls_upload-value.
  257. ENDIF.
  258. ELSE.
  259. READ TABLE lt_fieldnames INTO DATA(lv_fieldname) INDEX ls_upload-col.
  260. IF sy-subrc = 0.
  261. ASSIGN COMPONENT lv_fieldname OF STRUCTURE <ls_import> TO FIELD-SYMBOL(<lv_auto>).
  262. IF sy-subrc = 0 AND <lv_auto> IS ASSIGNED.
  263. <lv_auto> = ls_upload-value.
  264. ENDIF.
  265. ENDIF.
  266. ENDIF.
  267. " <--
  268. AT END OF row.
  269. APPEND <ls_import> TO <lt_import>.
  270. CLEAR <ls_import>.
  271. ENDAT.
  272. ENDLOOP.
  273. MOVE-CORRESPONDING <lt_import> TO <gt_display>.
  274. ENDFORM.
  275. *&---------------------------------------------------------------------*
  276. *& Form FRM_SET_LAYOUT
  277. *&---------------------------------------------------------------------*
  278. *& 设置 layout
  279. *&---------------------------------------------------------------------*
  280. FORM frm_set_layout .
  281. gs_layout = VALUE #(
  282. zebra = 'X'
  283. cwidth_opt = 'X'
  284. ).
  285. ENDFORM.
  286. *&---------------------------------------------------------------------*
  287. *& Form FRM_ALV_DISPLAY
  288. *&---------------------------------------------------------------------*
  289. *& alv 展示
  290. *&---------------------------------------------------------------------*
  291. FORM frm_alv_display .
  292. DATA: lt_events TYPE slis_t_event,
  293. ls_events TYPE slis_alv_event.
  294. DATA: lv_lines TYPE i.
  295. lv_lines = lines( <gt_display> ).
  296. IF lv_lines <> 0.
  297. MESSAGE s004(zpp01) WITH lv_lines. " 查到 & 条数据
  298. ENDIF.
  299. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  300. EXPORTING
  301. i_callback_program = sy-repid
  302. is_layout_lvc = gs_layout
  303. it_fieldcat_lvc = gt_fieldcat
  304. i_callback_pf_status_set = 'FRM_PF_STATUS'
  305. i_callback_user_command = 'FRM_USER_COMMAND'
  306. it_events = lt_events[]
  307. TABLES
  308. t_outtab = <gt_display>
  309. EXCEPTIONS
  310. program_error = 1
  311. OTHERS = 2.
  312. IF sy-subrc <> 0.
  313. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  314. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  315. ENDIF.
  316. ENDFORM.
  317. *&---------------------------------------------------------------------*
  318. *& Form FRM_PF_STATUS
  319. *&---------------------------------------------------------------------*
  320. * toolbar 设置
  321. *----------------------------------------------------------------------*
  322. FORM frm_pf_status USING p_extab TYPE slis_t_extab.
  323. DATA: lt_extab TYPE slis_t_extab.
  324. MOVE-CORRESPONDING p_extab TO lt_extab.
  325. SET PF-STATUS 'STANDARD' EXCLUDING lt_extab.
  326. ENDFORM.
  327. *&---------------------------------------------------------------------*
  328. *& Form FRM_USER_COMMAND
  329. *&---------------------------------------------------------------------*
  330. * 点击事件处理
  331. *----------------------------------------------------------------------*
  332. FORM frm_user_command USING p_ucomm LIKE sy-ucomm
  333. p_ls_selfield TYPE slis_selfield.
  334. DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  335. DATA: lt_rows TYPE lvc_t_row,
  336. ls_row TYPE lvc_s_row.
  337. DATA: lv_subrc TYPE i.
  338. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  339. IMPORTING
  340. e_grid = lr_grid.
  341. lr_grid->check_changed_data( ).
  342. CASE p_ucomm.
  343. WHEN 'CAL_FUNC'.
  344. PERFORM frm_call_function.
  345. WHEN OTHERS.
  346. ENDCASE.
  347. lr_grid->check_changed_data( ).
  348. p_ls_selfield-refresh = 'X'.
  349. p_ls_selfield-col_stable = 'X' .
  350. p_ls_selfield-row_stable = 'X' .
  351. ENDFORM.
  352. *&---------------------------------------------------------------------*
  353. *& Form frm_call_function
  354. *&---------------------------------------------------------------------*
  355. *& 调用函数
  356. *&---------------------------------------------------------------------*
  357. FORM frm_call_function .
  358. DATA: ls_zssd201 TYPE zssd201.
  359. DATA: ls_zsps201 TYPE zsps201,
  360. lt_zttps201 TYPE zttps201.
  361. DATA: ls_result TYPE zsxx001,
  362. lv_kunnr TYPE kunnr.
  363. CASE p_func.
  364. WHEN 'ZFMSD_201'.
  365. LOOP AT <gt_display> ASSIGNING FIELD-SYMBOL(<ls_display>).
  366. MOVE-CORRESPONDING <ls_display> TO ls_zssd201.
  367. MOVE-CORRESPONDING <ls_display> TO ls_zssd201-sale.
  368. CALL FUNCTION 'ZFMSD_201'
  369. EXPORTING
  370. i_bphead = ls_zssd201
  371. IMPORTING
  372. result = ls_result
  373. kunnr = lv_kunnr.
  374. ASSIGN COMPONENT 'ICON' OF STRUCTURE <ls_display> TO FIELD-SYMBOL(<lv_icon>).
  375. IF sy-subrc = 0.
  376. IF ls_result-type = 'S'.
  377. <lv_icon> = icon_led_green.
  378. ELSE.
  379. <lv_icon> = icon_led_red.
  380. ENDIF.
  381. ENDIF.
  382. ASSIGN COMPONENT 'MSG' OF STRUCTURE <ls_display> TO FIELD-SYMBOL(<lv_msg>).
  383. IF sy-subrc = 0.
  384. IF ls_result-type = 'S'.
  385. <lv_msg> = lv_kunnr.
  386. ELSE.
  387. <lv_msg> = ls_result-message.
  388. ENDIF.
  389. ENDIF.
  390. CLEAR: ls_zssd201, ls_result, lv_kunnr.
  391. ENDLOOP.
  392. WHEN 'ZFMPS_201'.
  393. LOOP AT <gt_display> ASSIGNING FIELD-SYMBOL(<ls_ps201>).
  394. MOVE-CORRESPONDING <ls_ps201> TO ls_zsps201.
  395. APPEND ls_zsps201 TO lt_zttps201.
  396. CALL FUNCTION 'ZFMPS_201'
  397. EXPORTING
  398. input = lt_zttps201
  399. IMPORTING
  400. result = ls_result.
  401. ASSIGN COMPONENT 'ICON' OF STRUCTURE <ls_ps201> TO <lv_icon>.
  402. IF sy-subrc = 0.
  403. IF ls_result-type = 'S'.
  404. <lv_icon> = icon_led_green.
  405. ELSE.
  406. <lv_icon> = icon_led_red.
  407. ENDIF.
  408. ENDIF.
  409. ASSIGN COMPONENT 'MSG' OF STRUCTURE <ls_ps201> TO <lv_msg>.
  410. IF sy-subrc = 0.
  411. IF ls_result-type = 'S'.
  412. <lv_msg> = lv_kunnr.
  413. ELSE.
  414. <lv_msg> = ls_result-message.
  415. ENDIF.
  416. ENDIF.
  417. CLEAR: ls_zsps201, lt_zttps201, ls_result.
  418. ENDLOOP.
  419. WHEN OTHERS.
  420. MESSAGE '未编写相关逻辑' TYPE 'S' DISPLAY LIKE 'E'.
  421. STOP.
  422. ENDCASE.
  423. ENDFORM.
  424. *&---------------------------------------------------------------------*
  425. *& Form FRM_CHECK_FUNC
  426. *&---------------------------------------------------------------------*
  427. *& 检查函数是否存在
  428. *&---------------------------------------------------------------------*
  429. FORM frm_check_func .
  430. CALL FUNCTION 'FUNCTION_EXISTS'
  431. EXPORTING
  432. funcname = p_func
  433. EXCEPTIONS
  434. function_not_exist = 1
  435. OTHERS = 2.
  436. IF sy-subrc <> 0.
  437. MESSAGE '未找到对应的函数' TYPE 'S' DISPLAY LIKE 'E'.
  438. STOP.
  439. ENDIF.
  440. ENDFORM.
  441. *&---------------------------------------------------------------------*
  442. *& Form FRM_CALL_FUNC_DIRECT
  443. *&---------------------------------------------------------------------*
  444. *& 使用接口的方式调用函数
  445. *&---------------------------------------------------------------------*
  446. FORM frm_call_func_direct .
  447. DATA: ls_header TYPE header_fb,
  448. lt_tables TYPE rsfb_para,
  449. lt_import TYPE rsfb_para,
  450. lt_export TYPE rsfb_para,
  451. lt_change TYPE rsfb_para.
  452. DATA: lt_parameter TYPE rsfb_para.
  453. DATA: lt_ptab TYPE abap_func_parmbind_tab,
  454. ls_ptab TYPE abap_func_parmbind,
  455. lt_ptab_temp TYPE abap_func_parmbind_tab,
  456. lt_etab TYPE abap_func_excpbind_tab.
  457. DATA: lv_kind TYPE i .
  458. DATA: lo_table TYPE REF TO data.
  459. FIELD-SYMBOLS: <fs_table> TYPE ANY TABLE.
  460. DATA: lt_dyn_comp TYPE cl_abap_structdescr=>component_table,
  461. ls_dyn_comp LIKE LINE OF lt_dyn_comp.
  462. DATA: lo_req_tab TYPE REF TO data,
  463. lo_req_data TYPE REF TO data,
  464. lo_res_tab TYPE REF TO data,
  465. lo_res_data TYPE REF TO data.
  466. DATA: lv_exception TYPE char01 .
  467. FIELD-SYMBOLS: <fs_req_tab> TYPE ANY TABLE.
  468. FIELD-SYMBOLS: <fs_res_tab> TYPE ANY TABLE.
  469. FIELD-SYMBOLS: <ls_req_data> TYPE any.
  470. FIELD-SYMBOLS: <ls_res_data> TYPE any.
  471. DATA: lv_str TYPE string.
  472. DATA: lr_xml TYPE REF TO cl_xml_document.
  473. SELECT SINGLE
  474. *
  475. INTO @DATA(ls_in_conf)
  476. FROM ztapi_in_conf
  477. WHERE func_name EQ @p_func.
  478. IF sy-subrc <> 0.
  479. MESSAGE '未找到对应配置' TYPE 'S' DISPLAY LIKE 'E'.
  480. STOP.
  481. ENDIF.
  482. " 回找配置文件
  483. SELECT SINGLE json_mode FROM ztapi_main_conf
  484. INTO @DATA(lv_json_mode)
  485. WHERE api_no = @ls_in_conf-api_no.
  486. " 函数参数结构读取
  487. ls_header-name = ls_in_conf-func_name.
  488. ls_header-state = 'A' .
  489. CALL METHOD cl_fb_parameter_db=>read
  490. IMPORTING
  491. tables = lt_tables
  492. import = lt_import
  493. export = lt_export
  494. change = lt_change
  495. CHANGING
  496. header = ls_header.
  497. APPEND LINES OF lt_import TO lt_parameter.
  498. APPEND LINES OF lt_export TO lt_parameter.
  499. APPEND LINES OF lt_change TO lt_parameter.
  500. APPEND LINES OF lt_tables TO lt_parameter.
  501. LOOP AT lt_parameter INTO DATA(ls_parameter).
  502. IF ls_parameter-parameter = 'COMMON_INFO_REQ' OR
  503. ls_parameter-parameter = 'COMMON_INFO_RES'.
  504. CONTINUE.
  505. ENDIF.
  506. IF ls_parameter-typefield = 'LIKE'.
  507. CREATE DATA lo_table TYPE STANDARD TABLE OF (ls_parameter-structure).
  508. ASSIGN lo_table->* TO <fs_table>.
  509. CLEAR ls_dyn_comp.
  510. ls_dyn_comp-name = ls_parameter-parameter.
  511. ls_dyn_comp-type ?= cl_abap_tabledescr=>describe_by_data( <fs_table> ).
  512. APPEND ls_dyn_comp TO lt_dyn_comp.
  513. ELSEIF ls_parameter-typefield = 'TYPE'.
  514. CLEAR ls_dyn_comp.
  515. ls_dyn_comp-name = ls_parameter-parameter.
  516. ls_dyn_comp-type ?= cl_abap_tabledescr=>describe_by_name( ls_parameter-structure ).
  517. APPEND ls_dyn_comp TO lt_dyn_comp.
  518. ENDIF.
  519. ENDLOOP.
  520. DATA(lo_req_type) = cl_abap_structdescr=>create( lt_dyn_comp ).
  521. DATA(lo_req_tabdesc) = cl_abap_tabledescr=>create(
  522. p_line_type = lo_req_type
  523. p_table_kind = cl_abap_tabledescr=>tablekind_std
  524. p_unique = abap_false ).
  525. CREATE DATA lo_req_tab TYPE HANDLE lo_req_tabdesc.
  526. ASSIGN lo_req_tab->* TO <fs_req_tab>.
  527. CREATE DATA lo_req_data LIKE LINE OF <fs_req_tab>.
  528. ASSIGN lo_req_data->* TO <ls_req_data>.
  529. /ui2/cl_json=>deserialize(
  530. EXPORTING
  531. json = gv_str
  532. pretty_name = lv_json_mode
  533. CHANGING
  534. data = <ls_req_data> ).
  535. LOOP AT lt_parameter INTO ls_parameter.
  536. CLEAR lt_ptab_temp .
  537. CASE ls_parameter-paramtype.
  538. WHEN 'I'.
  539. lv_kind = abap_func_exporting .
  540. WHEN 'E'.
  541. lv_kind = abap_func_importing.
  542. WHEN 'T'.
  543. lv_kind = abap_func_tables.
  544. WHEN 'C'.
  545. lv_kind = abap_func_changing.
  546. WHEN OTHERS.
  547. ENDCASE.
  548. ASSIGN COMPONENT ls_parameter-parameter OF STRUCTURE <ls_req_data>
  549. TO FIELD-SYMBOL(<fs_para_data>).
  550. CLEAR ls_ptab.
  551. ls_ptab-name = ls_parameter-parameter.
  552. ls_ptab-kind = lv_kind.
  553. GET REFERENCE OF <fs_para_data> INTO ls_ptab-value.
  554. INSERT ls_ptab INTO TABLE lt_ptab.
  555. ENDLOOP.
  556. lt_etab = VALUE #( ( name = 'OTHERS' value = 10 ) ) .
  557. TRY .
  558. CALL FUNCTION ls_in_conf-func_name
  559. PARAMETER-TABLE lt_ptab
  560. EXCEPTION-TABLE lt_etab.
  561. CATCH cx_root INTO DATA(lr_root) .
  562. lv_exception = 'X' .
  563. ENDTRY .
  564. IF lv_exception = 'X'.
  565. MESSAGE 'ERP端API调用异常' TYPE 'S' DISPLAY LIKE 'E'.
  566. STOP.
  567. ENDIF.
  568. DATA(lt_res_comp) = lt_dyn_comp.
  569. LOOP AT lt_parameter INTO ls_parameter.
  570. IF ls_parameter-paramtype = 'I'.
  571. READ TABLE lt_res_comp TRANSPORTING NO FIELDS
  572. WITH KEY name = ls_parameter-parameter.
  573. IF sy-subrc = 0.
  574. DELETE lt_res_comp INDEX sy-tabix.
  575. ENDIF.
  576. ENDIF.
  577. ENDLOOP.
  578. DATA(lo_res_type) = cl_abap_structdescr=>create( lt_res_comp ).
  579. DATA(lo_res_tabdesc) = cl_abap_tabledescr=>create(
  580. p_line_type = lo_res_type
  581. p_table_kind = cl_abap_tabledescr=>tablekind_std
  582. p_unique = abap_false ).
  583. CREATE DATA lo_res_tab TYPE HANDLE lo_res_tabdesc.
  584. ASSIGN lo_res_tab->* TO <fs_res_tab>.
  585. CREATE DATA lo_res_data LIKE LINE OF <fs_res_tab>.
  586. ASSIGN lo_res_data->* TO <ls_res_data>.
  587. LOOP AT lt_ptab INTO ls_ptab.
  588. ASSIGN COMPONENT ls_ptab-name OF STRUCTURE <ls_res_data>
  589. TO FIELD-SYMBOL(<fs_comp>).
  590. IF sy-subrc = 0.
  591. ASSIGN ls_ptab-value->* TO <fs_para_data>.
  592. <fs_comp> = <fs_para_data>.
  593. ENDIF.
  594. ENDLOOP.
  595. /ui2/cl_json=>serialize(
  596. EXPORTING
  597. data = <ls_res_data>
  598. pretty_name = lv_json_mode
  599. RECEIVING
  600. r_json = lv_str ) .
  601. " JSON 展示
  602. TRY.
  603. CALL TRANSFORMATION sjson2html SOURCE XML lv_str
  604. RESULT XML DATA(lv_html).
  605. CATCH cx_xslt_runtime_error INTO DATA(lo_err).
  606. DATA(lv_err_text) = lo_err->get_text( ).
  607. MESSAGE lv_err_text TYPE 'S' DISPLAY LIKE 'E'.
  608. STOP .
  609. ENDTRY.
  610. DATA(lv_convert) = cl_abap_codepage=>convert_from( lv_html ).
  611. lr_xml = NEW cl_xml_document( ).
  612. IF lr_xml->parse_string( stream = lv_convert ).
  613. lr_xml->display( ).
  614. ELSE.
  615. MESSAGE '展示失败' TYPE 'S' DISPLAY LIKE 'E'.
  616. cl_demo_output=>display( <ls_res_data> ).
  617. ENDIF.
  618. ENDFORM.

更多

目前问题

  • [ ] 通用性不行,需针对每个函数编写单独的逻辑

    新东西

  • 基于结构的动态内表的创建方法