SAP RFC接口自定义监控应用

应用场景:SAP后端RFC接口有很多跟JAVA及前端交互调用的场景。做成可配置的通用接口。

服务定义:

通过通用的WEBSERVICE服务发布出去

定义接口配置,接口参数通用DDIC对象

通用接口监控表-抬头

接口接口监控调用参数表

与前端通用接口交互函数

FUNCTION zhrfm_if_com.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_IFNUM) TYPE  ZHRIFNUM
*"     VALUE(IT_INPUT) TYPE  ZTHR_PARAM
*"  EXPORTING
*"     VALUE(ET_OUTPUT) TYPE  ZTHR_PARAM
*"     VALUE(ES_MESSAGE) TYPE  ZSHR_MESSAGE
*"----------------------------------------------------------------------

  FIELD-SYMBOLS:
    <fs_json>      TYPE any,
    <fs_abap>      TYPE any,
    <fs_json_t>    TYPE table,
    <fs_abap_t>    TYPE table,
    <fs_abap_line> TYPE any,
    <fs_param>     TYPE any,
    <fs_value>     TYPE any.
  DATA:
    lt_param_info  TYPE STANDARD TABLE OF zshr_fuc_params,
    ls_param_info  TYPE zshr_fuc_params,
    lt_param       TYPE STANDARD TABLE OF zshr_fuc_params,
    ls_param       TYPE zshr_fuc_params,
    ls_input       TYPE zshr_param,
    ls_output      TYPE zshr_param,
    lt_param_log   TYPE STANDARD TABLE OF zshr_params,
    ls_param_log   TYPE zshr_params,
    ls_zthr0003    TYPE zthr0003,
    lt_ptab        TYPE abap_func_parmbind_tab,
    ls_ptab        TYPE abap_func_parmbind,
    lt_etab        TYPE abap_func_excpbind_tab,
    ls_etab        TYPE abap_func_excpbind,
    lv_func        TYPE rs38l_fnam,
    lv_str         TYPE string,
    lv_typename    TYPE dd40l-typename,
    lv_is_tabl     TYPE flag,
    ls_message     TYPE zshr_message,
    ls_zthr0001    TYPE zthr0001,
    lv_line_type   TYPE REF TO cl_abap_structdescr,
    lv_table_type  TYPE REF TO cl_abap_tabledescr,
    fs_struct      TYPE REF TO data,
    fs_table       TYPE REF TO data,
    lv_index       TYPE i,
    lv_breakpoint  TYPE c,
    lv_debug_user  TYPE string,
    lv_debug_pernr TYPE string,
    ls_debug       TYPE zshr_param,
    ls_zthr9002    TYPE zthr9002,
    ls_zthr9003    TYPE zthr9003,
    ls_zthr9004    TYPE zthr9004,
    ls_zthr9007    TYPE zthr9007,
    lt_zthr9003    TYPE TABLE OF zthr9003,
    lt_zthr9004    TYPE TABLE OF zthr9004,
*    lt_zthr9007    TYPE TABLE OF zthr9007,
    lt_pernr       TYPE STANDARD TABLE OF string.

*  DATA lv_time1 TYPE i.
*  DATA lv_time2 TYPE i.
*  GET RUN TIME FIELD lv_time1 .


  " 下架 部分接口  20210412
  IF iv_ifnum = 'L0067'  OR iv_ifnum = 'L0231'
    OR iv_ifnum = 'L0037'  OR iv_ifnum = 'L0235' OR iv_ifnum = 'L0242'
     OR iv_ifnum = 'L0217'  OR iv_ifnum = 'L0243'.  "add L0243    L0243 存在高并发情况

    RETURN.
  ENDIF.

*通过接口编号获取接口的名称
  CLEAR ls_zthr0001.

  SELECT SINGLE * INTO ls_zthr0001 FROM zthr0001
     WHERE ifnum = iv_ifnum.
  lv_func = ls_zthr0001-ifnam.
  IF lv_func IS INITIAL.
    es_message-msgty = 'E'.
    MESSAGE e002(zmsg_hr) INTO es_message-msgtx.
    RETURN.
  ENDIF.

*CALL FUNCTION 'TH_USER_INFO'
*  以下代码用于生产系统代码调试 --- 调试完成后请 关闭配置表   zthr9002  --begin 20180503 add pengjc
  REFRESH: lt_zthr9003,lt_zthr9004.

  SELECT SINGLE * INTO  ls_zthr9002 FROM zthr9002.

  IF ls_zthr9002-debugmode = 'X'.
*********************add by c-yangy31 07.01.2020 17:44:31 begin*******
    "增加510校验
    DATA: lv_user TYPE persno.
    IF sy-mandt EQ '510'.
      READ TABLE it_input INTO ls_debug
                     WITH KEY pname = 'IV_USER'.
      IF sy-subrc EQ 0.
        lv_debug_user = ls_debug-value.
        CLEAR lv_user.
        SELECT SINGLE pernr
          INTO lv_user
          FROM zthr_auth_510
          WHERE pernr EQ lv_debug_user
           AND active EQ 'X'.
        IF lv_user IS INITIAL.
          es_message-msgty = 'E'.
          es_message-msgtx = '无510登录权限'.
          RETURN.
        ENDIF.
      ENDIF.
    ENDIF.
*********************add end *****************************************
    LOOP AT it_input INTO ls_debug.

      IF ls_debug-pname = 'IV_USER'.
        lv_debug_user = ls_debug-value.

      ELSEIF ls_debug-pname = 'IV_PERNR'.
        lv_debug_pernr = ls_debug-value.

      ELSEIF ls_debug-pname = 'IT_PERNR'. " Change by CAIXJ on 20190110

        IF iv_ifnum = '21006'.
*          lv_debug_pernr = ls_debug-value.
          CALL FUNCTION 'ZHRFM_JSON_TO_ABAP'
            EXPORTING
              iv_json = ls_debug-value
            IMPORTING
              ev_data = lt_pernr.

          READ TABLE lt_pernr INTO lv_debug_pernr INDEX 1.
        ENDIF.

      ENDIF.

    ENDLOOP.

    PERFORM frm_active_debug USING lv_debug_user lv_debug_pernr iv_ifnum CHANGING lv_breakpoint.

    IF ls_zthr0001-if_montior = 'X'.

      CALL FUNCTION 'GUID_CREATE'
        IMPORTING
          ev_guid_32 = ls_zthr9003-zid.

      ls_zthr9003-ifnum = iv_ifnum.
      ls_zthr9003-suser = lv_debug_user.
      ls_zthr9003-zdate = sy-datum.
      ls_zthr9003-ztime = sy-uzeit.

      GET TIME STAMP FIELD ls_zthr9003-timestamp_beg.
      MOVE-CORRESPONDING ls_zthr9003 TO ls_zthr9004.

      LOOP AT it_input INTO ls_debug.
        ls_zthr9004-pname = ls_debug-pname.
        ls_zthr9004-value = ls_debug-value.
        ls_zthr9004-value2 = ls_debug-value.
        APPEND ls_zthr9004 TO lt_zthr9004.
      ENDLOOP.

*      APPEND ls_zthr9003  TO lt_zthr9003.
      MODIFY zthr9003 FROM ls_zthr9003.
*      INSERT zthr9003 FROM TABLE lt_zthr9003 ACCEPTING DUPLICATE KEYS.
      IF sy-subrc = 0.
        INSERT zthr9004 FROM TABLE lt_zthr9004 ACCEPTING DUPLICATE KEYS.
        COMMIT WORK AND WAIT.
      ENDIF.

    ENDIF.

  ENDIF.

  IF lv_breakpoint = 'X'.
