ABAP SAP接口通用日志存储,以及查看

  在外部调用接口时,通常会需要保存外部的调用记录,期间会用到表,这里将传入的表转换成json格式(也可以转换成XML),并存入通用日志表中。

1.SE11,新建通用的LOG表,表结构参考下图:

 

 

 2.在接口中,如果需要保存记录,则调用下面代码。

DATA: json_ser TYPE REF TO cl_trex_json_serializer,
        json_des TYPE REF TO cl_trex_json_deserializer.
  DATA: jsonstr TYPE string.

CREATE OBJECT json_ser
    EXPORTING
      data = it_plm007[].
  CALL METHOD json_ser->serialize.
  CALL METHOD json_ser->get_data
    RECEIVING
      rval = jsonstr.

  ls_zrfc_logs-funcname   = 'Z_RFC_PLM_007'.
  ls_zrfc_logs-zsystem    = p_system.
  ls_zrfc_logs-uname      = p_uname.
  ls_zrfc_logs-zname1     = p_name1.
  ls_zrfc_logs-erdat      = sy-datum.
  ls_zrfc_logs-uzeit      = sy-uzeit.
*  ls_zrfc_logs-ep_type    = ep_type.
*  ls_zrfc_logs-ep_message = ep_message.
  ls_zrfc_logs-jsonstr1   = jsonstr.

  MODIFY zrfc_logs FROM ls_zrfc_logs.
  IF sy-subrc EQ 0.
    COMMIT WORK AND WAIT.
  ELSE.
    ROLLBACK WORK.
  ENDIF.
View Code

3.写个查看日志的报表

效果如下图所示

 

 

 

 

 

 附上代码:

主程序:

*&---------------------------------------------------------------------*
*& Report ZIT0010
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zit0010.
INCLUDE zit0010_head.
INCLUDE zit0010_screen.
INCLUDE zit0010_form.



START-OF-SELECTION.
  PERFORM frm_get_data. "动态创建内表 <dyn_table>,并生成lt_alv_cat
  PERFORM frm_get_data2.

END-OF-SELECTION.
  PERFORM f_display_data.
View Code

包含文件ZIT0010_HEAD

*&---------------------------------------------------------------------*
*& 包含               ZIT0010_HEAD
*&---------------------------------------------------------------------*

TABLES:SSCRFIELDS,TFTIT.
TYPE-POOLS: SLIS,OLE2.

DATA: D_REF      TYPE REF TO DATA,
      D_REF2     TYPE REF TO DATA,
      LT_ALV_CAT TYPE TABLE OF LVC_S_FCAT,
      LS_ALV_CAT LIKE LINE OF LT_ALV_CAT.

DATA: LT_TABLE LIKE TABLE OF DNTAB.
DATA: LS_TABLE TYPE DNTAB.

DATA: DYN_TABLE TYPE REF TO DATA.
DATA: DYN_WA TYPE REF TO DATA.
FIELD-SYMBOLS :<DYN_TABLE> TYPE TABLE,
               <DYN_WA>    TYPE ANY,
               <DYN_FIELD> TYPE ANY,
               <FS_STR>    TYPE ANY.


DATA: DYN_TABLE2 TYPE REF TO DATA.
DATA: DYN_WA2 TYPE REF TO DATA.


FIELD-SYMBOLS :<DYN_TABLE2> TYPE TABLE,
               <DYN_WA2>    TYPE ANY,
               <DYN_FIELD2> TYPE ANY,
               <FS_STR2>    TYPE ANY.
DATA: GO_EXCEL    TYPE OLE2_OBJECT,
      GO_WORKBOOK TYPE OLE2_OBJECT,
      GO_SHEET    TYPE OLE2_OBJECT.
DATA: GS_LAYOUT   TYPE LVC_S_LAYO,
      GT_FIELDCAT TYPE LVC_T_FCAT.

TYPES: BEGIN OF SY_OUTPUT,
         FUNCNAME   TYPE  ZRFC_LOGS-FUNCNAME,
         ZSYSTEM    TYPE  ZRFC_LOGS-ZSYSTEM,
         UNAME      TYPE  ZRFC_LOGS-UNAME,
         ZNAME1     TYPE  ZRFC_LOGS-ZNAME1,
         ERDAT      TYPE  ZRFC_LOGS-ERDAT,
         UZEIT      TYPE  ZRFC_LOGS-UZEIT,
         POSNR      TYPE  ZRFC_LOGS-POSNR,
         P_STR1     TYPE  ZRFC_LOGS-P_STR1,
         P_STR2     TYPE  ZRFC_LOGS-P_STR2,
         P_STR3     TYPE  ZRFC_LOGS-P_STR3,
         P_STR4     TYPE  ZRFC_LOGS-P_STR4,
         P_STR5     TYPE  ZRFC_LOGS-P_STR5,
         P_STR6     TYPE  ZRFC_LOGS-P_STR6,
         P_STR7     TYPE  ZRFC_LOGS-P_STR7,
         P_STR8     TYPE  ZRFC_LOGS-P_STR8,
         P_STR9     TYPE  ZRFC_LOGS-P_STR9,
         P_STR10    TYPE  ZRFC_LOGS-P_STR10,
         EP_TYPE    TYPE  ZRFC_LOGS-EP_TYPE,
         EP_MESSAGE TYPE  ZRFC_LOGS-EP_MESSAGE,
         JSONSTR1   TYPE  ZRFC_LOGS-JSONSTR1,
         JSONSTR2   TYPE  ZRFC_LOGS-JSONSTR2,
         JSONSTR3   TYPE  ZRFC_LOGS-JSONSTR3,
         JSONSTR4   TYPE  ZRFC_LOGS-JSONSTR4,
         JSONSTR5   TYPE  ZRFC_LOGS-JSONSTR5,
         STRUCTURE  TYPE  FUPARAREF-STRUCTURE,
         STRUCTURE2 TYPE  FUPARAREF-STRUCTURE.
