应用场景: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.