*   set break point
    MESSAGE 'system debug model open !' TYPE 'S' DISPLAY LIKE 'W'.
  ENDIF.
*  调试完成后请 关闭配置表   zthr9002  --end 20180503 add pengjc


*  IF iv_ifnum = '20012'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '50008'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '00012'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '60020'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '40013'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '40001'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '21007'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '20001'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '21000'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '20005'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '21000'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '20010'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '30000'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '30001'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '30003'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '30017'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '30016'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '31003'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '31000'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '30002'.
*  ELSEIF iv_ifnum = '32001'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '81012'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '50019'.
*    lv_breakpoint = 'X'.
*  ELSEIF iv_ifnum = '20005'.
*    lv_breakpoint = 'X'.
*  ENDIF.

  CLEAR lt_param_log.
*保存输入参数接口日志
  IF ls_zthr0001-iflog = 'X'.

    LOOP AT it_input INTO ls_input.
      MOVE-CORRESPONDING ls_input TO ls_param_log.
      ls_param_log-pkind = 'I'.
      APPEND ls_param_log TO lt_param_log.
    ENDLOOP.
  ENDIF.

*获取接口的参数
  CALL FUNCTION 'ZHRFM_GET_FUNC_INFO'
    EXPORTING
      iv_ifnum      = iv_ifnum
      iv_ifnam      = ls_zthr0001-ifnam
    IMPORTING
      es_message    = ls_message
    TABLES
      et_param_info = lt_param_info.
  IF ls_message-msgty = 'E'.
    RETURN.
  ENDIF.

  CLEAR lt_param.
  LOOP AT lt_param_info INTO ls_param_info.

    ls_param-pkind = ls_param_info-pkind.
    ls_param-param = ls_param_info-param.
    ls_param-ztabl = ls_param_info-ztabl.
    ls_param-optio = ls_param_info-optio.
    ls_param-struc = ls_param_info-struc.
    ls_param-rfied = ls_param_info-rfied.
    COLLECT ls_param INTO lt_param.
    CLEAR ls_param.

  ENDLOOP.


  REFRESH: lt_ptab,lt_etab.

  LOOP AT lt_param INTO ls_param WHERE pkind  NE 'X'.

    CLEAR lv_str.
    IF ls_param-rfied IS NOT INITIAL.
      lv_str = ls_param-struc && '-' && ls_param-rfied.
    ELSE.
      lv_str = ls_param-struc.
    ENDIF.

    CLEAR   lv_index.
    LOOP AT lt_param_info INTO ls_param_info
                                WHERE param = ls_param-param.
      lv_index = lv_index + 1.
    ENDLOOP.

*读取参数的值,如果为输入参数且没有值就不作为函数的入参
    CLEAR ls_input.
    READ TABLE it_input INTO ls_input WITH KEY pname = ls_param-param.
    IF sy-subrc NE 0 AND ls_param-pkind = 'I' AND ls_param-optio = 'X'.
      CONTINUE.
    ENDIF.

*判断登录人员是否合法
    IF ls_param-param = 'IV_USER' AND iv_ifnum = '00012'.
      IF ls_input-value IS NOT INITIAL.
        IF NOT ( ls_input-value GT '0' AND ls_input-value < '99999999' ).
          ls_message-msgty = 'E'.
          ls_message-msgtx = '登录人员编号不正确!'.
          RETURN.
        ENDIF.
      ENDIF.
    ENDIF.


*判断参考的是否为表类型
    CLEAR:lv_is_tabl, lv_typename.
    SELECT SINGLE typename INTO lv_typename FROM dd40l
        WHERE typename = lv_str.
    IF sy-subrc EQ 0.
      lv_is_tabl = 'X'.
    ENDIF.

    IF ls_param-pkind = 'T' OR ls_param-ztabl = 'X'."*表参数

      IF lv_is_tabl = 'X'.
        CREATE DATA  fs_table TYPE (lv_str).
      ELSE.
        CREATE DATA  fs_table TYPE STANDARD TABLE OF (lv_str).
      ENDIF.
      ASSIGN fs_table->*  TO <fs_abap_t>.
      CLEAR <fs_abap_t>.
      IF lv_str NE 'ZSHR_PARAM' AND lv_str NE 'ZTHR_PARAM'.
        CALL FUNCTION 'ZHRFM_JSON_TO_ABAP'
          EXPORTING
            iv_json    = ls_input-value
          IMPORTING
            ev_data    = <fs_abap_t>
            es_message = es_message.
        IF es_message-msgty = 'E'.
          RETURN.
        ENDIF.
      ELSE.
        CREATE DATA fs_struct LIKE LINE OF <fs_abap_t>.
        ASSIGN  fs_struct->*  TO <fs_abap>.
        ASSIGN COMPONENT 'VALUE' OF STRUCTURE <fs_abap> TO <fs_value>.
        <fs_value> = ls_input-value.
        ASSIGN COMPONENT 'PNAME' OF STRUCTURE <fs_abap> TO <fs_value>.
        <fs_value> = ls_input-pname.
        IF <fs_abap> IS NOT INITIAL.
          APPEND <fs_abap> TO <fs_abap_t>.
        ENDIF.

      ENDIF.


    ELSE."非表类型参数

      CREATE DATA fs_struct TYPE (lv_str).
      ASSIGN fs_struct->* TO <fs_abap>.
      IF lv_index > 1.
        IF lv_str NE 'ZSHR_PARAM'.
          CALL FUNCTION 'ZHRFM_JSON_TO_ABAP'
            EXPORTING
              iv_json    = ls_input-value
            IMPORTING
              ev_data    = <fs_abap>
              es_message = es_message.
          IF es_message-msgty = 'E'.
            ls_zthr0003-msgty = es_message-msgty.
            RETURN.
          ENDIF.
        ELSE.
          ASSIGN COMPONENT 'VALUE' OF STRUCTURE <fs_abap> TO <fs_value>.
          <fs_value> = ls_input-value.
          ASSIGN COMPONENT 'PNAME' OF STRUCTURE <fs_abap> TO <fs_value>.
          <fs_value> = ls_input-pname.
        ENDIF.
      ELSE.
        <fs_abap> = ls_input-value.
      ENDIF.


    ENDIF.


    CASE ls_param-pkind.
      WHEN 'I'."输入参数
        ls_ptab-name = ls_param-param.
        ls_ptab-kind = abap_func_exporting.
        IF ls_param-ztabl = 'X'.
          GET REFERENCE OF  <fs_abap_t> INTO ls_ptab-value.
        ELSE.
          GET REFERENCE OF <fs_abap>    INTO ls_ptab-value.
        ENDIF.
        INSERT ls_ptab INTO TABLE lt_ptab.
      WHEN 'E'."输出参数
        ls_ptab-name = ls_param-param.
        ls_ptab-kind = abap_func_importing.

        IF ls_param-ztabl = 'X'.
          GET REFERENCE OF  <fs_abap_t> INTO ls_ptab-value.
        ELSE.
          GET REFERENCE OF <fs_abap>    INTO ls_ptab-value.
        ENDIF.

        INSERT ls_ptab INTO TABLE lt_ptab.
      WHEN 'C'.
        ls_ptab-name = ls_param-param.
        ls_ptab-kind = abap_func_changing.
        IF ls_param-ztabl = 'X'.
          GET REFERENCE OF  <fs_abap_t> INTO ls_ptab-value.
        ELSE.
          GET REFERENCE OF <fs_abap>    INTO ls_ptab-value.
        ENDIF.

        INSERT ls_ptab INTO TABLE lt_ptab.
      WHEN 'T'.
        ls_ptab-name = ls_param-param.
        ls_ptab-kind = abap_func_tables.
        GET REFERENCE OF  <fs_abap_t> INTO ls_ptab-value.
        INSERT ls_ptab INTO TABLE lt_ptab.

      WHEN 'X'.
        ls_etab-name = ls_param-param.
        ls_etab-value = 10.
        INSERT ls_etab INTO TABLE lt_etab.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