TYPES: ZCOLOR(4),
       MESSAGE   TYPE CHAR200, "
       CELLCOLOR TYPE LVC_T_SCOL,
       SLBOX,
       END OF SY_OUTPUT.

DATA: GT_OUTPUT TYPE TABLE OF SY_OUTPUT,
      GS_OUTPUT TYPE SY_OUTPUT.
DATA: GT_FUPARAREF LIKE TABLE OF FUPARAREF,
      GS_FUPARAREF LIKE FUPARAREF.
FIELD-SYMBOLS: <FS_OUTPUT> TYPE SY_OUTPUT,
               <FS_OUTPUT2> TYPE SY_OUTPUT.
DATA: GT_EVENTS TYPE SLIS_T_EVENT,
      GS_EVENTS LIKE LINE OF GT_EVENTS.
DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: GT_BAD_CELLS TYPE LVC_T_MODI.
*data: gt_fieldcat type lvc_t_fcat.
DATA: G_ROW_ID TYPE LVC_S_ROID-ROW_ID.
FIELD-SYMBOLS: <GS_OUTTAB> TYPE ANY.

CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
DATA:GO_GRID           TYPE REF TO CL_GUI_ALV_GRID,
     GO_EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.

*----------------------------------------------------------------------*
* CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      ON_F4 FOR EVENT ONF4 OF CL_GUI_ALV_GRID
        IMPORTING SENDER
                    E_FIELDNAME
                    E_FIELDVALUE
                    ES_ROW_NO
                    ER_EVENT_DATA
                    ET_BAD_CELLS
                    E_DISPLAY,
      ON_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
        IMPORTING E_ONF4
                    E_ONF4_BEFORE
                    E_ONF4_AFTER
                    ER_DATA_CHANGED
                    E_UCOMM
                    SENDER.
*  PRIVATE SECTION.
*    TYPES: ddshretval_table TYPE TABLE OF ddshretval.
*    CLASS-METHODS: my_f4
*      IMPORTING sender        TYPE REF TO cl_gui_alv_grid
*                et_bad_cells  TYPE lvc_t_modi
*                es_row_no     TYPE lvc_s_roid
*                er_event_data TYPE REF TO cl_alv_event_data
*                e_display     TYPE c
*                e_fieldname   TYPE lvc_fname
*      EXPORTING im_lt_f4      TYPE ddshretval_table.
ENDCLASS. "lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  METHOD ON_F4.
*    FIELD-SYMBOLS:<fs_alv> TYPE gs_output.
    CASE E_FIELDNAME.
      WHEN 'STRUCTURE'.
        READ TABLE GT_OUTPUT ASSIGNING <FS_OUTPUT> INDEX ES_ROW_NO-ROW_ID.
        IF SY-SUBRC = 0.
          PERFORM FRM_GET_STURCT_F4 USING <FS_OUTPUT>-FUNCNAME CHANGING <FS_OUTPUT>-STRUCTURE.
          LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT2> WHERE FUNCNAME EQ <FS_OUTPUT>-FUNCNAME.
            <FS_OUTPUT2>-STRUCTURE = <FS_OUTPUT>-STRUCTURE.
          ENDLOOP.
        ENDIF.
      WHEN 'STRUCTURE2'.
        READ TABLE GT_OUTPUT ASSIGNING <FS_OUTPUT> INDEX ES_ROW_NO-ROW_ID.
        IF SY-SUBRC = 0.
          PERFORM FRM_GET_STURCT2_F4 USING <FS_OUTPUT>-FUNCNAME CHANGING <FS_OUTPUT>-STRUCTURE2.
          LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT2> WHERE FUNCNAME EQ <FS_OUTPUT>-FUNCNAME.
            <FS_OUTPUT2>-STRUCTURE2 = <FS_OUTPUT>-STRUCTURE2.
          ENDLOOP.
        ENDIF.
* WHEN .
      WHEN OTHERS.
    ENDCASE.
    PERFORM F_REFRESH_ALV.

*    CALL METHOD go_grid->refresh_table_display.
*    DATA: ls_f4 TYPE ddshretval,
*          lt_f4 TYPE TABLE OF ddshretval.
*    FIELD-SYMBOLS: <itab> TYPE lvc_t_modi.
*    DATA: ls_modi TYPE lvc_s_modi.
*    CALL METHOD my_f4
*      EXPORTING
*        sender        = sender
*        es_row_no     = es_row_no
*        er_event_data = er_event_data
*        et_bad_cells  = et_bad_cells
*        e_display     = e_display
*        e_fieldname   = e_fieldname
*      IMPORTING
*        im_lt_f4      = lt_f4.
*    ASSIGN er_event_data->m_data->* TO <itab>.
*    read table lt_f4 into ls_f4 with key fieldname = 'STRUCTURE'.
*    if not ls_f4 is initial.
*      ls_modi-row_id    = es_row_no-row_id.
*      ls_modi-fieldname = 'STRUCTURE'.
*      ls_modi-value     = ls_f4-fieldval.
*      append ls_modi to <itab>.
*      ls_modi-row_id = es_row_no-row_id.
*      ls_modi-fieldname = 'VALUE'.
*      if ls_f4-fieldval < 'D'.
*        ls_modi-value = 100.
*      elseif ls_f4-fieldval < 'R'.
*        ls_modi-value = 1000.
*      else.
*        ls_modi-value = 10000.
*      endif.
*      append ls_modi to <itab>.
*    endif.
*    READ TABLE lt_f4 INTO ls_f4 WITH KEY fieldname = 'STRUCTURE'.
*    IF NOT ls_f4 IS INITIAL.
*      ls_modi-row_id    = es_row_no-row_id.
*      ls_modi-fieldname = 'STRUCTURE'.
*      ls_modi-value     = ls_f4-fieldval.
*      APPEND ls_modi TO <itab>.
*    ENDIF.
*    er_event_data->m_event_handled = 'X'.
  ENDMETHOD.
  METHOD ON_DATA_CHANGED.
  ENDMETHOD.                    "on_data_changed
