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:tftit.

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,
         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.
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.

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

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.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data2 .
  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.
  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.
*&---------------------------------------------------------------------*
*& 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.
FORM f_set_event.
  gs_events-name = 'CALLER_EXIT'.
  gs_events-form = 'CALLER_EXIT'.
  APPEND gs_events TO gt_events[].
ENDFORM.
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.
*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.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM f_set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STD'.
ENDFORM.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
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.
        CHECK NOT gs_output-structure IS INITIAL.

        IF rs_selfield-fieldname+0(7) EQ 'JSONSTR'.
          PERFORM frm_get_lvcs.
          PERFORM frm_change_json USING rs_selfield-fieldname.
          PERFORM frm_display_alv2.
        ENDIF.



      ENDIF.
  ENDCASE.
  PERFORM f_refresh_alv.
ENDFORM.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
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.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
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.
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 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.


  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.
*&---------------------------------------------------------------------*
*& Form FRM_GET_LVCS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_RS_SELFIELD_FIELDNAME  text
*&---------------------------------------------------------------------*
FORM frm_get_lvcs.
  FIELD-SYMBOLS :<fs_filed> TYPE any.
  ASSIGN COMPONENT '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.

*&---------------------------------------------------------------------*
*& 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>.
  ELSE.
    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.
*&---------------------------------------------------------------------*
*& 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.
*&---------------------------------------------------------------------*
*& 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.
View Code
原文地址:https://www.cnblogs.com/chaguoguo/p/15001168.html