项目部分批导逻辑和函数本身功能类似,所以新建的本程序
执行效果
程序代码
*&---------------------------------------------------------------------*
* 程序名 : ZBATCH_FUNCIN
* 程序类型 : 批导程序
* 描述 : 基于函数的批导
* 修正 :
*&---------------------------------------------------------------------*
* 000 2022/02/28 - - 新增
* 版本 修改日期 修改人员 修改请求号 修改原因
*&---------------------------------------------------------------------*
REPORT zbatch_funcin.
* 通过调用之前实现的接口逻辑 批导相关数据
* 由于报错消息问题 通过单条处理
*&----------------------------------------------------------------------
* Variables
*&----------------------------------------------------------------------
DATA: gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE lvc_t_fcat.
DATA: gv_column_num TYPE i.
DATA: gv_struct TYPE rsfbpara-structure.
FIELD-SYMBOLS: <gt_display> TYPE STANDARD TABLE.
DATA: gv_str TYPE string.
DATA: p_noalv TYPE c.
*&----------------------------------------------------------------------
* Select Screen
*&----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK blck1 WITH FRAME.
PARAMETERS: p_func TYPE rs38l_fnam AS LISTBOX VISIBLE LENGTH 20 MODIF ID fuc USER-COMMAND fuc. " 方法函数
SELECTION-SCREEN SKIP.
" 特殊:非所有字段可通过本函数处理
PARAMETERS: p_spcil TYPE c AS CHECKBOX.
" 自动映射列
PARAMETERS: p_auto TYPE c AS CHECKBOX USER-COMMAND aut DEFAULT 'X'.
SELECTION-SCREEN SKIP 2.
" 备注:
SELECTION-SCREEN COMMENT 1(40) TEXT-001.
SELECTION-SCREEN SKIP.
" 通过接口处理,第一行需为接口字段名(非中文描述)
SELECTION-SCREEN COMMENT 5(40) TEXT-002 MODIF ID aut.
SELECTION-SCREEN SKIP.
" 顶格开始处理,第三行开始读数
SELECTION-SCREEN COMMENT 5(40) TEXT-003.
SELECTION-SCREEN END OF BLOCK blck1.
*&----------------------------------------------------------------------
* Initialization
*&----------------------------------------------------------------------
INITIALIZATION.
PERFORM frm_init_funclist.
*&----------------------------------------------------------------------
* At Selection-Screen Output
*&----------------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-name = 'P_SPCIL'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
IF screen-group1 = 'AUT'.
IF p_auto = ''.
screen-output = 0.
ELSE.
screen-output = 1.
ENDIF.
MODIFY SCREEN.
ENDIF.
IF screen-name = 'P_FUNC'.
screen-required = 2.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
*&----------------------------------------------------------------------
* Start-Of-Selection
*&----------------------------------------------------------------------
AT SELECTION-SCREEN.
IF p_func = 'ZFMPS_201'.
p_spcil = ''.
ELSE.
p_spcil = 'X'.
ENDIF.
*&----------------------------------------------------------------------
* Start-Of-Selection
*&----------------------------------------------------------------------
START-OF-SELECTION.
IF p_func IS INITIAL.
MESSAGE s055(00) DISPLAY LIKE 'E'.
STOP.
ENDIF.
PERFORM frm_check_func.
PERFORM frm_init_column. " 初始化列 及 内表
PERFORM frm_upload_field. " 上载数据
PERFORM frm_set_layout.
PERFORM frm_alv_display.
*&---------------------------------------------------------------------*
*& Form frm_init_funclist
*&---------------------------------------------------------------------*
*& 初始化 函数列表
*&---------------------------------------------------------------------*
FORM frm_init_funclist .
DATA: lv_name TYPE vrm_id,
lt_list TYPE vrm_values,
ls_value LIKE LINE OF lt_list.
ls_value-key = 'ZFMSD_201'.
ls_value-text = '客户创建'.
APPEND ls_value TO lt_list.
CLEAR ls_value.
ls_value-key = 'ZFMPS_201'.
ls_value-text = '项目创建'.
APPEND ls_value TO lt_list.
CLEAR ls_value.
lv_name = 'P_FUNC'.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = lv_name
values = lt_list.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_init_column
*&---------------------------------------------------------------------*
*& 初始化列
*&---------------------------------------------------------------------*
FORM frm_init_column .
DATA: lcl_comps_struct TYPE REF TO cl_abap_structdescr.
DATA: lv_structure TYPE rsfbpara-structure." 结构
DATA: lt_comps_struct TYPE abap_component_tab.
DATA: lo_req_tab TYPE REF TO data.
DATA: lt_dfies TYPE ddfields.
DATA: lv_inside TYPE i.
" 此部分仅按结构处理
CASE p_func.
WHEN 'ZFMSD_201'.
lv_structure = 'ZSSD201'.
lv_inside = 6.
WHEN 'ZFMPS_201'.
lv_structure = 'ZSPS201'.
WHEN OTHERS.
MESSAGE '未编写相关逻辑' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDCASE.
gv_struct = lv_structure.
" 获取结构字段
lcl_comps_struct ?= cl_abap_typedescr=>describe_by_name( lv_structure ).
lt_comps_struct = lcl_comps_struct->get_components( ).
" 总列数
gv_column_num = lines( lt_comps_struct ) + lv_inside.
" 新增用于显示的字段
INSERT VALUE #( name = 'MSG' type = cl_abap_elemdescr=>get_c( '50' ) ) INTO lt_comps_struct INDEX 1.
INSERT VALUE #( name = 'ICON' type = cl_abap_elemdescr=>get_c( '4' ) ) INTO lt_comps_struct INDEX 1.
" 创建 显示内表
DATA(lo_req_type) = cl_abap_structdescr=>create( lt_comps_struct ).
DATA(lo_req_tabdesc) = cl_abap_tabledescr=>create(
p_line_type = lo_req_type
p_table_kind = cl_abap_tabledescr=>tablekind_std
p_unique = abap_false ).
CREATE DATA lo_req_tab TYPE HANDLE lo_req_tabdesc.
ASSIGN lo_req_tab->* TO <gt_display>.
" 生成 fieldcat
lt_dfies = cl_salv_data_descr=>read_structdescr( lo_req_type ).
MOVE-CORRESPONDING lt_dfies TO gt_fieldcat.
LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<ls_fieldcat>).
CASE <ls_fieldcat>-fieldname.
WHEN 'ICON'.
<ls_fieldcat>-seltext = 'icon'.
<ls_fieldcat>-coltext = 'icon'.
WHEN 'MSG'.
<ls_fieldcat>-seltext = 'message'.
<ls_fieldcat>-coltext = 'message'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_upload_field
*&---------------------------------------------------------------------*
*& 上载数据
*&---------------------------------------------------------------------*
FORM frm_upload_field .
DATA: lt_upload LIKE TABLE OF zalsmex_tabline1.
DATA: lv_path TYPE rlgrap-filename.
DATA: lt_fieldcat LIKE gt_fieldcat.
DATA: lr_export TYPE REF TO data,
lr_line TYPE REF TO data.
DATA: lt_fieldnames TYPE TABLE OF lvc_fname.
FIELD-SYMBOLS: <lt_import> TYPE STANDARD TABLE.
MOVE-CORRESPONDING gt_fieldcat TO lt_fieldcat.
DELETE lt_fieldcat WHERE fieldname = 'ICON'.
DELETE lt_fieldcat WHERE fieldname = 'MSG'.
LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<ls_fieldcat>).
CLEAR <ls_fieldcat>-tabname.
<ls_fieldcat>-datatype = 'CHAR'.
<ls_fieldcat>-inttype = 'C'.
<ls_fieldcat>-intlen = '255'.
<ls_fieldcat>-domname = 'CHAR255'.
CLEAR <ls_fieldcat>-ref_table.
ENDLOOP.
" 创建内表
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = lt_fieldcat
IMPORTING
ep_table = lr_export
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ASSIGN lr_export->* TO <lt_import>.
CREATE DATA lr_line LIKE LINE OF <lt_import>.
ASSIGN lr_line->* TO FIELD-SYMBOL(<ls_import>).
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_path = 'C'
mode = 'O'
title = '打开文件'
IMPORTING
filename = lv_path
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE '用户已取消' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lv_path
i_begin_col = 1
i_begin_row = 1
i_end_col = gv_column_num
i_end_row = 50000
TABLES
intern = lt_upload
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE e001(00) WITH 'EXCELL:' lv_path '打开失败!' .
ENDIF.
LOOP AT lt_upload INTO DATA(ls_upload).
" --> 特殊逻辑
" CONTINUE 之后 不会执行 后续所有语句(包含AT END)
" 第一行作为内表
IF ls_upload-row = 1 AND p_auto = 'X'.
APPEND ls_upload-value TO lt_fieldnames.
CONTINUE.
ENDIF.
" 第二行跳过
CHECK ls_upload-row <> 2.
IF p_auto = ''.
ASSIGN COMPONENT ls_upload-col OF STRUCTURE <ls_import> TO FIELD-SYMBOL(<lv_value>).
IF sy-subrc = 0 AND <lv_value> IS ASSIGNED.
<lv_value> = ls_upload-value.
ENDIF.
ELSE.
READ TABLE lt_fieldnames INTO DATA(lv_fieldname) INDEX ls_upload-col.
IF sy-subrc = 0.
ASSIGN COMPONENT lv_fieldname OF STRUCTURE <ls_import> TO FIELD-SYMBOL(<lv_auto>).
IF sy-subrc = 0 AND <lv_auto> IS ASSIGNED.
<lv_auto> = ls_upload-value.
ENDIF.
ENDIF.
ENDIF.
" <--
AT END OF row.
APPEND <ls_import> TO <lt_import>.
CLEAR <ls_import>.
ENDAT.
ENDLOOP.
MOVE-CORRESPONDING <lt_import> TO <gt_display>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& 设置 layout
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout = VALUE #(
zebra = 'X'
cwidth_opt = 'X'
).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& alv 展示
*&---------------------------------------------------------------------*
FORM frm_alv_display .
DATA: lt_events TYPE slis_t_event,
ls_events TYPE slis_alv_event.
DATA: lv_lines TYPE i.
lv_lines = lines( <gt_display> ).
IF lv_lines <> 0.
MESSAGE s004(zpp01) WITH lv_lines. " 查到 & 条数据
ENDIF.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_callback_pf_status_set = 'FRM_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
it_events = lt_events[]
TABLES
t_outtab = <gt_display>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PF_STATUS
*&---------------------------------------------------------------------*
* toolbar 设置
*----------------------------------------------------------------------*
FORM frm_pf_status USING p_extab TYPE slis_t_extab.
DATA: lt_extab TYPE slis_t_extab.
MOVE-CORRESPONDING p_extab TO lt_extab.
SET PF-STATUS 'STANDARD' EXCLUDING lt_extab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
* 点击事件处理
*----------------------------------------------------------------------*
FORM frm_user_command USING p_ucomm LIKE sy-ucomm
p_ls_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: lt_rows TYPE lvc_t_row,
ls_row TYPE lvc_s_row.
DATA: lv_subrc TYPE i.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
lr_grid->check_changed_data( ).
CASE p_ucomm.
WHEN 'CAL_FUNC'.
PERFORM frm_call_function.
WHEN OTHERS.
ENDCASE.
lr_grid->check_changed_data( ).
p_ls_selfield-refresh = 'X'.
p_ls_selfield-col_stable = 'X' .
p_ls_selfield-row_stable = 'X' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_call_function
*&---------------------------------------------------------------------*
*& 调用函数
*&---------------------------------------------------------------------*
FORM frm_call_function .
DATA: ls_zssd201 TYPE zssd201.
DATA: ls_zsps201 TYPE zsps201,
lt_zttps201 TYPE zttps201.
DATA: ls_result TYPE zsxx001,
lv_kunnr TYPE kunnr.
CASE p_func.
WHEN 'ZFMSD_201'.
LOOP AT <gt_display> ASSIGNING FIELD-SYMBOL(<ls_display>).
MOVE-CORRESPONDING <ls_display> TO ls_zssd201.
MOVE-CORRESPONDING <ls_display> TO ls_zssd201-sale.
CALL FUNCTION 'ZFMSD_201'
EXPORTING
i_bphead = ls_zssd201
IMPORTING
result = ls_result
kunnr = lv_kunnr.
ASSIGN COMPONENT 'ICON' OF STRUCTURE <ls_display> TO FIELD-SYMBOL(<lv_icon>).
IF sy-subrc = 0.
IF ls_result-type = 'S'.
<lv_icon> = icon_led_green.
ELSE.
<lv_icon> = icon_led_red.
ENDIF.
ENDIF.
ASSIGN COMPONENT 'MSG' OF STRUCTURE <ls_display> TO FIELD-SYMBOL(<lv_msg>).
IF sy-subrc = 0.
IF ls_result-type = 'S'.
<lv_msg> = lv_kunnr.
ELSE.
<lv_msg> = ls_result-message.
ENDIF.
ENDIF.
CLEAR: ls_zssd201, ls_result, lv_kunnr.
ENDLOOP.
WHEN 'ZFMPS_201'.
LOOP AT <gt_display> ASSIGNING FIELD-SYMBOL(<ls_ps201>).
MOVE-CORRESPONDING <ls_ps201> TO ls_zsps201.
APPEND ls_zsps201 TO lt_zttps201.
CALL FUNCTION 'ZFMPS_201'
EXPORTING
input = lt_zttps201
IMPORTING
result = ls_result.
ASSIGN COMPONENT 'ICON' OF STRUCTURE <ls_ps201> TO <lv_icon>.
IF sy-subrc = 0.
IF ls_result-type = 'S'.
<lv_icon> = icon_led_green.
ELSE.
<lv_icon> = icon_led_red.
ENDIF.
ENDIF.
ASSIGN COMPONENT 'MSG' OF STRUCTURE <ls_ps201> TO <lv_msg>.
IF sy-subrc = 0.
IF ls_result-type = 'S'.
<lv_msg> = lv_kunnr.
ELSE.
<lv_msg> = ls_result-message.
ENDIF.
ENDIF.
CLEAR: ls_zsps201, lt_zttps201, ls_result.
ENDLOOP.
WHEN OTHERS.
MESSAGE '未编写相关逻辑' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_FUNC
*&---------------------------------------------------------------------*
*& 检查函数是否存在
*&---------------------------------------------------------------------*
FORM frm_check_func .
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = p_func
EXCEPTIONS
function_not_exist = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE '未找到对应的函数' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALL_FUNC_DIRECT
*&---------------------------------------------------------------------*
*& 使用接口的方式调用函数
*&---------------------------------------------------------------------*
FORM frm_call_func_direct .
DATA: ls_header TYPE header_fb,
lt_tables TYPE rsfb_para,
lt_import TYPE rsfb_para,
lt_export TYPE rsfb_para,
lt_change TYPE rsfb_para.
DATA: lt_parameter TYPE rsfb_para.
DATA: lt_ptab TYPE abap_func_parmbind_tab,
ls_ptab TYPE abap_func_parmbind,
lt_ptab_temp TYPE abap_func_parmbind_tab,
lt_etab TYPE abap_func_excpbind_tab.
DATA: lv_kind TYPE i .
DATA: lo_table TYPE REF TO data.
FIELD-SYMBOLS: <fs_table> TYPE ANY TABLE.
DATA: lt_dyn_comp TYPE cl_abap_structdescr=>component_table,
ls_dyn_comp LIKE LINE OF lt_dyn_comp.
DATA: lo_req_tab TYPE REF TO data,
lo_req_data TYPE REF TO data,
lo_res_tab TYPE REF TO data,
lo_res_data TYPE REF TO data.
DATA: lv_exception TYPE char01 .
FIELD-SYMBOLS: <fs_req_tab> TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_res_tab> TYPE ANY TABLE.
FIELD-SYMBOLS: <ls_req_data> TYPE any.
FIELD-SYMBOLS: <ls_res_data> TYPE any.
DATA: lv_str TYPE string.
DATA: lr_xml TYPE REF TO cl_xml_document.
SELECT SINGLE
*
INTO @DATA(ls_in_conf)
FROM ztapi_in_conf
WHERE func_name EQ @p_func.
IF sy-subrc <> 0.
MESSAGE '未找到对应配置' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
" 回找配置文件
SELECT SINGLE json_mode FROM ztapi_main_conf
INTO @DATA(lv_json_mode)
WHERE api_no = @ls_in_conf-api_no.
" 函数参数结构读取
ls_header-name = ls_in_conf-func_name.
ls_header-state = 'A' .
CALL METHOD cl_fb_parameter_db=>read
IMPORTING
tables = lt_tables
import = lt_import
export = lt_export
change = lt_change
CHANGING
header = ls_header.
APPEND LINES OF lt_import TO lt_parameter.
APPEND LINES OF lt_export TO lt_parameter.
APPEND LINES OF lt_change TO lt_parameter.
APPEND LINES OF lt_tables TO lt_parameter.
LOOP AT lt_parameter INTO DATA(ls_parameter).
IF ls_parameter-parameter = 'COMMON_INFO_REQ' OR
ls_parameter-parameter = 'COMMON_INFO_RES'.
CONTINUE.
ENDIF.
IF ls_parameter-typefield = 'LIKE'.
CREATE DATA lo_table TYPE STANDARD TABLE OF (ls_parameter-structure).
ASSIGN lo_table->* TO <fs_table>.
CLEAR ls_dyn_comp.
ls_dyn_comp-name = ls_parameter-parameter.
ls_dyn_comp-type ?= cl_abap_tabledescr=>describe_by_data( <fs_table> ).
APPEND ls_dyn_comp TO lt_dyn_comp.
ELSEIF ls_parameter-typefield = 'TYPE'.
CLEAR ls_dyn_comp.
ls_dyn_comp-name = ls_parameter-parameter.
ls_dyn_comp-type ?= cl_abap_tabledescr=>describe_by_name( ls_parameter-structure ).
APPEND ls_dyn_comp TO lt_dyn_comp.
ENDIF.
ENDLOOP.
DATA(lo_req_type) = cl_abap_structdescr=>create( lt_dyn_comp ).
DATA(lo_req_tabdesc) = cl_abap_tabledescr=>create(
p_line_type = lo_req_type
p_table_kind = cl_abap_tabledescr=>tablekind_std
p_unique = abap_false ).
CREATE DATA lo_req_tab TYPE HANDLE lo_req_tabdesc.
ASSIGN lo_req_tab->* TO <fs_req_tab>.
CREATE DATA lo_req_data LIKE LINE OF <fs_req_tab>.
ASSIGN lo_req_data->* TO <ls_req_data>.
/ui2/cl_json=>deserialize(
EXPORTING
json = gv_str
pretty_name = lv_json_mode
CHANGING
data = <ls_req_data> ).
LOOP AT lt_parameter INTO ls_parameter.
CLEAR lt_ptab_temp .
CASE ls_parameter-paramtype.
WHEN 'I'.
lv_kind = abap_func_exporting .
WHEN 'E'.
lv_kind = abap_func_importing.
WHEN 'T'.
lv_kind = abap_func_tables.
WHEN 'C'.
lv_kind = abap_func_changing.
WHEN OTHERS.
ENDCASE.
ASSIGN COMPONENT ls_parameter-parameter OF STRUCTURE <ls_req_data>
TO FIELD-SYMBOL(<fs_para_data>).
CLEAR ls_ptab.
ls_ptab-name = ls_parameter-parameter.
ls_ptab-kind = lv_kind.
GET REFERENCE OF <fs_para_data> INTO ls_ptab-value.
INSERT ls_ptab INTO TABLE lt_ptab.
ENDLOOP.
lt_etab = VALUE #( ( name = 'OTHERS' value = 10 ) ) .
TRY .
CALL FUNCTION ls_in_conf-func_name
PARAMETER-TABLE lt_ptab
EXCEPTION-TABLE lt_etab.
CATCH cx_root INTO DATA(lr_root) .
lv_exception = 'X' .
ENDTRY .
IF lv_exception = 'X'.
MESSAGE 'ERP端API调用异常' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
DATA(lt_res_comp) = lt_dyn_comp.
LOOP AT lt_parameter INTO ls_parameter.
IF ls_parameter-paramtype = 'I'.
READ TABLE lt_res_comp TRANSPORTING NO FIELDS
WITH KEY name = ls_parameter-parameter.
IF sy-subrc = 0.
DELETE lt_res_comp INDEX sy-tabix.
ENDIF.
ENDIF.
ENDLOOP.
DATA(lo_res_type) = cl_abap_structdescr=>create( lt_res_comp ).
DATA(lo_res_tabdesc) = cl_abap_tabledescr=>create(
p_line_type = lo_res_type
p_table_kind = cl_abap_tabledescr=>tablekind_std
p_unique = abap_false ).
CREATE DATA lo_res_tab TYPE HANDLE lo_res_tabdesc.
ASSIGN lo_res_tab->* TO <fs_res_tab>.
CREATE DATA lo_res_data LIKE LINE OF <fs_res_tab>.
ASSIGN lo_res_data->* TO <ls_res_data>.
LOOP AT lt_ptab INTO ls_ptab.
ASSIGN COMPONENT ls_ptab-name OF STRUCTURE <ls_res_data>
TO FIELD-SYMBOL(<fs_comp>).
IF sy-subrc = 0.
ASSIGN ls_ptab-value->* TO <fs_para_data>.
<fs_comp> = <fs_para_data>.
ENDIF.
ENDLOOP.
/ui2/cl_json=>serialize(
EXPORTING
data = <ls_res_data>
pretty_name = lv_json_mode
RECEIVING
r_json = lv_str ) .
" JSON 展示
TRY.
CALL TRANSFORMATION sjson2html SOURCE XML lv_str
RESULT XML DATA(lv_html).
CATCH cx_xslt_runtime_error INTO DATA(lo_err).
DATA(lv_err_text) = lo_err->get_text( ).
MESSAGE lv_err_text TYPE 'S' DISPLAY LIKE 'E'.
STOP .
ENDTRY.
DATA(lv_convert) = cl_abap_codepage=>convert_from( lv_html ).
lr_xml = NEW cl_xml_document( ).
IF lr_xml->parse_string( stream = lv_convert ).
lr_xml->display( ).
ELSE.
MESSAGE '展示失败' TYPE 'S' DISPLAY LIKE 'E'.
cl_demo_output=>display( <ls_res_data> ).
ENDIF.
ENDFORM.