*  METHOD my_f4.
*    DATA: lw_tab      LIKE LINE OF gt_output,
*          lt_fcat     TYPE lvc_t_fcat,
*          ls_fieldcat TYPE lvc_s_fcat,
*          l_tabname   TYPE dd03v-tabname,
*          l_fieldname TYPE dd03v-fieldname,
*          l_help_valu TYPE help_info-fldvalue,
*          lt_bad_cell TYPE lvc_t_modi,
*          lp_wa       TYPE REF TO data.
*    FIELD-SYMBOLS: <l_field_value> TYPE any,
*                   <ls_wa>         TYPE any.
*    CALL METHOD sender->get_frontend_fieldcatalog
*      IMPORTING
*        et_fieldcatalog = lt_fcat.
*    READ TABLE gt_output INDEX es_row_no-row_id INTO lw_tab.
*    CREATE DATA lp_wa LIKE LINE OF gt_output.
*    ASSIGN lp_wa->* TO <ls_wa>.
*    <ls_wa> = lw_tab.
*    READ TABLE lt_fcat WITH KEY fieldname = e_fieldname INTO ls_fieldcat.
*    MOVE ls_fieldcat-ref_table TO l_tabname.
*    MOVE ls_fieldcat-fieldname TO l_fieldname.
*    ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE lw_tab TO <l_field_value>.
*    WRITE <l_field_value> TO l_help_valu.
*    PERFORM f4_set USING sender
*                       lt_fcat
*                       lt_bad_cell
*                       es_row_no-row_id
*                       <ls_wa>.
*    CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
*      EXPORTING
*        tabname          = l_tabname
*        fieldname        = l_fieldname
*        display          = e_display
*        value            = l_help_valu
*        callback_program = 'STRUCTURE' "'ZTEST7'
*        callback_form    = 'F4'
*      TABLES
*        return_tab       = im_lt_f4
*      EXCEPTIONS
*        parameter_error  = 1
*        no_values_found  = 2
*        OTHERS           = 3.
*  ENDMETHOD.                                               "my_f4
ENDCLASS. "lcl_event_receiver

*FORM f4_set USING r_grid TYPE REF TO cl_gui_alv_grid
*                    rt_fieldcat TYPE lvc_t_fcat
*                    rt_bad_cells TYPE lvc_t_modi
*                    r_row_id TYPE lvc_s_roid-row_id
*                    rs_outtab.
*  g_grid = r_grid.
*  gt_fieldcat = rt_fieldcat.
*  gt_bad_cells = rt_bad_cells.
*  g_row_id     = r_row_id.
*  ASSIGN rs_outtab TO <gs_outtab>.
*ENDFORM.                                                    "f4_set
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_STURCT2_F4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_<FS_OUTPUT>_FUNCNAME  text
*      <--P_<FS_OUTPUT>_STRUCTURE2  text
*----------------------------------------------------------------------*
FORM FRM_GET_STURCT2_F4  USING    PC_FUNC TYPE FUPARAREF-FUNCNAME
                       CHANGING PC_STRUC TYPE FUPARAREF-STRUCTURE.

  DATA:LT_RET_TAB TYPE TABLE OF DDSHRETVAL WITH HEADER LINE.

  DATA: LT_FUPARAREF LIKE TABLE OF FUPARAREF.
  LT_FUPARAREF[] = GT_FUPARAREF[].
  DELETE LT_FUPARAREF[] WHERE FUNCNAME NE PC_FUNC.
*  BREAK it0003.


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'STRUCTURE'
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = LT_FUPARAREF
      RETURN_TAB      = LT_RET_TAB
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
  IF SY-SUBRC = 0.
    READ TABLE LT_RET_TAB INDEX 1.
    IF SY-SUBRC = 0  AND LT_RET_TAB-FIELDVAL IS NOT INITIAL.
      PC_STRUC = LT_RET_TAB-FIELDVAL.
    ENDIF.
  ENDIF.

ENDFORM.                    " FRM_GET_ARKTX_F4
View Code
包含文件ZIT0010_SCREEN
*&---------------------------------------------------------------------*
*& 包含               ZIT0010_SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_fname FOR tftit-funcname,
                s_uname FOR sy-uname,
                s_erdat FOR sy-datum.
PARAMETERS:     p_str1 TYPE string.
SELECTION-SCREEN: END OF BLOCK b01.
View Code

包含文件ZIT0010_FORM

*&---------------------------------------------------------------------*
*& 包含               ZIT0010_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
*取出表结构的字段目录

  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      LANGU          = SY-LANGU
      TABNAME        = 'ZRFC_LOGS'
    TABLES
      NAMETAB        = LT_TABLE
    EXCEPTIONS
      NO_TEXTS_FOUND = 1.
*根据取出的字段目录生成参考字段目录

  CLEAR LT_ALV_CAT.
  LOOP AT LT_TABLE INTO LS_TABLE.
*    IF LS_TABLE-FIELDNAME NE 'MANDT'.
    LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME.
    LS_ALV_CAT-REF_TABLE = 'ZRFC_LOGS'.
    LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME.
    IF LS_TABLE-FIELDNAME EQ 'MEINS'.
      LS_ALV_CAT-NO_CONVEXT = 'X'.
*      CLEAR: ls_alv_cat-ref_field,ls_alv_cat-ref_table.
    ENDIF.
    LS_ALV_CAT-SELTEXT   = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_L = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_M = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_S = LS_TABLE-FIELDTEXT.
    APPEND LS_ALV_CAT TO LT_ALV_CAT.
*    ENDIF.
    CLEAR LS_ALV_CAT.
  ENDLOOP.

*内表创建

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = LT_ALV_CAT
    IMPORTING
      EP_TABLE        = D_REF.


*指定生成的内表到字段符号
*  ASSIGN d_ref->* TO <dyn_table>.
*
**创建动态工作区结构
*  CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.