*动态调用函数
  CALL FUNCTION lv_func PARAMETER-TABLE lt_ptab EXCEPTION-TABLE lt_etab.


*获取输出参数的值
  LOOP AT lt_ptab INTO ls_ptab WHERE kind = abap_func_importing OR
                                     kind = abap_func_tables OR
                                     kind =  abap_func_changing.

    CLEAR: ls_output.
    ls_output-pname = ls_ptab-name.
    IF ls_output-pname = 'ES_MESSAGE' OR ls_output-pname = 'ES_MSG'.
      ASSIGN ls_ptab-value->* TO <fs_abap>.
      ASSIGN COMPONENT 'MSGTY' OF STRUCTURE <fs_abap> TO <fs_value>.
      es_message-msgty = <fs_value>.
      ASSIGN COMPONENT 'MSGTX' OF STRUCTURE <fs_abap> TO <fs_value>.
      es_message-msgtx = <fs_value>.
    ENDIF.
    CLEAR ls_param.
    READ TABLE lt_param INTO ls_param WITH KEY param = ls_output-pname.
    IF ls_param-struc = 'ZSHR_PARAM'."用于处理JSON中包涵JSON的特殊处理.
      ASSIGN ls_ptab-value->* TO <fs_abap>.
      ASSIGN COMPONENT 'VALUE' OF STRUCTURE <fs_abap> TO <fs_value>.
      ls_output-value = <fs_value>.
      ASSIGN COMPONENT 'PNAME' OF STRUCTURE <fs_abap> TO <fs_value>.
      ls_output-pname = <fs_value>.
    ELSEIF ls_param-struc = 'ZTHR_PARAM'."用于处理JSON中包涵JSON的特殊处理.
      ASSIGN ls_ptab-value->* TO <fs_abap_t>.
      LOOP AT <fs_abap_t> ASSIGNING <fs_abap_line>.
        ASSIGN COMPONENT 'VALUE' OF STRUCTURE
            <fs_abap_line> TO <fs_value>.
        ls_output-value = <fs_value>.
        ASSIGN COMPONENT 'PNAME' OF STRUCTURE
            <fs_abap_line> TO <fs_value>.
        ls_output-pname = <fs_value>.
        APPEND  ls_output TO et_output.
      ENDLOOP.
      CONTINUE.
    ELSE.
      IF ls_param-pkind = 'T' OR ls_param-ztabl = 'X'.

        ASSIGN ls_ptab-value->* TO <fs_abap_t>.
        CALL FUNCTION 'ZHRFM_ABAP_TO_JSON'
          EXPORTING
            iv_data = <fs_abap_t>
          IMPORTING
            ev_json = ls_output-value.
      ELSE.
        ASSIGN ls_ptab-value->* TO <fs_abap>.
        CALL FUNCTION 'ZHRFM_ABAP_TO_JSON'
          EXPORTING
            iv_data = <fs_abap>
          IMPORTING
            ev_json = ls_output-value.
      ENDIF.
    ENDIF.

    IF ls_output-value IS NOT INITIAL.
      APPEND ls_output TO et_output.
    ENDIF.
  ENDLOOP.

************************ADD BY CHUXL 20210526********************
*  IF ls_zthr0001-if_montior = 'X'.
*
*    CALL FUNCTION 'GUID_CREATE'
*      IMPORTING
*        ev_guid_32 = ls_zthr9003-zid.
*
*    ls_zthr9003-ifnum = iv_ifnum.
*    ls_zthr9003-suser = lv_debug_user.
*    ls_zthr9003-zdate = sy-datum.
*    ls_zthr9003-ztime = sy-uzeit.
*
*    GET TIME STAMP FIELD ls_zthr9003-timestamp_beg.
*
*    MOVE-CORRESPONDING ls_zthr9003 TO ls_zthr9007.
*
*    LOOP AT et_output INTO ls_output.
*      ls_zthr9007-pname = ls_output-pname.
*      ls_zthr9007-value = ls_output-value.
*      ls_zthr9007-value2 = ls_output-value.
*      APPEND ls_zthr9007 TO lt_zthr9007.
*    ENDLOOP.
*
*    MODIFY zthr9003 FROM ls_zthr9003.
*
*    IF sy-subrc = 0.
*      INSERT zthr9007 FROM TABLE lt_zthr9007 ACCEPTING DUPLICATE KEYS.
*    ENDIF.
*
*  ENDIF.
***********************END ADD***********************************
*  DATA lv_time TYPE i.
*   GET RUN TIME FIELD lv_time .
*
*   lv_time2 = lv_time - lv_time1.
  IF ls_zthr9002-debugmode = 'X' AND ls_zthr0001-if_montior = 'X'.
    GET TIME STAMP FIELD ls_zthr9003-timestamp_end.
*      GET TIME FIELD lv_time_end.
*    ls_zthr9003-ztime2 = ( ls_zthr9003-timestamp_end - ls_zthr9003-timestamp_beg ) * 1000.
    DATA:
      lv_times_beg(30),
      lv_times_end(30).

    lv_times_beg = ls_zthr9003-timestamp_beg.
    lv_times_end = ls_zthr9003-timestamp_end.
    CONDENSE lv_times_beg NO-GAPS.
    CONDENSE lv_times_end NO-GAPS.
    IF lv_times_end+0(8) = lv_times_beg+0(8).    " 不跨天
      IF lv_times_end+8(6) NE lv_times_beg+8(6). "  时间不到1S
        DATA lv_time_end TYPE t. " sy-uzeit.
        DATA lv_time_beg TYPE t . "sy-uzeit.
        lv_time_end = lv_times_end+8(6).
        lv_time_beg = lv_times_beg+8(6).
        ls_zthr9003-ztime2 = (  lv_time_end -  lv_time_beg ) * 1000 + lv_times_end+15(3) - lv_times_beg+15(3) .
      ELSE.
        ls_zthr9003-ztime2 = lv_times_end+15(3) -  lv_times_beg+15(3) .
      ENDIF.
    ENDIF.
*    APPEND ls_zthr9003  TO lt_zthr9003.
*    MODIFY TABLE lt_zthr9003  FROM ls_zthr9003 TRANSPORTING ztime2.

*    INSERT zthr9003 FROM TABLE lt_zthr9003 ACCEPTING DUPLICATE KEYS.
*    IF sy-subrc = 0.
*      INSERT zthr9004 FROM TABLE lt_zthr9004 ACCEPTING DUPLICATE KEYS.
*    ENDIF.

    MODIFY zthr9003 FROM ls_zthr9003.
    IF sy-subrc = 0.
      MODIFY zthr9004 FROM TABLE lt_zthr9004.
    ENDIF.
  ENDIF.

