*&---------------------------------------------------------------------*
* Version : DEV001 *
* User : *
* Date : 20230727 *
* Description : 解析 FM 参数成JSON结构 *
* Transp. Request: *
************************************************************************
************************************************************************
* CHANGE HISTORY LOG
*-----------------------------------------------------------------------
* MOD. NO. DATE | NAME | TR NUMBER | CHANGE REFERENCE
*-----------------------------------------------------------------------
* MOD-XXXXX | XX.XX.XXXX | UXXXXXXX | CSEXXXXXX| INC00000XXXXXXXX
*
*-----------------------------------------------------------------------
REPORT yjson_fm_serilize.
DATA: gt_params TYPE STANDARD TABLE OF rfc_fint_p,
gt_paramtab TYPE abap_func_parmbind_tab,
gt_exceptab TYPE abap_func_excpbind_tab,
gv_xstring TYPE xstring.
DATA:gv_flag TYPE char01.
DATA:gv_table_flag TYPE char01.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME.
PARAMETERS :p1 TYPE char1 RADIOBUTTON GROUP g2 DEFAULT 'X' USER-COMMAND u1 .
PARAMETERS :p2 TYPE char1 RADIOBUTTON GROUP g2 .
PARAMETERS p_name TYPE rs38l_fnam MATCHCODE OBJECT sfunc_modules DEFAULT 'ztest03' MODIF ID m1.
PARAMETERS p_tname TYPE tabname MATCHCODE OBJECT dd_types MODIF ID m2.
SELECTION-SCREEN END OF BLOCK blk1.
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_modify_screen.
INITIALIZATION.
%_p_name_%_app_%-text = '函数名'.
%_p1_%_app_%-text = '解析函数参数'.
%_p2_%_app_%-text = '解析数据类型'.
%_p_tname_%_app_%-text = '数据类型'.
***********************************************************************
* START-OF-SELECTION *
***********************************************************************
START-OF-SELECTION.
PERFORM check_input.
CLEAR: gt_params, gt_paramtab, gt_exceptab, gv_xstring.
CASE abap_true.
WHEN p1.
PERFORM build_params.
WHEN p2.
PERFORM build_str_json.
WHEN OTHERS.
CLEAR sy-subrc.
ENDCASE.
*&---------------------------------------------------------------------*
*& Form build_params
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_params.
DATA:lv_index TYPE i,
lv_index_1 TYPE i,
lv_table_flag TYPE char01,
lt_flist TYPE ddfields,
lt_flist_temp TYPE ddfields,
ls_flist TYPE dfies,
lv_json_all TYPE string,
lv_json TYPE string.
DATA ls_paramline TYPE LINE OF abap_func_parmbind_tab.
DATA ls_exceptline TYPE LINE OF abap_func_excpbind_tab.
DATA ls_params_p TYPE rfc_fint_p.
* 获取RFC的参数
CALL FUNCTION 'RFC_GET_FUNCTION_INTERFACE_P'
EXPORTING
funcname = p_name
language = sy-langu
TABLES
params_p = gt_params
EXCEPTIONS
fu_not_found = 1
nametab_fault = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
STOP.
ENDIF.
SORT gt_params BY paramclass DESCENDING.
* Build params table
BREAK-POINT.
LOOP AT gt_params INTO ls_params_p.
lv_index_1 = lv_index_1 + 1.
CLEAR lv_json.
CLEAR lv_table_flag.
CLEAR ls_paramline.
CLEAR lt_flist.
CLEAR gv_table_flag.
CASE ls_params_p-paramclass.
* Import/Export/Changing参数
WHEN 'I' OR 'E' OR 'C' OR 'T'.
IF ls_params_p-fieldname IS INITIAL.
SELECT SINGLE rowtype
INTO @DATA(lv_rowtype_y_n)
FROM dd40l
WHERE typename = @ls_params_p-tabname
AND as4local = 'A'.
IF sy-subrc IS INITIAL.
lv_table_flag = abap_true.
ls_params_p-tabname = lv_rowtype_y_n.
ENDIF.
PERFORM get_tabfields USING ls_params_p-tabname
CHANGING lt_flist.
ENDIF.
IF lt_flist IS NOT INITIAL.
IF lv_table_flag = abap_true.
*table 格式
lv_json = lv_json && '"' && ls_params_p-parameter && '"' && ':' && '[' && '{'.
ELSE.
*结构格式
lv_json = lv_json && '"' && ls_params_p-parameter && '"' && ':' && '{' .
ENDIF.
gv_table_flag = lv_table_flag.
*S Structured type (possibly as INCLUDE)
*L Table type
CLEAR lv_index.
CLEAR gv_flag.
lt_flist_temp = lt_flist.
DELETE lt_flist_temp WHERE comptype = 'S' OR comptype = 'L'.
IF sy-subrc IS NOT INITIAL.
gv_flag = abap_true.
ENDIF.
LOOP AT lt_flist INTO ls_flist.
lv_index = lv_index + 1.
PERFORM get_json_all USING ls_flist
lt_flist
lv_index_1
lv_index
CHANGING lv_json.
ENDLOOP.
IF lv_table_flag = abap_true.
*table 格式
lv_json = lv_json && '}' && ']'.
ELSE.
ENDIF.
ELSE.
CLEAR ls_flist-fieldtext.
lv_json = lv_json && '"' && ls_params_p-parameter && '"' && ':' && '"' && ls_flist-fieldtext && '"' .
ENDIF.
ENDCASE.
IF lv_json_all IS INITIAL.
lv_json_all = lv_json.
ELSE.
lv_json_all = lv_json_all && ',' && lv_json.
ENDIF.
CLEAR gv_flag.
CLEAR gv_table_flag.
ENDLOOP.
lv_json_all = lv_json_all && '}' .
lv_json_all = '{' && lv_json_all && '}'.
cl_demo_output=>display_json( lv_json_all ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_tabfields
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_FLIST_ROLLNAME
*& <-- LT_FLIST_S
*&---------------------------------------------------------------------*
FORM get_tabfields USING iv_tabname TYPE any
CHANGING ct_flist TYPE ddfields.
DATA:
lo_type TYPE REF TO cl_abap_typedescr,
lo_struct TYPE REF TO cl_abap_structdescr.
CLEAR ct_flist.
CALL METHOD cl_abap_typedescr=>describe_by_name
EXPORTING
p_name = iv_tabname
RECEIVING
p_descr_ref = lo_type
EXCEPTIONS
type_not_found = 1.
IF lo_type->kind <> cl_abap_typedescr=>kind_struct.
gv_flag = abap_true.
RETURN.
ENDIF.
lo_struct ?= lo_type.
CALL METHOD lo_struct->get_ddic_field_list
RECEIVING
p_field_list = ct_flist
EXCEPTIONS
not_found = 1
no_ddic_type = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_json
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LT_FLIST_S
*& <-- LV_JSON
*&---------------------------------------------------------------------*
FORM get_json USING it_flist TYPE ddfields
iv_datatype TYPE dynptype
iv_index_1 TYPE sy-tabix
CHANGING cv_json TYPE string.
DATA:lv_index TYPE i,
lv_json TYPE string,
lt_flist TYPE ddfields,
lt_flist_s TYPE ddfields,
lt_flist_t TYPE ddfields.
LOOP AT it_flist INTO DATA(ls_flist).
lv_index = lv_index + 1 .
CLEAR ls_flist-fieldtext.
PERFORM get_json_all USING ls_flist
it_flist
iv_index_1
lv_index
CHANGING cv_json.
ENDLOOP.
IF iv_datatype = 'TTYP'.
cv_json = cv_json && '}]' .
ELSE.
cv_json = cv_json && '}' .
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_json_all
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_FLIST
*& --> LT_FLIST
*& --> LV_INDEX_1
*& <-- LV_JSON
*&---------------------------------------------------------------------*
FORM get_json_all USING is_flist TYPE dfies
it_flist TYPE ddfields
iv_index_1 TYPE sy-index
iv_index TYPE sy-index
CHANGING cv_json TYPE string.
DATA:ls_flist TYPE dfies.
DATA:lt_flist TYPE ddfields.
DATA:lt_flist_temp TYPE ddfields.
DATA:lt_flist_s TYPE ddfields.
DATA:lt_flist_t TYPE ddfields.
DATA:lv_index_1 TYPE sy-index.
DATA:lv_index TYPE sy-index.
DATA:lv_json TYPE string.
lv_json = cv_json.
lv_index_1 = iv_index_1.
ls_flist = is_flist.
lt_flist = it_flist.
lt_flist_temp = it_flist.
CLEAR ls_flist-fieldtext.
lv_index = iv_index.
IF ls_flist-comptype = 'S' OR ls_flist-comptype = 'L'.
IF ls_flist-datatype = 'STRU'.
PERFORM get_tabfields USING ls_flist-rollname
CHANGING lt_flist_s.
lv_json = lv_json && '"' && ls_flist-fieldname && '"' && ':' && '{'.
PERFORM get_json USING lt_flist_s
ls_flist-datatype
iv_index_1
CHANGING lv_json.
CLEAR lt_flist_s.
IF lines( lt_flist ) = lv_index.
lv_json = lv_json && '}'.
ELSE.
lv_json = lv_json && ','.
ENDIF.
ENDIF.
IF ls_flist-datatype = 'TTYP'.
* 获取行类型
SELECT SINGLE rowtype
INTO @DATA(lv_rowtype)
FROM dd40l
WHERE typename = @ls_flist-rollname
AND as4local = 'A'.
IF sy-subrc IS INITIAL.
PERFORM get_tabfields USING lv_rowtype
CHANGING lt_flist_t.
lv_json = lv_json && '"' && ls_flist-fieldname && '"' && ':' && '[' && '{'.
PERFORM get_json USING lt_flist_t
ls_flist-datatype
iv_index_1
CHANGING lv_json.
IF lines( it_flist ) = lv_index.
ELSE.
lv_json = lv_json && ','.
ENDIF.
ENDIF.
ENDIF.
ELSE.
IF lines( lt_flist ) = lv_index.
IF gv_flag = abap_true.
IF gv_table_flag = abap_true.
lv_json = lv_json && '"' && ls_flist-fieldname && '"' && ':' && '"' && ls_flist-fieldtext && '"'.
ELSE.
lv_json = lv_json && '"' && ls_flist-fieldname && '"' && ':' && '"' && ls_flist-fieldtext && '"' && '}'.
ENDIF.
ELSE.
lv_json = lv_json && '"' && ls_flist-fieldname && '"' && ':' && '"' && ls_flist-fieldtext && '"'. " && '}'.
ENDIF.
ELSE.
lv_json = lv_json && '"' && ls_flist-fieldname && '"' && ':' && '"' && ls_flist-fieldtext && '"' && ','.
ENDIF.
ENDIF.
cv_json = lv_json.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_modify_screen
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_modify_screen .
LOOP AT SCREEN.
CASE screen-group1.
WHEN 'M1'.
IF p1 IS INITIAL.
screen-active = '0'."not display
ELSE.
screen-active = '1'."display
ENDIF.
WHEN 'M2'.
IF p2 IS INITIAL.
screen-active = '0'."not display
ELSE.
screen-active = '1'."display
ENDIF.
ENDCASE.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form check_input
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM check_input .
IF p1 IS NOT INITIAL.
IF p_name IS INITIAL.
MESSAGE '请输入函数名称' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDIF.
IF p2 IS NOT INITIAL.
IF p_tname IS INITIAL.
MESSAGE '请输入数据类型' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_str_json
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_str_json .
DATA:lv_index TYPE i,
lv_index_1 TYPE i,
lv_table_flag TYPE char01,
lt_flist TYPE ddfields,
lt_flist_temp TYPE ddfields,
ls_flist TYPE dfies,
lv_json_all TYPE string,
lv_json TYPE string.
lv_index_1 = lv_index_1 + 1.
CLEAR lv_json.
CLEAR lv_table_flag.
CLEAR lt_flist.
CLEAR gv_table_flag.
SELECT SINGLE rowtype
INTO @DATA(lv_rowtype_y_n)
FROM dd40l
WHERE typename = @p_tname
AND as4local = 'A'.
IF sy-subrc IS INITIAL.
lv_table_flag = abap_true.
* ls_params_p-tabname = lv_rowtype_y_n.
ELSE.
lv_rowtype_y_n = p_tname.
ENDIF.
PERFORM get_tabfields USING lv_rowtype_y_n
CHANGING lt_flist.
IF lt_flist IS NOT INITIAL.
IF lv_table_flag = abap_true.
*table 格式
lv_json = lv_json && '"' && p_tname && '"' && ':' && '[' && '{'.
ELSE.
*结构格式
lv_json = lv_json && '"' && p_tname && '"' && ':' && '{' .
ENDIF.
gv_table_flag = lv_table_flag.
*S Structured type (possibly as INCLUDE)
*L Table type
CLEAR lv_index.
CLEAR gv_flag.
lt_flist_temp = lt_flist.
DELETE lt_flist_temp WHERE comptype = 'S' OR comptype = 'L'.
IF sy-subrc IS NOT INITIAL.
gv_flag = abap_true.
ENDIF.
LOOP AT lt_flist INTO ls_flist.
lv_index = lv_index + 1.
PERFORM get_json_all USING ls_flist
lt_flist
lv_index_1
lv_index
CHANGING lv_json.
ENDLOOP.
IF lv_table_flag = abap_true.
*table 格式
lv_json = lv_json && '}' && ']'.
ELSE.
ENDIF.
ELSE.
CLEAR ls_flist-fieldtext.
lv_json = lv_json && '"' && p_tname && '"' && ':' && '"' && ls_flist-fieldtext && '"' .
ENDIF.
IF lv_json_all IS INITIAL.
lv_json_all = lv_json.
ELSE.
lv_json_all = lv_json_all && ',' && lv_json.
ENDIF.
CLEAR gv_flag.
CLEAR gv_table_flag.
lv_json_all = lv_json_all && '}' .
lv_json_all = '{' && lv_json_all && '}'.
cl_demo_output=>display_json( lv_json_all ).
ENDFORM.
ABAP 解析函数参数转换JSON 格式
于 2023-07-27 17:30:41 首次发布