*创建动态工作区
*  ASSIGN dyn_wa->* TO <dyn_wa>.

* zcolor
  DELETE LT_ALV_CAT[] WHERE FIELDNAME EQ 'MANDT'.
*  ls_alv_cat-fieldname = 'ZCOLOR'.
**  ls_alv_cat-ref_table = 'ZFICOS025'.
**  ls_alv_cat-ref_field = 'ZCOLOR'.
*  ls_alv_cat-seltext   = '更新结果'.
*  ls_alv_cat-scrtext_l = '更新结果'.
*  ls_alv_cat-scrtext_m = '更新结果'.
*  ls_alv_cat-scrtext_s = '更新结果'.
*  APPEND ls_alv_cat TO lt_alv_cat.
*  ls_alv_cat-fieldname = 'MESSAGE'.
**  ls_alv_cat-ref_table = 'ZFICOS025'.
**  ls_alv_cat-ref_field = 'MESSAGE'.
*  ls_alv_cat-seltext   = '更新信息'.
*  ls_alv_cat-scrtext_l = '更新信息'.
*  ls_alv_cat-scrtext_m = '更新信息'.
*  ls_alv_cat-scrtext_s = '更新信息'.
*  APPEND ls_alv_cat TO lt_alv_cat.
  LS_ALV_CAT-FIELDNAME  = 'STRUCTURE'.
*  ls_alv_cat-ref_table  = 'FUPARAREF'.
*  ls_alv_cat-ref_field  = 'STRUCTURE'.
  LS_ALV_CAT-SELTEXT    = 'JSON转换表'.
  LS_ALV_CAT-SCRTEXT_L  = 'JSON转换表'.
  LS_ALV_CAT-SCRTEXT_M  = 'JSON转换表'.
  LS_ALV_CAT-SCRTEXT_S  = 'JSON转换表'.
  LS_ALV_CAT-EDIT       = 'X'.
  LS_ALV_CAT-F4AVAILABL = 'X'.
  APPEND LS_ALV_CAT TO LT_ALV_CAT.
  CLEAR: LS_ALV_CAT.

  LS_ALV_CAT-FIELDNAME  = 'STRUCTURE2'.
*  ls_alv_cat-ref_table  = 'FUPARAREF'.
*  ls_alv_cat-ref_field  = 'STRUCTURE2'.
  LS_ALV_CAT-SELTEXT    = 'JSON转换对象'.
  LS_ALV_CAT-SCRTEXT_L  = 'JSON转换对象'.
  LS_ALV_CAT-SCRTEXT_M  = 'JSON转换对象'.
  LS_ALV_CAT-SCRTEXT_S  = 'JSON转换对象'.
  LS_ALV_CAT-OUTPUTLEN  = 45.  " 手动设置宽度
  LS_ALV_CAT-EDIT       = 'X'.
  LS_ALV_CAT-F4AVAILABL = 'X'.
  APPEND LS_ALV_CAT TO LT_ALV_CAT.
  CLEAR: LS_ALV_CAT.
ENDFORM.                    "frm_get_data
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA2 .
  TYPES: BEGIN OF SY_CHAR255,
           STR1 TYPE CHAR255,
         END OF SY_CHAR255.
  DATA: LS_CHAR255 TYPE SY_CHAR255.
  RANGES: S_STR1 FOR LS_CHAR255-STR1.
  IF P_STR1 NE ''.
    S_STR1-SIGN = 'I'.
    S_STR1-OPTION = 'CP'.
    S_STR1-LOW = P_STR1.
    APPEND S_STR1.
  ENDIF.
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT
    FROM ZRFC_LOGS
   WHERE FUNCNAME IN S_FNAME
     AND UNAME IN S_UNAME
     AND ERDAT IN S_ERDAT
     AND P_STR1 IN S_STR1.
  SELECT *
    INTO TABLE GT_FUPARAREF
    FROM FUPARAREF
   WHERE FUNCNAME IN S_FNAME.
*     AND PARAMTYPE EQ 'T'.

  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    READ TABLE GT_FUPARAREF INTO GS_FUPARAREF WITH KEY FUNCNAME = GS_OUTPUT-FUNCNAME.
    IF SY-SUBRC EQ 0.

    ENDIF.
    CLEAR: GS_OUTPUT.
  ENDLOOP.

ENDFORM.                    "frm_get_data2
*&---------------------------------------------------------------------*
*& Form F_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_DISPLAY_DATA .
  PERFORM F_SET_LAYOUT.
*  PERFORM F_SET_FIELDCAT.
  PERFORM F_SET_EVENT.
  PERFORM F_ALV_DISPLAY TABLES GT_OUTPUT.
ENDFORM.                    "f_display_data
*&---------------------------------------------------------------------*
*&      Form  f_set_event
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F_SET_EVENT.
  GS_EVENTS-NAME = 'CALLER_EXIT'.
  GS_EVENTS-FORM = 'CALLER_EXIT'.
  APPEND GS_EVENTS TO GT_EVENTS[].
ENDFORM.                    "f_set_event
*&---------------------------------------------------------------------*
*&      Form  f_set_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F_SET_LAYOUT.
  CLEAR: GS_LAYOUT.
  GS_LAYOUT-BOX_FNAME = 'SLBOX'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-CTAB_FNAME = 'CELLCOLOR'.
