ABAP 解析函数参数转换JSON 格式

*&---------------------------------------------------------------------*
*  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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值