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.
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.
包含文件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
包含文件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.
包含文件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
后记:
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 更新了字段,可指定对象(结构),调试接口更方便

浙公网安备 33010602011771号