ENDFORM.                    "f_set_layout
*FORM F_SET_FIELDCAT.
*  CLEAR: GT_FIELDCAT[].
*  DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
*  DEFINE SET_FIELDCAT.
*    CLEAR: LS_FIELDCAT.
*    LS_FIELDCAT-FIELDNAME = &1.
*    LS_FIELDCAT-REF_FIELD = &2.
*    LS_FIELDCAT-REF_TABLE = &3.
*    LS_FIELDCAT-CONVEXIT  = &4.
*    LS_FIELDCAT-DO_SUM    = &5.
*    LS_FIELDCAT-SELTEXT   = &6.
*    LS_FIELDCAT-SCRTEXT_L = &6.
*    LS_FIELDCAT-SCRTEXT_M = &6.
*    LS_FIELDCAT-SCRTEXT_S = &6.
*    LS_FIELDCAT-COLTEXT   = &6.
*    APPEND LS_FIELDCAT TO GT_FIELDCAT.
*  END-OF-DEFINITION.
**显示内容
*  SET_FIELDCAT 'RBUKRS' 'RBUKRS' 'ACDOCA' '' ''  '公司代码'.
*  SET_FIELDCAT 'GJAHR'  'GJAHR'  'ACDOCA' '' ''  '会计年度'.
*  SET_FIELDCAT 'BUDAT'  'BUDAT'  'ACDOCA' '' ''  '过账日期'.
*ENDFORM.
FORM F_ALV_DISPLAY TABLES IT_TABLE.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'F_SET_PF_STATUS'
      I_CALLBACK_USER_COMMAND  = 'F_USER_COMMAND'
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_EVENTS                = GT_EVENTS
      IT_FIELDCAT_LVC          = LT_ALV_CAT
      I_SAVE                   = 'U'
    TABLES
      T_OUTTAB                 = IT_TABLE
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.                    "f_alv_display
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
  DATA: ITAB TYPE TABLE OF SY-UCOMM.
  IF SY-UNAME EQ 'MISHM'.
    SET PF-STATUS 'STD' EXCLUDING ITAB..
  ELSE.
    APPEND 'ZDEBUG' TO ITAB.
    SET PF-STATUS 'STD' EXCLUDING ITAB..
  ENDIF.

ENDFORM.                    "f_set_pf_status
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
 RS_SELFIELD TYPE SLIS_SELFIELD.
  PERFORM F_CHECK_CHANGE_DATA.
  CASE R_UCOMM.
    WHEN 'ZCHANGE'.
*      PERFORM frm_save_zchange. "保存资产更改数据
    WHEN '&IC1'."双击事件
      READ TABLE GT_OUTPUT INTO GS_OUTPUT INDEX RS_SELFIELD-TABINDEX.
      IF SY-SUBRC EQ 0.
*        BREAK it0003.
        IF GS_OUTPUT-STRUCTURE IS INITIAL.
          MESSAGE '请选择结构名' TYPE 'S' DISPLAY LIKE 'E'.
        ENDIF.

        IF NOT GS_OUTPUT-STRUCTURE IS INITIAL.
          IF RS_SELFIELD-FIELDNAME+0(7) EQ 'JSONSTR'.
            PERFORM FRM_GET_LVCS USING 'STRUCTURE'.
            PERFORM FRM_CHANGE_JSON USING RS_SELFIELD-FIELDNAME.
            PERFORM FRM_DISPLAY_ALV2.
          ENDIF.
          IF NOT GS_OUTPUT-STRUCTURE2 IS INITIAL.
            MESSAGE 'STRUCTURE和STRUCTURE2只能单独指定,STRUCTURE指定表,STRUCTURE2指定对象' TYPE 'S' DISPLAY LIKE 'W'.
          ENDIF.
        ELSE.
          IF NOT GS_OUTPUT-STRUCTURE2 IS INITIAL.
            IF RS_SELFIELD-FIELDNAME+0(7) EQ 'JSONSTR'.
              PERFORM FRM_GET_LVCS2 USING 'STRUCTURE2'.
              PERFORM FRM_CHANGE_JSON2 USING RS_SELFIELD-FIELDNAME.
              PERFORM FRM_DISPLAY_ALV3.
            ENDIF.
          ENDIF.
        ENDIF.



      ENDIF.
    WHEN 'ZDEBUG'."接口调试
*      DATA: lt_plm007 LIKE TABLE OF zrfcs_plm007.
*      DATA: lt_zficos007  LIKE TABLE OF zficos007,
*            lt_zficos007b LIKE TABLE OF zficos007.
*      DATA: lt_zmms066 LIKE TABLE OF zmms066.
      DATA: IS_HEAD TYPE ZWMS001_HEAD,
            EV_TYPE TYPE BAPI_MTYPE,
            EV_MESSAGE TYPE BAPI_MSG,
            EV_MBLNR TYPE MSEG-MBLNR,
            EV_MJAHR TYPE MSEG-MJAHR,
            IT_ITEM  TYPE TABLE OF ZWMS001_ITEM,
            LS_ITEM  TYPE ZWMS001_ITEM.
      READ TABLE S_FNAME INDEX 1.
      IF SY-SUBRC EQ 0.
        IF SY-UNAME EQ 'MISHM'.
          CASE S_FNAME-LOW.
            WHEN 'ZRFC_WMS001'.
              IF <DYN_TABLE>[] IS NOT INITIAL.
                BREAK-POINT.
                LOOP AT <DYN_TABLE> ASSIGNING <DYN_WA>.
                  MOVE-CORRESPONDING <DYN_WA> TO LS_ITEM.
                  APPEND LS_ITEM TO IT_ITEM[].
                  CLEAR LS_ITEM.
                ENDLOOP.
                IF <DYN_WA2> IS ASSIGNED.
                  MOVE-CORRESPONDING <DYN_WA2> TO IS_HEAD.
                ENDIF.

*                MOVE-CORRESPONDING <DYN_TABLE>[] TO IT_ITEM[].
*                CALL FUNCTION 'Z_RFC_PLM_007'
*                  EXPORTING
*                    p_mode    = 'N'
*                    p_system  = 'SAP'
*                    p_uname   = sy-uname
**                   P_NAME1   =
*                  TABLES
*                    it_plm007 = lt_plm007..
                CALL FUNCTION 'ZRFC_WMS001'
                  EXPORTING
                    IS_HEAD    = IS_HEAD
                    P_SYSTEM   = 'SAP'
                  IMPORTING
                    EV_MESSAGE = EV_MESSAGE
                    EV_TYPE    = EV_TYPE
                    EV_MBLNR   = EV_MBLNR
                    EV_MJAHR   = EV_MJAHR
                  TABLES
                    IT_ITEM    = IT_ITEM.

              ENDIF.

            WHEN OTHERS.
          ENDCASE.
        ENDIF.
      ENDIF.
  ENDCASE.
  PERFORM F_REFRESH_ALV.