**保存输出参数接口日志
  IF ls_zthr0001-iflog = 'X'.
    LOOP AT et_output INTO ls_output.
      MOVE-CORRESPONDING ls_output TO ls_param_log.
      ls_param_log-pkind = 'O'.
      APPEND ls_param_log TO lt_param_log.
    ENDLOOP.
  ENDIF.

  IF ls_zthr0001-ifnum = 'R0001'.
    TYPES: BEGIN OF ty_in,
             pname TYPE zehrpname,
             value TYPE string,
           END OF ty_in.

    DATA: lt_log   TYPE TABLE OF zbasic_info_log,
          ls_log   TYPE          zbasic_info_log,
          lt_in    TYPE TABLE OF ty_in,
          ls_in    TYPE          ty_in,
          lv_value TYPE          string.

    ls_log-zid   = ls_zthr9003-zid.
    ls_log-zdate = ls_zthr9003-zdate.
    ls_log-ztime = ls_zthr9003-ztime.
    ls_log-ifnum = ls_zthr9003-ifnum.
    ls_log-suser = ls_zthr9003-suser.

    LOOP AT it_input INTO ls_debug.
      ls_in-pname = ls_debug-pname.
      ls_in-value = ls_debug-value.
      APPEND ls_in TO lt_in.
    ENDLOOP.

    CALL FUNCTION 'ZHRFM_ABAP_TO_JSON'
      EXPORTING
        iv_data = lt_in[]
      IMPORTING
        ev_json = lv_value.

    ls_log-valuein = lv_value.
*    ls_log-valueout = lv_value.
    MODIFY zbasic_info_log FROM ls_log.
  ENDIF.
ENDFUNCTION.
 

获取接口的参数

FUNCTION ZHRFM_GET_FUNC_INFO.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_IFNUM) TYPE  ZHRIFNUM
*"     REFERENCE(IV_IFNAM) TYPE  ZHRSFUNC
*"     REFERENCE(IV_LANGU) TYPE  LANGU DEFAULT '1'
*"  EXPORTING
*"     REFERENCE(ES_MESSAGE) TYPE  ZSHR_MESSAGE
*"  TABLES
*"      ET_PARAM_INFO STRUCTURE  ZSHR_FUC_PARAMS
*"----------------------------------------------------------------------
  DATA:LT_PARAMS TYPE STANDARD TABLE OF RFC_FUNINT,
       LS_PARAMS TYPE RFC_FUNINT.
  DATA:LS_PARAM_INFO  TYPE ZSHR_FUC_PARAMS.
  DATA:LV_TYPENAME    TYPE DD40L-TYPENAME.
  DATA:LV_TABNAME     TYPE TABNAME.
  DATA:LT_FIELDS TYPE ICL_DFIES_TAB,
       LS_FIELDS TYPE DFIES.

*获取函数参数
  REFRESH LT_PARAMS.
  CALL FUNCTION 'RFC_GET_FUNCTION_INTERFACE_US'
    EXPORTING
      FUNCNAME      = IV_IFNAM
      LANGUAGE      = IV_LANGU
    TABLES
      PARAMS        = LT_PARAMS
    EXCEPTIONS
      FU_NOT_FOUND  = 1
      NAMETAB_FAULT = 2
      OTHERS        = 3.
  IF SY-SUBRC <> 0.
    ES_MESSAGE-MSGTY = 'E'.
    MESSAGE S001(ZMSG_HR) INTO ES_MESSAGE-MSGTX WITH IV_IFNAM .
    RETURN.
  ENDIF.

*获取函数参数
  REFRESH ET_PARAM_INFO.
  CLEAR   LS_PARAM_INFO.

  LOOP AT LT_PARAMS INTO LS_PARAMS.

    CLEAR LS_PARAM_INFO.
    LS_PARAM_INFO-IFNUM      = IV_IFNUM.
    LS_PARAM_INFO-PARAM      = LS_PARAMS-PARAMETER.
    LS_PARAM_INFO-PKIND      = LS_PARAMS-PARAMCLASS.
    LS_PARAM_INFO-OPTIO      = LS_PARAMS-OPTIONAL.
    LS_PARAM_INFO-PARAT      = LS_PARAMS-PARAMTEXT.
    LS_PARAM_INFO-INTTY      = LS_PARAMS-EXID.
    LS_PARAM_INFO-STRUC      = LS_PARAMS-TABNAME.
    LS_PARAM_INFO-RFIED      = LS_PARAMS-FIELDNAME.

    IF LS_PARAM_INFO-PKIND = 'T'.
      LS_PARAM_INFO-ZTABL = 'X'.
    ELSE.
      CLEAR LV_TYPENAME.
      SELECT SINGLE TYPENAME INTO LV_TYPENAME FROM DD40L WHERE TYPENAME = LS_PARAMS-TABNAME.
      IF SY-SUBRC EQ 0.
        LS_PARAM_INFO-ZTABL = 'X'.
      ENDIF.
    ENDIF.

*特殊类型处理
    IF LS_PARAMS-EXID = 'u' OR LS_PARAMS-EXID = 'h' OR LS_PARAMS-EXID = 'v'.
      LV_TABNAME = LS_PARAMS-TABNAME.
      IF LS_PARAMS-EXID = 'h'.
        SELECT SINGLE ROWTYPE INTO LV_TABNAME FROM DD40L WHERE TYPENAME =  LS_PARAMS-TABNAME.
      ENDIF.

      REFRESH LT_FIELDS.
      CALL FUNCTION 'ICL_GET_DDIC_INFO'
        EXPORTING
          IV_TABNAME            = LV_TABNAME
        IMPORTING
          ET_DFIES              = LT_FIELDS
        EXCEPTIONS
          WRONG_CALL            = 1
          ERRONEOUS_INPUT_DATA  = 2
          DDIC_DATA_READ_FAILED = 3
          ERROR_OCCURRED        = 4
          OTHERS                = 5.
      LOOP AT LT_FIELDS INTO LS_FIELDS WHERE FIELDNAME NE 'INCLUDE.'.
        LS_PARAM_INFO-FIELD      = LS_FIELDS-FIELDNAME.
        LS_PARAM_INFO-PARAT      = LS_FIELDS-FIELDTEXT.
        LS_PARAM_INFO-LENGT      = LS_FIELDS-LENG.
        LS_PARAM_INFO-POSIT      = LS_FIELDS-POSITION.
        LS_PARAM_INFO-INTTY      = LS_FIELDS-INTTYPE.
        LS_PARAM_INFO-DECIM      = LS_FIELDS-DECIMALS.
        APPEND LS_PARAM_INFO TO ET_PARAM_INFO.
      ENDLOOP.
    ELSE.
      LS_PARAM_INFO-FIELD      = ''.
      LS_PARAM_INFO-PARAT      = LS_PARAMS-PARAMTEXT.
      LS_PARAM_INFO-LENGT      = LS_PARAMS-INTLENGTH / 2.
      LS_PARAM_INFO-INTTY      = LS_PARAMS-EXID.
      LS_PARAM_INFO-DECIM      = LS_PARAMS-DECIMALS.
      APPEND LS_PARAM_INFO TO ET_PARAM_INFO.
    ENDIF.
  ENDLOOP.


ENDFUNCTION.

JSON转换为ABAP

前端以JSON数据传输给SAP,JSON中可能有field,结构,数组表类型,等

表可能有 sorted table, hashed table, standard table。 array[]按键值对传输,需要区分解析。

FUNCTION zhrfm_json_to_abap.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_JSON) TYPE  STRING
*"  EXPORTING
*"     REFERENCE(EV_DATA) TYPE  DATA
*"     REFERENCE(ES_MESSAGE) TYPE  ZSHR_MESSAGE
*"----------------------------------------------------------------------

  CALL METHOD zhrcl_fdt_json=>json_to_data
    EXPORTING
      iv_json = iv_json
    CHANGING
      ca_data = ev_data.

ENDFUNCTION.

JSON转换成内表

  METHOD json_to_data_internal.
    "JSON               ABAP
    "{...} object  -->  field, structure, ...
    "[...] array   -->  table
    DATA:
      lv_char      TYPE c,
      lv_token     TYPE string,
      lv_dummy     TYPE string,   "is used in case of invalid fieldname
      lt_dummy     LIKE STANDARD TABLE OF lv_dummy, "is used in case of invalid table
      lv_is_filled TYPE abap_bool,
      lr_line      TYPE REF TO data,
      lr_td        TYPE REF TO cl_abap_typedescr,
      lr_ttd       TYPE REF TO cl_abap_tabledescr,
      lx_root      TYPE REF TO cx_root.
    FIELD-SYMBOLS:
      <la_any>  TYPE any,
      <la_line> TYPE any,
      <lt_any>  TYPE ANY TABLE,
      <lt_srtd> TYPE SORTED TABLE,
      <lt_hash> TYPE HASHED TABLE,
      <lt_stnd> TYPE STANDARD TABLE.

    lr_td = cl_abap_typedescr=>describe_by_data( ca_data ).
    CASE lr_td->type_kind.
      WHEN cl_abap_typedescr=>typekind_dref.
        ASSIGN ca_data->* TO <la_any>.
        IF sy-subrc <> 0. ASSIGN lv_dummy TO <la_any>. ENDIF.
      WHEN OTHERS.
        ASSIGN ca_data TO <la_any>.
    ENDCASE.
    WHILE strlen( cv_json ) > 0.
      lv_char = cv_json(1).
      SHIFT cv_json BY 1 PLACES.
      CASE lv_char.
        WHEN '{'.   "object starts --> next level
          json_to_data_internal(
            EXPORTING
              iv_is_tabline = abap_false
            IMPORTING
              ev_is_filled  = ev_is_filled
            CHANGING
              cv_json     = cv_json
              ca_data     = <la_any> ).
        WHEN '['.   "array starts --> next level
          lr_td = cl_abap_typedescr=>describe_by_data( <la_any> ).
          IF lr_td->kind EQ cl_abap_typedescr=>kind_table.
            ASSIGN <la_any> TO <lt_any>.
          ELSE. "Type mismatch - to prevent short dump
            ASSIGN lt_dummy TO <lt_any>.
          ENDIF.
          CREATE DATA lr_line LIKE LINE OF <lt_any>.
          ASSIGN lr_line->* TO <la_line>.
          CLEAR lv_is_filled.
          json_to_data_internal(
            EXPORTING
              iv_is_tabline = abap_true
            IMPORTING
              ev_is_filled  = lv_is_filled
            CHANGING
              cv_json     = cv_json
              ca_data     = <la_line> ).
          IF <la_line> IS NOT INITIAL
          OR lv_is_filled EQ abap_true.
            ev_is_filled = abap_true.
            lr_td = cl_abap_typedescr=>describe_by_data( <lt_any> ).
            lr_ttd ?= lr_td.
            IF lr_ttd->table_kind EQ cl_abap_tabledescr=>tablekind_sorted.
              "           sorted table
              ASSIGN <lt_any> TO <lt_srtd>.
              INSERT <la_line> INTO TABLE <lt_srtd>.
            ELSEIF lr_ttd->table_kind = cl_abap_tabledescr=>tablekind_hashed.
              "           hashed table
              ASSIGN <lt_any> TO <lt_hash>.
              INSERT <la_line> INTO TABLE <lt_hash>.
            ELSE.
              "           standard table
              ASSIGN <lt_any> TO <lt_stnd>.
              APPEND <la_line> TO <lt_stnd>.
            ENDIF.
          ENDIF.
        WHEN ']'.   "Array ends --> previous level
          IF lv_token IS NOT INITIAL.
            convert_token(
              EXPORTING
                ia_data      = <la_any>
              CHANGING
                cv_token     = lv_token ).
            TRY.
                <la_any> = lv_token.
                ev_is_filled = abap_true.
              CATCH cx_root INTO lx_root.               "#EC NO_HANDLER
            ENDTRY.
          ENDIF.
          RETURN.
        WHEN '}'.   "Object ends --> previous level
          IF lv_token IS NOT INITIAL.
            convert_token(
              EXPORTING
                ia_data      = <la_any>
              CHANGING
                cv_token     = lv_token ).
            TRY.
                <la_any> = lv_token.
                ev_is_filled = abap_true.
              CATCH cx_root INTO lx_root.               "#EC NO_HANDLER
            ENDTRY.
          ENDIF.
          RETURN.
        WHEN ':'.   "key ends, value starts
            TRANSLATE lv_token TO UPPER CASE.
            SHIFT lv_token LEFT DELETING LEADING space.
            IF lv_token IS NOT INITIAL.
              IF lv_token EQ '$ROOT'.              "Do nothing - already assigned!
              ELSEIF lv_token EQ '$T'.             "ignore the value! do special things
                json_to_brf_struc(
                  CHANGING
                    ca_data    = <la_any>
                    cv_json    = cv_json ).
                ev_is_filled = abap_true.
              ELSE.
                ASSIGN COMPONENT lv_token OF STRUCTURE ca_data TO <la_any>.
                IF sy-subrc NE 0.                  "Field not found?
                  ASSIGN lv_dummy TO <la_any>.     "ignore the value!
                ENDIF.
              ENDIF.
            ENDIF.
            CLEAR lv_token.
        WHEN ','.   "next value -- same level
          IF lv_token IS NOT INITIAL.
            convert_token(
              EXPORTING
                ia_data      = <la_any>
              CHANGING
                cv_token     = lv_token ).
            TRY.
                <la_any> = lv_token.
                ev_is_filled = abap_true.
              CATCH cx_root INTO lx_root.               "#EC NO_HANDLER
            ENDTRY.
          ENDIF.
          CLEAR lv_token.
          IF iv_is_tabline EQ abap_true.  "to trigger next table line
            CONCATENATE '[' cv_json INTO cv_json.
            RETURN.
          ENDIF.
        WHEN '"'.    "string starts
          get_string(
            IMPORTING
              ev_string = lv_token
            CHANGING
              cv_json = cv_json ).
        WHEN OTHERS. "ie. numbers, ...
          CONCATENATE lv_token lv_char INTO lv_token.
      ENDCASE.
    ENDWHILE.
  ENDMETHOD.

JSON串中 回车,换行,空格符等特殊字符处理,个别类型转换

  METHOD CONVERT_TOKEN.
    DATA:
      lo_descr      TYPE REF TO cl_abap_typedescr.

    " Check target type if conversion is needed
    lo_descr = cl_abap_typedescr=>describe_by_data( ia_data ).
    CASE lo_descr->absolute_name.
      WHEN gc_abap_bool
        OR gc_fdt_boolean
        OR gc_element_boolean.
        IF cv_token EQ 'true'.
          cv_token = abap_true.
        ELSEIF cv_token EQ 'false'.
          cv_token = abap_false.
        ENDIF.
      WHEN OTHERS.