ENDFORM.                    "f_user_command
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_CHECK_CHANGE_DATA.
  DATA: LO_GRID TYPE REF TO CL_GUI_ALV_GRID.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LO_GRID.
  LO_GRID->CHECK_CHANGED_DATA( ).
ENDFORM.                    "f_check_change_data
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_REFRESH_ALV.
  DATA: LO_GRID      TYPE REF TO CL_GUI_ALV_GRID,
        LS_IS_STABLE TYPE LVC_S_STBL.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LO_GRID.
  LS_IS_STABLE-COL = 'X'.
  LS_IS_STABLE-ROW = 'X'.
  LO_GRID->REFRESH_TABLE_DISPLAY(
  EXPORTING
  IS_STABLE = LS_IS_STABLE
  EXCEPTIONS
  FINISHED = 1
  OTHERS = 2 ).
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.                    "f_refresh_alv
*&---------------------------------------------------------------------*
*&      Form  frm_get_sturct_f4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PC_FUNC    text
*      <--PC_STRUC   text
*----------------------------------------------------------------------*
FORM FRM_GET_STURCT_F4  USING    PC_FUNC TYPE FUPARAREF-FUNCNAME
                       CHANGING PC_STRUC TYPE FUPARAREF-STRUCTURE.

  DATA:LT_RET_TAB TYPE TABLE OF DDSHRETVAL WITH HEADER LINE.

  DATA: LT_FUPARAREF LIKE TABLE OF FUPARAREF.
  LT_FUPARAREF[] = GT_FUPARAREF[].
  DELETE LT_FUPARAREF[] WHERE FUNCNAME NE PC_FUNC.
*  BREAK it0003.


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'STRUCTURE'
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = LT_FUPARAREF
      RETURN_TAB      = LT_RET_TAB
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
  IF SY-SUBRC = 0.
    READ TABLE LT_RET_TAB INDEX 1.
    IF SY-SUBRC = 0  AND LT_RET_TAB-FIELDVAL IS NOT INITIAL.
      PC_STRUC = LT_RET_TAB-FIELDVAL.
    ENDIF.
  ENDIF.

ENDFORM.                    " FRM_GET_ARKTX_F4

*&---------------------------------------------------------------------*
*&      Form  caller_exit
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LS_DATA    text
*----------------------------------------------------------------------*
FORM CALLER_EXIT USING LS_DATA TYPE SLIS_DATA_CALLER_EXIT.
*  BREAK it0003.
*  DATA: call_f4 TYPE REF TO lcl_event_receiver.
*  CREATE OBJECT call_f4.
*  CALL METHOD call_f4->HANDLE_F4_HELP.
  DATA: L_REF_ALV TYPE REF TO CL_GUI_ALV_GRID.
  DATA: LT_WA_F4 TYPE LVC_S_F4,
        LT_F4    TYPE LVC_T_F4.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = L_REF_ALV.
  SET HANDLER LCL_EVENT_RECEIVER=>ON_F4 FOR L_REF_ALV.
  SET HANDLER LCL_EVENT_RECEIVER=>ON_DATA_CHANGED FOR L_REF_ALV.
  LT_WA_F4-FIELDNAME  = 'STRUCTURE'.
  LT_WA_F4-REGISTER   = 'X'.
  LT_WA_F4-GETBEFORE  = 'X'.
  LT_WA_F4-CHNGEAFTER = 'X'.
*  lt_wa_f4-internal   = 'X'.
  APPEND LT_WA_F4 TO LT_F4.

  " 添加 STRUCTURE2 的 F4 注册
  CLEAR LT_WA_F4.
  LT_WA_F4-FIELDNAME  = 'STRUCTURE2'.
  LT_WA_F4-REGISTER   = 'X'.
  LT_WA_F4-GETBEFORE  = 'X'.
  LT_WA_F4-CHNGEAFTER = 'X'.
  APPEND LT_WA_F4 TO LT_F4.

  CALL METHOD L_REF_ALV->REGISTER_F4_FOR_FIELDS
    EXPORTING
      IT_F4 = LT_F4.

*      CASE e_fieldname.
*      WHEN 'STRUCTURE'.
*        READ TABLE gt_output ASSIGNING FIELD-SYMBOL(<fs_alv>) INDEX es_row_no-row_id.
*        IF sy-subrc = 0.
*          PERFORM frm_get_sturct_f4 USING <fs_alv>-funcname CHANGING <fs_alv>-structure.
*          LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<ls_output>) WHERE funcname EQ <fs_alv>-funcname.
*            <ls_output>-structure = <fs_alv>-structure.
*          ENDLOOP.
*        ENDIF.
*
* WHEN .
*      WHEN OTHERS.
*    ENDCASE.
ENDFORM.                    "caller_exit
*&---------------------------------------------------------------------*
*& Form FRM_GET_LVCS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_RS_SELFIELD_FIELDNAME  text
*&---------------------------------------------------------------------*
FORM FRM_GET_LVCS USING LV_STRUCTURE.
  FIELD-SYMBOLS :<FS_FILED> TYPE ANY.
  ASSIGN COMPONENT LV_STRUCTURE OF STRUCTURE GS_OUTPUT TO <FS_FILED>.
  CLEAR: LT_TABLE[].
  DATA: LV_TABNAME TYPE DNTAB-TABNAME.
  LV_TABNAME = <FS_FILED>.
*取出表结构的字段目录
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      LANGU          = SY-LANGU
      TABNAME        = LV_TABNAME
    TABLES
      NAMETAB        = LT_TABLE
    EXCEPTIONS
      NO_TEXTS_FOUND = 1.
*根据取出的字段目录生成参考字段目录

  CLEAR LT_ALV_CAT.
  LOOP AT LT_TABLE INTO LS_TABLE.
*    IF LS_TABLE-FIELDNAME NE 'MANDT'.
    LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME.
    LS_ALV_CAT-REF_TABLE = <FS_FILED>.
    LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME.
    IF LS_TABLE-FIELDNAME EQ 'MEINS'.
      LS_ALV_CAT-NO_CONVEXT = 'X'.
*      CLEAR: ls_alv_cat-ref_field,ls_alv_cat-ref_table.
    ENDIF.
    LS_ALV_CAT-SELTEXT   = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_L = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_M = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_S = LS_TABLE-FIELDTEXT.
    APPEND LS_ALV_CAT TO LT_ALV_CAT.
*    ENDIF.
    CLEAR LS_ALV_CAT.
  ENDLOOP.

*内表创建

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = LT_ALV_CAT
    IMPORTING
      EP_TABLE        = D_REF.


*指定生成的内表到字段符号
  ASSIGN D_REF->* TO <DYN_TABLE>.

*创建动态工作区结构
  CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>.

*创建动态工作区
  ASSIGN DYN_WA->* TO <DYN_WA>.

* zcolor
*  DELETE lt_alv_cat[] WHERE fieldname EQ 'MANDT'.
*  ls_alv_cat-fieldname = 'ZCOLOR'.
**  ls_alv_cat-ref_table = 'ZFICOS025'.
**  ls_alv_cat-ref_field = 'ZCOLOR'.
*  ls_alv_cat-seltext   = '更新结果'.
*  ls_alv_cat-scrtext_l = '更新结果'.
*  ls_alv_cat-scrtext_m = '更新结果'.
*  ls_alv_cat-scrtext_s = '更新结果'.
*  APPEND ls_alv_cat TO lt_alv_cat.
*  ls_alv_cat-fieldname = 'MESSAGE'.
**  ls_alv_cat-ref_table = 'ZFICOS025'.
**  ls_alv_cat-ref_field = 'MESSAGE'.
*  ls_alv_cat-seltext   = '更新信息'.
*  ls_alv_cat-scrtext_l = '更新信息'.
*  ls_alv_cat-scrtext_m = '更新信息'.
*  ls_alv_cat-scrtext_s = '更新信息'.
*  APPEND ls_alv_cat TO lt_alv_cat.
*  BREAK it0003.
ENDFORM.                    "frm_get_lvcs

*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_JSON
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHANGE_JSON USING    P_RS_SELFIELD_FIELDNAME.
  DATA : JSON_SER TYPE REF TO CL_TREX_JSON_SERIALIZER.
*         JSON_DES TYPE REF TO CL_TREX_JSON_DESERIALIZER.
  FIELD-SYMBOLS :<FS_FILED> TYPE ANY.
  ASSIGN COMPONENT P_RS_SELFIELD_FIELDNAME OF STRUCTURE GS_OUTPUT TO <FS_FILED>.
  DATA: LV_JSON TYPE STRING.
  LV_JSON = <FS_FILED>.

*  FIELD-SYMBOLS :<fs_filed2> TYPE any.
*  ASSIGN COMPONENT 'STRUCTURE' OF STRUCTURE gs_output TO <fs_filed2>.
*  DATA: lv_tabname TYPE tabname.
*  lv_tabname = <fs_filed2>.


*  DATA: LS_ZBPMS011 LIKE ZBPMS011.
  DATA : JSONSTR TYPE STRING.
*  CREATE OBJECT JSON_DES.
  IF LV_JSON+0(1) EQ '['. "表结构
*    CALL METHOD JSON_DES->DESERIALIZE
*      EXPORTING
*        JSON = LV_JSON
*      IMPORTING
*        ABAP = <DYN_TABLE>. "<dyn_table>.
    CALL METHOD CL_FDT_JSON=>JSON_TO_DATA
      EXPORTING
        IV_JSON = LV_JSON
      CHANGING
        CA_DATA = <DYN_TABLE>.
  ELSE.
    CALL METHOD CL_FDT_JSON=>JSON_TO_DATA
      EXPORTING
        IV_JSON = LV_JSON
      CHANGING
        CA_DATA = <DYN_WA>.
*    CALL METHOD JSON_DES->DESERIALIZE
*      EXPORTING
*        JSON = LV_JSON
*      IMPORTING
*        ABAP = <DYN_WA>. "<dyn_table>.
    APPEND <DYN_WA> TO <DYN_TABLE>.
  ENDIF.

*  BREAK it0003.
ENDFORM.                    "frm_change_json
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV2 .
  PERFORM F_SET_LAYOUT2.
*  PERFORM F_SET_FIELDCAT.
*  PERFORM f_set_event.
  PERFORM F_ALV_DISPLAY TABLES <DYN_TABLE>.
ENDFORM.                    "frm_display_alv2
*&---------------------------------------------------------------------*
*& Form F_SET_LAYOUT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_SET_LAYOUT2 .
  CLEAR: GS_LAYOUT.
*  gs_layout-box_fname = 'SLBOX'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
*  gs_layout-ctab_fname = 'CELLCOLOR'.
ENDFORM.                    "f_set_layout2
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_LVCS2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0434   text
*----------------------------------------------------------------------*
FORM FRM_GET_LVCS2 USING LV_STRUCTURE.
  FIELD-SYMBOLS :<FS_FILED> TYPE ANY.
  ASSIGN COMPONENT LV_STRUCTURE OF STRUCTURE GS_OUTPUT TO <FS_FILED>.
  CLEAR: LT_TABLE[].
  DATA: LV_TABNAME TYPE DNTAB-TABNAME.
  LV_TABNAME = <FS_FILED>.