*        cv_token = cv_token.
        " replace escape characters
        REPLACE ALL OCCURRENCES OF '\n' IN cv_token WITH cl_abap_char_utilities=>newline.
        REPLACE ALL OCCURRENCES OF '\t' IN cv_token WITH cl_abap_char_utilities=>horizontal_tab.
        REPLACE ALL OCCURRENCES OF '\f' IN cv_token WITH cl_abap_char_utilities=>form_feed.
        REPLACE ALL OCCURRENCES OF '\v' IN cv_token WITH cl_abap_char_utilities=>vertical_tab.
        REPLACE ALL OCCURRENCES OF '\b' IN cv_token WITH cl_abap_char_utilities=>backspace.
        REPLACE ALL OCCURRENCES OF '\r' IN cv_token WITH cl_abap_char_utilities=>cr_lf(1).
        REPLACE ALL OCCURRENCES OF '\"' IN cv_token WITH '"'.
        REPLACE ALL OCCURRENCES OF '\/' IN cv_token WITH '/'.
        REPLACE ALL OCCURRENCES OF '\\' IN cv_token WITH '\'.
    ENDCASE.
  ENDMETHOD.

JSON中STRING解析处理

  METHOD GET_STRING.
    DATA:
      lv_escape   TYPE i,
      lv_char     TYPE string, "instead of 'C' to keep spaces
      lv_is_string TYPE abap_bool VALUE abap_true.

    WHILE strlen( cv_json ) > 0
      AND lv_is_string EQ abap_true.
      lv_char = cv_json(1).
      SHIFT cv_json BY 1 PLACES.
      CASE lv_char.
        WHEN '\'.
          lv_escape = lv_escape + 1.
          CONCATENATE ev_string lv_char INTO ev_string.
        WHEN '"'.
          lv_escape = lv_escape MOD 2.
          IF lv_escape EQ 0.         "end of string?
            lv_is_string = abap_false.
          ELSE.
            CONCATENATE ev_string lv_char INTO ev_string.
          ENDIF.
          clear lv_escape.
        WHEN OTHERS. "all other chars could be collected without any check!
          CONCATENATE ev_string lv_char INTO ev_string.
          clear lv_escape.
      ENDCASE.
    ENDWHILE.
  ENDMETHOD.

JSON串中数值,金额等特殊类型处理转换

  METHOD JSON_TO_BRF_STRUC.

    DATA:
      lv_token      TYPE string,
      ls_amount     TYPE fdt_s_amount,
      ls_quantity   TYPE fdt_s_quantity,
      ls_timepoint  TYPE fdt_s_timepoint,
      lo_descr      TYPE REF TO cl_abap_typedescr,
      lx_root       TYPE REF TO cx_root.

    FIELD-SYMBOLS:
      <la_any>      TYPE any.

    "JSON example:' "A", "AMOUNT":1234,"CURRENCY":"EUR"} ...'
    lo_descr = cl_abap_typedescr=>describe_by_data( ca_data ).

    "1. get the special type
    SHIFT cv_json UP TO '"'.
    SHIFT cv_json BY 1 PLACES. "eleminate quotes '"'
    get_string(
      IMPORTING
        ev_string = lv_token
      CHANGING
        cv_json = cv_json ).

    SHIFT cv_json UP TO ','.
    SHIFT cv_json BY 1 PLACES. "eleminate comma ','
    CASE lv_token.
      WHEN if_fdt_constants=>gc_element_type_amount.
        ASSIGN ls_amount TO <la_any>.
      WHEN if_fdt_constants=>gc_element_type_quantity.
        ASSIGN ls_quantity TO <la_any>.
      WHEN if_fdt_constants=>gc_element_type_timepoint.
        ASSIGN ls_timepoint TO <la_any>.
      WHEN OTHERS.
        RETURN. "?
    ENDCASE.

    "2. get values for special type
    IF <la_any> IS ASSIGNED.
      json_to_data_internal(
        CHANGING
          cv_json = cv_json
          ca_data = <la_any> ).
      TRY.
          CASE lv_token.
            WHEN if_fdt_constants=>gc_element_type_amount.
              "Check target type
              CASE lo_descr->absolute_name.
                WHEN gc_element_amount
                  OR gc_fdt_amount.
                  ca_data = ls_amount.                "no conversion needed
                WHEN gc_element_number.
                  ca_data = ls_amount-number.
                WHEN gc_element_text.
                  ca_data = cl_fdt_amount_conv=>to_string( ls_amount ).
                WHEN OTHERS.
                  CASE lo_descr->type_kind.
                    WHEN cl_abap_typedescr=>typekind_float
                      OR cl_abap_typedescr=>typekind_decfloat
                      OR cl_abap_typedescr=>typekind_decfloat16
                      OR cl_abap_typedescr=>typekind_decfloat34
                      OR cl_abap_typedescr=>typekind_packed
                      OR cl_abap_typedescr=>typekind_int
                      OR cl_abap_typedescr=>typekind_int8.
                      ca_data = ls_amount-number.
                    WHEN cl_abap_typedescr=>typekind_clike
                      OR cl_abap_typedescr=>typekind_char
                      OR cl_abap_typedescr=>typekind_string.
                      ca_data = cl_fdt_amount_conv=>to_string( ls_amount ).
                    WHEN OTHERS.
                      CLEAR ca_data. "no conversion possible
                  ENDCASE.
              ENDCASE.
            WHEN if_fdt_constants=>gc_element_type_quantity.
              CASE lo_descr->absolute_name.
                WHEN gc_element_quantity
                  OR gc_fdt_quantity.
                  ca_data = ls_quantity.              "no conversion needed
                WHEN gc_element_number.
                  ca_data = ls_quantity-number.
                WHEN gc_element_text.
                  ca_data = cl_fdt_quantity_conv=>to_string( ls_quantity ).
                WHEN OTHERS.
                  CASE lo_descr->type_kind.
                    WHEN cl_abap_typedescr=>typekind_float
                      OR cl_abap_typedescr=>typekind_decfloat
                      OR cl_abap_typedescr=>typekind_decfloat16
                      OR cl_abap_typedescr=>typekind_decfloat34
                      OR cl_abap_typedescr=>typekind_packed
                      OR cl_abap_typedescr=>typekind_int
                      OR cl_abap_typedescr=>typekind_int8.
                      ca_data = ls_quantity-number.
                    WHEN cl_abap_typedescr=>typekind_clike
                      OR cl_abap_typedescr=>typekind_char
                      OR cl_abap_typedescr=>typekind_string.
                      ca_data = cl_fdt_quantity_conv=>to_string( ls_quantity ).
                    WHEN OTHERS.
                      CLEAR ca_data. "no conversion possible
                  ENDCASE.
              ENDCASE.
            WHEN if_fdt_constants=>gc_element_type_timepoint.
              CASE lo_descr->absolute_name.
                WHEN gc_element_timepoint
                  OR gc_fdt_timepoint.
                  ca_data = ls_timepoint.             "no conversion needed
                WHEN gc_element_number.
                  ca_data = ls_timepoint-timestamp.
                WHEN gc_element_text.
                  ca_data = cl_fdt_date_time=>convert_timepoint_to_text( ls_timepoint ).
                WHEN OTHERS.
                  CASE lo_descr->type_kind.
                    WHEN cl_abap_typedescr=>typekind_float
                      OR cl_abap_typedescr=>typekind_decfloat
                      OR cl_abap_typedescr=>typekind_decfloat16
                      OR cl_abap_typedescr=>typekind_decfloat34
                      OR cl_abap_typedescr=>typekind_packed
                      OR cl_abap_typedescr=>typekind_int
                      OR cl_abap_typedescr=>typekind_int8.
                      ca_data = ls_timepoint-timestamp.
                    WHEN cl_abap_typedescr=>typekind_clike
                      OR cl_abap_typedescr=>typekind_char
                      OR cl_abap_typedescr=>typekind_string.
                      ca_data = cl_fdt_date_time=>convert_timepoint_to_text( ls_timepoint ).
                    WHEN cl_abap_typedescr=>typekind_date.
                      ca_data = ls_timepoint-date.
                    WHEN cl_abap_typedescr=>typekind_time.
                      ca_data = ls_timepoint-time.
                    WHEN OTHERS.
                      CLEAR ca_data. "no conversion possible
                  ENDCASE.
              ENDCASE.
          ENDCASE.
        CATCH cx_root INTO lx_root.
          CLEAR ca_data.
      ENDTRY.

      "to end the level - as this sign is already stripped in method before
      CONCATENATE '}' cv_json INTO cv_json RESPECTING BLANKS.

    ENDIF.
  ENDMETHOD.