*取出表结构的字段目录
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      LANGU          = SY-LANGU
      TABNAME        = LV_TABNAME
    TABLES
      NAMETAB        = LT_TABLE
    EXCEPTIONS
      NO_TEXTS_FOUND = 1.
*根据取出的字段目录生成参考字段目录

  CLEAR LT_ALV_CAT.
  LOOP AT LT_TABLE INTO LS_TABLE.
*    IF LS_TABLE-FIELDNAME NE 'MANDT'.
    LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME.
    LS_ALV_CAT-REF_TABLE = <FS_FILED>.
    LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME.
    IF LS_TABLE-FIELDNAME EQ 'MEINS'.
      LS_ALV_CAT-NO_CONVEXT = 'X'.
*      CLEAR: ls_alv_cat-ref_field,ls_alv_cat-ref_table.
    ENDIF.
    LS_ALV_CAT-SELTEXT   = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_L = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_M = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_S = LS_TABLE-FIELDTEXT.
    APPEND LS_ALV_CAT TO LT_ALV_CAT.
*    ENDIF.
    CLEAR LS_ALV_CAT.
  ENDLOOP.

*内表创建

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = LT_ALV_CAT
    IMPORTING
      EP_TABLE        = D_REF2.


*指定生成的内表到字段符号
  ASSIGN D_REF2->* TO <DYN_TABLE2>.

*创建动态工作区结构
  CREATE DATA DYN_WA2 LIKE LINE OF <DYN_TABLE2>.

*创建动态工作区
  ASSIGN DYN_WA2->* TO <DYN_WA2>.

* zcolor
*  DELETE lt_alv_cat[] WHERE fieldname EQ 'MANDT'.
*  ls_alv_cat-fieldname = 'ZCOLOR'.
**  ls_alv_cat-ref_table = 'ZFICOS025'.
**  ls_alv_cat-ref_field = 'ZCOLOR'.
*  ls_alv_cat-seltext   = '更新结果'.
*  ls_alv_cat-scrtext_l = '更新结果'.
*  ls_alv_cat-scrtext_m = '更新结果'.
*  ls_alv_cat-scrtext_s = '更新结果'.
*  APPEND ls_alv_cat TO lt_alv_cat.
*  ls_alv_cat-fieldname = 'MESSAGE'.
**  ls_alv_cat-ref_table = 'ZFICOS025'.
**  ls_alv_cat-ref_field = 'MESSAGE'.
*  ls_alv_cat-seltext   = '更新信息'.
*  ls_alv_cat-scrtext_l = '更新信息'.
*  ls_alv_cat-scrtext_m = '更新信息'.
*  ls_alv_cat-scrtext_s = '更新信息'.
*  APPEND ls_alv_cat TO lt_alv_cat.
*  BREAK it0003.
ENDFORM.                    "frm_get_lvcs
*&---------------------------------------------------------------------*
*&      Form  FRM_CHANGE_JSON2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_RS_SELFIELD_FIELDNAME  text
*----------------------------------------------------------------------*
FORM FRM_CHANGE_JSON2 USING    P_RS_SELFIELD_FIELDNAME.
  DATA : JSON_SER TYPE REF TO CL_TREX_JSON_SERIALIZER.
*         JSON_DES TYPE REF TO CL_TREX_JSON_DESERIALIZER.
  FIELD-SYMBOLS :<FS_FILED> TYPE ANY.
  ASSIGN COMPONENT P_RS_SELFIELD_FIELDNAME OF STRUCTURE GS_OUTPUT TO <FS_FILED>.
  DATA: LV_JSON TYPE STRING.
  LV_JSON = <FS_FILED>.

*  FIELD-SYMBOLS :<fs_filed2> TYPE any.
*  ASSIGN COMPONENT 'STRUCTURE' OF STRUCTURE gs_output TO <fs_filed2>.
*  DATA: lv_tabname TYPE tabname.
*  lv_tabname = <fs_filed2>.


*  DATA: LS_ZBPMS011 LIKE ZBPMS011.
  DATA : JSONSTR TYPE STRING.
*  CREATE OBJECT JSON_DES.
  IF LV_JSON+0(1) EQ '['. "表结构
*    CALL METHOD JSON_DES->DESERIALIZE
*      EXPORTING
*        JSON = LV_JSON
*      IMPORTING
*        ABAP = <DYN_TABLE>. "<dyn_table>.
    CALL METHOD CL_FDT_JSON=>JSON_TO_DATA
      EXPORTING
        IV_JSON = LV_JSON
      CHANGING
        CA_DATA = <DYN_TABLE2>.
  ELSE.
    CALL METHOD CL_FDT_JSON=>JSON_TO_DATA
      EXPORTING
        IV_JSON = LV_JSON
      CHANGING
        CA_DATA = <DYN_WA2>.
*    CALL METHOD JSON_DES->DESERIALIZE
*      EXPORTING
*        JSON = LV_JSON
*      IMPORTING
*        ABAP = <DYN_WA>. "<dyn_table>.
    APPEND <DYN_WA2> TO <DYN_TABLE2>.
  ENDIF.

*  BREAK it0003.
ENDFORM.                    "frm_change_json
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV3
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV3 .
  PERFORM F_SET_LAYOUT2.
*  PERFORM F_SET_FIELDCAT.
*  PERFORM f_set_event.
  PERFORM F_ALV_DISPLAY TABLES <DYN_TABLE2>.
ENDFORM.                    " FRM_DISPLAY_ALV3
View Code

 

 后记:

ECC版本没有JSON转内表的类,可以使用以下方法转换:

CALL METHOD cl_fdt_json=>data_to_json
  EXPORTING
    ia_data = ls_code
  RECEIVING
    rv_json = lv_json.

CALL METHOD cl_fdt_json=>json_to_data
  EXPORTING
    iv_json = lv_json
  changing
    ca_data = ls_code .

时间2026.06.24 更新了字段,可指定对象(结构),调试接口更方便

posted @ 2021-07-12 11:03  蛀牙首领  阅读(5035)  评论(0)    收藏  举报