如果RFC入参的 JSON中包涵JSON 还需要多解析一层特殊处理.

ZTHR_PARAM

接口使用情况分析监控

*&---------------------------------------------------------------------*
*& Report ZHRR9099
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhrr9099.

TABLES: zthr9003, zthr0001.
SELECT-OPTIONS:s_ifnum FOR zthr0001-ifnum,
              s_date FOR zthr9003-zdate,
              s_time FOR zthr9003-ztime.
PARAMETERS: p_time   TYPE zthr9003-ztime2,
            p_wy     TYPE zthr9003-zmark AS CHECKBOX,
            p_report TYPE zthr9003-zmark AS CHECKBOX,
            p_save   TYPE zthr9003-zmark AS CHECKBOX.

DATA : BEGIN OF ls_ifnum,
         begda     TYPE sy-datum,
         endda     TYPE sy-datum,
         ifnum     TYPE zthr0001-ifnum, "接口号
         zmark(1),
         num       TYPE i,   " 调用量
         num1      TYPE i,   " 有效调用量  500 ms
         num3      TYPE i,   " 有效调用量   5S
         num5      TYPE i,   " 有效调用量 50S
         num100    TYPE i,   " 有效调用量 100S
         num200    TYPE i,   " 有效调用量  200S
         ztime2    TYPE zthr9003-ztime2,   " 有效总耗时
         ztime_1   TYPE zthr9003-ztime2,   " 有效总耗时
         ztime_3   TYPE zthr9003-ztime2,   " 有效总耗时
         ztime_5   TYPE zthr9003-ztime2,   " 有效总耗时
         time_arv  TYPE zthr9003-ztime2,    " 平均耗时
         time_arv1 TYPE zthr9003-ztime2,    " 平均耗时
         time_arv3 TYPE zthr9003-ztime2,    " 平均耗时
         time_arv5 TYPE zthr9003-ztime2,    " 平均耗时
         time_max  TYPE zthr9003-ztime2,    " 最大耗时
         sdate     TYPE sy-datum,
         stime     TYPE sy-uzeit,
       END OF ls_ifnum,
       lt_ifnum  LIKE TABLE OF ls_ifnum,
       ls_ifnum2 LIKE  ls_ifnum,
       lt_ifnum2 LIKE TABLE OF ls_ifnum.
DATA : BEGIN OF ls_report,
         zqxdm TYPE zthrreport-zqxdm,
         num   TYPE i,
       END OF ls_report,
       lt_report  LIKE TABLE OF ls_report,
       lt_report2 LIKE TABLE OF ls_report,
       ls_report2 LIKE  ls_report.
DATA lt_9004 TYPE TABLE OF zthr9004.
DATA lt_9003 TYPE TABLE OF zthr9003.


DATA : BEGIN OF ls_value2,
         value2 TYPE zthr9004-value2,
       END OF ls_value2,
       lt_value2 LIKE TABLE OF ls_value2.

RANGES : rt_wy FOR zthr9003-zmark.
DATA ls_wy LIKE LINE OF    rt_wy.

START-OF-SELECTION.
  IF p_report = ''.


    IF p_wy = 'X'.
      ls_wy-sign = 'I'.
      ls_wy-option = 'EQ'.
      ls_wy-low = 'W'.
      APPEND ls_wy TO rt_wy.
      SELECT * INTO TABLE  @DATA(lt_0001_wy) FROM zthr0001_wy WHERE ifnum  IN @s_ifnum.

    ELSE.
      SELECT * INTO TABLE  @DATA(lt_0001) FROM zthr0001 WHERE ifnum  IN @s_ifnum.
      SELECT * INTO TABLE  lt_0001_wy FROM zthr0001_wy WHERE ifnum  IN s_ifnum.
    ENDIF.
*   接口 使用情况
    IF p_time = ''.
      SELECT  ifnum  ztime2  zmark INTO CORRESPONDING FIELDS OF TABLE  lt_9003 FROM zthr9003 WHERE zdate IN s_date AND ztime IN s_time AND  ifnum  IN s_ifnum  AND zmark IN rt_wy[] .
    ELSE.
      SELECT  ifnum  ztime2  zmark INTO CORRESPONDING FIELDS OF TABLE lt_9003 FROM zthr9003 WHERE  zdate IN s_date AND ztime IN s_time AND ifnum  IN s_ifnum AND ztime2  GE p_time  AND zmark IN rt_wy[] .
    ENDIF.




    SORT lt_9003 BY ifnum.

*  DATA : lv_time1 TYPE zthr9003-ztime2.
** 性能分析标准时间  排查接口掉无效调用的时间统计
*  lv_time1 = 1000. " 1S 、 3S  5S

    LOOP AT lt_9003 INTO DATA(ls_9003).
      CLEAR ls_ifnum.
      ls_ifnum-ifnum = ls_9003-ifnum.
      ls_ifnum-zmark = ls_9003-zmark.
      ls_ifnum-num = 1.
      ls_ifnum-ztime2 =  ls_9003-ztime2 .

      IF ls_9003-ztime2  GE 500.   " 有效调用
        ls_ifnum-num1 = 1.
        ls_ifnum-ztime_1 =  ls_9003-ztime2 .
      ENDIF.

      IF ls_9003-ztime2  GE 5000.  " 5S
        ls_ifnum-num3 = 1.
        ls_ifnum-ztime_3 =  ls_9003-ztime2 .
      ENDIF.

      IF ls_9003-ztime2  GE 50000.  "50S
        ls_ifnum-num5 = 1.
        ls_ifnum-ztime_5 =  ls_9003-ztime2 .
      ENDIF.

      IF ls_9003-ztime2  GE 100000. " 100S
        ls_ifnum-num100 = 1.
*      ls_ifnum-ztime_5 =  ls_9003-ztime2 .
      ENDIF.

      IF ls_9003-ztime2  GE 200000.  " 200S
        ls_ifnum-num200 = 1.
*      ls_ifnum-ztime_5 =  ls_9003-ztime2 .
      ENDIF.

      COLLECT ls_ifnum INTO lt_ifnum.
    ENDLOOP.
*  IF p_time NE ''.
    SORT lt_ifnum BY num DESCENDING.
*  ENDIF.

*12日调用量: 平均耗时: 最大耗时:
    DATA ls_if_log TYPE zthr_if_log.
    DATA lt_if_log TYPE  TABLE OF  zthr_if_log.

    LOOP AT lt_0001 INTO DATA(ls_0001).
      CLEAR: ls_if_log, ls_ifnum2, ls_ifnum.


      READ TABLE lt_ifnum INTO ls_ifnum WITH  KEY ifnum = ls_0001-ifnum zmark = ''.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING ls_ifnum TO ls_ifnum2.
        ls_ifnum2-num = ls_ifnum-num.
        ls_ifnum2-ztime2 = ls_ifnum-ztime2.
        IF ls_ifnum-num NE 0.
          ls_ifnum2-time_arv = ls_ifnum-ztime2 / ls_ifnum-num.
        ENDIF.
        IF ls_ifnum-num1 NE 0.
          ls_ifnum2-time_arv1 = ls_ifnum-ztime_1 / ls_ifnum-num1.
        ENDIF.
        IF ls_ifnum-num3 NE 0.
          ls_ifnum2-time_arv3 = ls_ifnum-ztime_3 / ls_ifnum-num3.
        ENDIF.
        IF ls_ifnum-num5 NE 0.
          ls_ifnum2-time_arv5 = ls_ifnum-ztime_5 / ls_ifnum-num5.
        ENDIF.

        SELECT MAX( ztime2 )  INTO  ls_ifnum2-time_max FROM zthr9003 WHERE zdate IN s_date AND ztime IN s_time AND  ifnum = ls_ifnum-ifnum  AND zmark = ''.
      ENDIF.
      ls_ifnum2-begda = s_date-low.
      ls_ifnum2-endda = s_date-high.
      ls_ifnum2-ifnum = ls_0001-ifnum.
      ls_ifnum2-sdate = sy-datum.
      ls_ifnum2-stime = sy-uzeit.
      CLEAR ls_if_log.
      MOVE-CORRESPONDING ls_ifnum2 TO ls_if_log.

      APPEND ls_ifnum2 TO  lt_ifnum2.
      APPEND ls_if_log TO  lt_if_log.
    ENDLOOP.

    LOOP AT lt_0001_wy INTO DATA(ls_0001_wy).
      CLEAR: ls_if_log, ls_ifnum2, ls_ifnum.

      READ TABLE lt_ifnum INTO ls_ifnum WITH  KEY ifnum = ls_0001_wy-ifnum zmark = 'W'.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING ls_ifnum TO ls_ifnum2.
        ls_ifnum2-num = ls_ifnum-num.
        ls_ifnum2-ztime2 = ls_ifnum-ztime2.
        IF ls_ifnum-num NE 0.
          ls_ifnum2-time_arv = ls_ifnum-ztime2 / ls_ifnum-num.
        ENDIF.
        IF ls_ifnum-num1 NE 0.
          ls_ifnum2-time_arv1 = ls_ifnum-ztime_1 / ls_ifnum-num1.
        ENDIF.
        IF ls_ifnum-num3 NE 0.
          ls_ifnum2-time_arv3 = ls_ifnum-ztime_3 / ls_ifnum-num3.
        ENDIF.
        IF ls_ifnum-num5 NE 0.
          ls_ifnum2-time_arv5 = ls_ifnum-ztime_5 / ls_ifnum-num5.
        ENDIF.

        SELECT MAX( ztime2 )  INTO  ls_ifnum2-time_max FROM zthr9003 WHERE zdate IN s_date AND ztime IN s_time AND  ifnum = ls_ifnum-ifnum  AND zmark = 'W' .
      ENDIF.
      ls_ifnum2-begda = s_date-low.
      ls_ifnum2-endda = s_date-high.
      ls_ifnum2-ifnum = ls_0001_wy-ifnum.
      ls_ifnum2-sdate = sy-datum.
      ls_ifnum2-stime = sy-uzeit.
      CLEAR ls_if_log.
      MOVE-CORRESPONDING ls_ifnum2 TO ls_if_log.

      APPEND ls_ifnum2 TO  lt_ifnum2.
      APPEND ls_if_log TO  lt_if_log.
    ENDLOOP.




    IF lt_if_log[] IS NOT INITIAL AND  p_save = 'X'.

* ZTHR_IF_LOG


      MODIFY  zthr_if_log FROM TABLE lt_if_log.
      IF sy-subrc = 0.
        COMMIT WORK.
      ELSE.
        ROLLBACK WORK.
      ENDIF.



      MESSAGE 'OK' TYPE 'S'.
    ENDIF.

*   报表使用情况
  ELSE.
    SELECT * INTO TABLE  @DATA(lt_zthrreport) FROM zthrreport.

    IF lt_zthrreport[] IS NOT INITIAL .
      LOOP AT lt_zthrreport INTO DATA(ls_zthrreport).
        ls_value2-value2 = ls_zthrreport-zqxdm.
        APPEND ls_value2 TO  lt_value2.
      ENDLOOP.
      SELECT  *  INTO TABLE lt_9004 FROM zthr9004 FOR ALL ENTRIES IN lt_value2
         WHERE  zdate IN s_date AND ztime IN s_time AND ifnum  IN s_ifnum[] AND pname = 'IV_ZQXDM'  AND value2 =  lt_value2-value2   .
    ENDIF.


    LOOP AT lt_9004 INTO  DATA(ls_9004).
      ls_report-zqxdm = ls_9004-value2.
      ls_report-num = 1.
      COLLECT ls_report INTO lt_report.
    ENDLOOP.

    LOOP AT lt_zthrreport  INTO ls_zthrreport.
      CLEAR ls_report.
      READ TABLE lt_report INTO ls_report WITH  KEY zqxdm = ls_zthrreport-zqxdm.
      ls_report2-zqxdm = ls_zthrreport-zqxdm.
      ls_report2-num = ls_report-num.
      APPEND ls_report2 TO  lt_report2.
    ENDLOOP.

    IF lt_report2[] IS NOT INITIAL.
      MESSAGE 'OK2' TYPE 'S'.
    ENDIF.

*  将统计数据写入到系统接口日志表
    IF p_save = 'X'.
    ENDIF.

  ENDIF.

删除每日接口日志

保留N天内接口日志。每日JOB自动清理。节省系统内存占用空间。

*&---------------------------------------------------------------------*
*& Report ZHR_DEL_IF_LOG
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhr_del_if_log.
DATA : lv_date  TYPE sy-datum.

PARAMETERS : p_date LIKE sy-datum  DEFAULT sy-datum .

INITIALIZATION.
  p_date = sy-datum.

START-OF-SELECTION.

  lv_date = p_date - 12.
*DELETE FROM zthr9003 WHERE  zid  <> ''.
  DELETE FROM zthr9003 WHERE   zdate LT lv_date  AND ifnum NE '34011'  AND ifnum NE '21000'.

  DELETE FROM zthr9004 WHERE  zdate LT lv_date AND ifnum NE '34011'   AND ifnum NE '21000'.

  IF sy-subrc = 0.
    MESSAGE  'OK' TYPE 'S'.
    COMMIT WORK.
  ELSE.
    ROLLBACK WORK.
    MESSAGE  ' NOT OK' TYPE 'S'.
  ENDIF.

  lv_date = p_date - 30.
  DELETE FROM zthr9003 WHERE   zdate LT lv_date  AND ( ifnum EQ '34011' OR ifnum EQ '21000' ).

  DELETE FROM zthr9004 WHERE  zdate LT lv_date AND ( ifnum EQ '34011' OR ifnum EQ '21000' ).
  IF sy-subrc = 0.
    MESSAGE  'OK' TYPE 'S'.
    COMMIT WORK.
  ELSE.
    ROLLBACK WORK.
    MESSAGE  ' NOT OK' TYPE 'S'.
  ENDIF.

  lv_date = p_date - 7.

  DELETE FROM zthr9007 WHERE zdate LT lv_date.

  IF sy-subrc = 0.
    MESSAGE  'OK' TYPE 'S'.
    COMMIT WORK.
  ELSE.
    ROLLBACK WORK.
    MESSAGE  ' NOT OK' TYPE 'S'.
  ENDIF.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值