SXI_MONITOR需要区分接口是发送方还是接收方,查询没那么方便,可以自定义实现
直接通过业务单号匹配查询PI报文
1. 自定义PI接口日志表
公用配置表,定义每个PI接口的接口编码,对应PI接口INBOUND/OUTBOUND对象名,发送方接收方,对应FUNCTION功能模块名称,FM输入参数,FM输出参数,同步异步方式,分发系统等。
2. 封装PI接口公用类CLASS
ZCL_AB_INTERFACE 接口类(抽象类)
构造函数:
METHOD check_interface_configuration.DATA(lv_fieldname) = VALUE string( ).IF iv_itfid IS INITIAL.lv_fieldname = 'ITFID'.ev_return_code = 4.ELSE.SELECT SINGLE * INTO ms_configFROM ztab0002WHERE itfid = iv_itfid.IF sy-subrc NE 0.ev_return_code = 4.ENDIF.ENDIF."接口编码不存在IF ev_return_code = 4.RAISE EXCEPTION TYPE zcx_ab_interface_managerEXPORTINGtextid = zcx_ab_interface_manager=>config_is_wrong "配置表不存在mv_intf_fieldname = CONV #( lv_fieldname ).ENDIF.ENDMETHOD.
保存PI LOG CLASS
定义公用属性
2.1 获取PI报文方法
初始化:
IV_MSGID TYPE SXMSMGUID XI:消息标识
IV_MANDT TYPE SYMANDT 客户端标识
EV_PAYLOAD TYPE STRING Payload
EV_XPAYLOAD TYPE XSTRING
METHOD get_payload.DATA:l_pro_s TYPE sxms_pro_s, l_pro_t TYPE REF TO sxms_pro_t, l_manifest TYPE REF TO cl_xms_msghdr30_manifest, string_data TYPE string, l_mf_s TYPE sxms_mf_s, l_mf_t TYPE sxms_mf_t, lt_message_ids TYPE sxmscguid_t, lv_msgguid TYPE sxmsmguid, lv_payload TYPE string, l_resource TYPE REF TO if_xms_resource.* REPLACE ALL OCCURRENCES OF '-' IN iv_msgid WITH space.DATA(persist) = NEW cl_xms_persist( ).DATA(ls_filter) = VALUE sxi_message_filter( ).APPEND iv_msgid TO lt_message_ids.ls_filter-message_ids = lt_message_ids.ls_filter-client = iv_mandt.TRY.CALL METHOD cl_xi_ws_messmon=>get_message_listEXPORTINGim_filter = ls_filterIMPORTINGex_message_data_list = DATA(lt_message_data).DATA(ls_verstab) = VALUE sxmsvlst(mandt = iv_mandtmsgguid = iv_msgid
* pid =version = '000').IF lt_message_data[] IS NOT INITIAL.ls_verstab-pid = lt_message_data[ 1 ]-pid.ELSE.EXIT.ENDIF.CALL METHOD persist->read_msg_pubEXPORTINGim_msgguid = ls_verstab-msgguidim_pid = ls_verstab-pidim_version = ls_verstab-versionim_client = ls_verstab-mandtIMPORTINGex_message = DATA(lo_message).CATCH cx_xms_system_error INTO DATA(oref).
* IF oref->previous IS NOT INITIAL.
* oref = oref->previous.
* ENDIF.
* raise message only when no restart - on restart some versions might be deleted
* IF gt_ucomm NE 'RESTART'.
* MESSAGE oref TYPE 'S' DISPLAY LIKE 'E'.
* ENDIF.
* lv_error = 'X'.
* EXIT.ENDTRY.IF lo_message IS NOT INITIAL. " XI casel_pro_t = lo_message->getheaders( ).ASSIGN l_pro_t->* TO FIELD-SYMBOL(<fs1>).ENDIF.IF lo_message IS NOT INITIAL. " XI casel_pro_t = lo_message->getbodies( ).
* ASSIGN l_pro_t->* TO FIELD-SYMBOL(<fs1>).ASSIGN l_pro_t->* TO <fs1>.ENDIF.LOOP AT <fs1> INTO l_pro_s.IF l_pro_s-lcname = cl_xms_manifest=>lcname.l_manifest ?= l_pro_s-prop.l_mf_t = l_manifest->get_payload_refs( ).LOOP AT l_mf_t INTO l_mf_s.
* CLEAR ls_resource.l_resource = lo_message->getattachmentbyname( l_mf_s-href ).DATA(lv_xpayload) = l_resource->getbinarydata( ).DATA(conv) = cl_abap_conv_in_ce=>create( input = lv_xpayload ).conv->read( IMPORTING data = lv_payload len = DATA(len) ).ev_payload = lv_payload.ev_xpayload = lv_xpayload.ENDLOOP.ENDIF.ENDLOOP.ENDMETHOD.
2.2 定义保存PI LOG method
METHOD save_log.DATA:lv_msgid TYPE sxmsmguid,ls_stu TYPE zsab0001.lv_msgid = ms_intf_log-msgid.IF lv_msgid IS INITIAL.RETURN.ENDIF.*// 获取时间戳ls_stu = zcl_pubfm=>get_usrdt( ).*// 获取返回报文GUIDDATA(lt_msglist) = cl_xms_persist=>read_nested_msg( im_msgguid = lv_msgid ).DATA(ls_xiheader) = VALUE sxmsmsglst_sorted( ).DATA(ls_xiheader_ref) = VALUE sxmsmsglst_sorted( ).LOOP AT lt_msglist INTO DATA(ls_msglist).IF ls_msglist-ref_to_msg IS INITIAL.ls_xiheader = ls_msglist.ELSE.ls_xiheader_ref = ls_msglist.ENDIF.ENDLOOP.ms_intf_log-refmsgid = ls_xiheader_ref-msgguid. "返回报文GUID"时间戳ms_intf_log-cname = ls_stu-cname.ms_intf_log-datum = ls_stu-datum.ms_intf_log-uzeit = ls_stu-uzeit.ms_intf_log-timestamp = ls_stu-timestamp.*// 获取XML报文"获取PI 发送/接收报文
* lv_msgid = ms_intf_log-msgid.zcl_pi_utility=>get_payload(EXPORTINGiv_msgid = lv_msgidiv_mandt = sy-mandtIMPORTINGev_payload = DATA(lv_payload)ev_xpayload = DATA(lv_xpayload) ).ms_intf_log-content = lv_payload."获取PI 返回报文IF ms_intf_log-refmsgid IS NOT INITIAL.lv_msgid = ls_xiheader_ref-msgguid.CLEAR lv_payload.CLEAR lv_xpayload.zcl_pi_utility=>get_payload(EXPORTINGiv_msgid = lv_msgidiv_mandt = sy-mandtIMPORTINGev_payload = lv_payloadev_xpayload = lv_xpayload ).ms_intf_log-recontent = lv_payload. "返回报文ENDIF.IF ms_intf_log-recontent IS INITIAL.ms_intf_log-recontent = mv_recontent. "返回报文ENDIF.*// 写入数据库MODIFY ztfi_intf_log FROM ms_intf_log.COMMIT WORK.*// 清空变量FREE ms_intf_log.FREE mv_recontent.ENDMETHOD.
method get_usrdt.
if if_crud is initial.
rv_stru-cname = sy-uname.
rv_stru-datum = sy-datum.
rv_stru-uzeit = sy-uzeit.
rv_stru-timestamp = date2tsp( ).
else.
rv_stru-uname = sy-uname.
rv_stru-aedat = sy-datum.
rv_stru-aezet = sy-uzeit.
rv_stru-timestamp_upd = date2tsp( ).
endif.
endmethod.
进站获取PI Message ID method:
METHOD GET_MSGID_INBOUND.
DATA:lo_protocol TYPE REF TO if_wsprotocol_message_id,
lo_server_context TYPE REF TO if_ws_server_context.
"进站获取ABAP PROXY - GET MESSAGE ID - INBOUND
TRY.
lo_server_context = cl_proxy_access=>get_server_context( ).
lo_protocol ?= lo_server_context->get_protocol( if_wsprotocol=>message_id ).
message_id = lo_protocol->get_message_id( ).
CATCH cx_ai_system_fault.
ENDTRY.
ENDMETHOD.
转XML
METHOD tr2_xml.
TRY.
CALL TRANSFORMATION id
OPTIONS value_handling = 'MOVE' "防止内表中有N类型dump
SOURCE data = data
RESULT XML mv_recontent.
CATCH cx_root INTO DATA(lo_root) .
ENDTRY.
ENDMETHOD.
3. 在需要业务端口调用保存PI LOG
如财务付款单PI接口或资金,凭证等其他接口
通过付款单作为业务单据号保存
zcl_fi_intf_log=>init_intf_log( is_intf_log = VALUE #( ywdj = <ls_impt>-payorder-fkdnr
msgid = lv_pi_msgid_out_raw
itfid = 'EASPAYMENTORDER4ZJ'
mssgt = lv_msgt ) ).
zcl_fi_intf_log=>save_log( ).
如凭证信息接口保存:
DATA lv_message_id TYPE sxmsmguid. " PI日志添加到自建表
lv_message_id = zcl_fi_intf_log=>get_msgid_inbound( ).
LOOP AT is_input-i_request-message-header INTO DATA(ls_header).
zcl_fi_intf_log=>init_intf_log( is_intf_log = VALUE #( ywdj = ls_header-zbkpfid
msgid = lv_message_id
itfid = 'PI1022_DOCUMENT_DATA'
mssgt = '经营性凭证数据传输到ICP接口[ZPI1022]' ) ).
zcl_fi_intf_log=>tr2_xml( data = es_output-e_response-returnstatus ).
zcl_fi_intf_log=>save_log( ).
ENDLOOP.
4. 定义PI报文查询报表
5. 自定义PI报文定期清理日志功能
************************************************************************
* TRANSATION ID :
* PROGRAM TITLE : ZFID_DELETE_LOG
* AUTHOR :
* SUPPLIER :
* DATE :
* DEVELOPMENT ID : ZFID_DELETE_LOG
* CHANGE REQUEST (CTS) :
* DESCRIPTION :
*=======================================================================
* COPIED FROM : (CLONED PROGRAM)
* TITLE : (PROGRAM TITLE)
* OTHER RELATED OBJ : (OBJECT NAMES)
*=======================================================================
* CHANGE HISTORY LOG
*-----------------------------------------------------------------------
* MOD. NO.| DATE | NAME | CORRECTION NUMBER | CHANGE REFE
*-----------------------------------------------------------------------
* MOD-001 |YYYY.MM.DD| XXXXXXXXXXXXXX | XXXXXXXXXX | XXXXXXXXXX
*
* DESCRIPTION:
*-----------------------------------------------------------------------
* MOD-002 |YYYY.MM.DD| XXXXXXXXXXXXXX | XXXXXXXXXX | XXXXXXXXXX
*
* DESCRIPTION:
************************************************************************
REPORT zfid_delete_log MESSAGE-ID 00 NO STANDARD PAGE HEADING.
*---------------------------------------------------------------------*
* TABLES
*---------------------------------------------------------------------*
TABLES rsrd1.
*---------------------------------------------------------------------*
* SELECTION-SCREEN
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS s_tab FOR rsrd1-tbma_val OBLIGATORY.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT 1(79) TEXT-002.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT 1(79) TEXT-003.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT 1(79) TEXT-004.
SELECTION-SCREEN END OF BLOCK blk.
*---------------------------------------------------------------------*
* INITIALIZATION
*---------------------------------------------------------------------*
INITIALIZATION.
*---------------------------------------------------------------------*
* AT SELECTION-SCREEN
*---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*---------------------------------------------------------------------*
* START-OF-SELECTION
*---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_process_logic.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_LOGIC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_process_logic .
DATA:lr_tabname TYPE RANGE OF tabname,
lr_datum TYPE RANGE OF datum,
lv_datum TYPE datum,
lv_where TYPE string.
*// 定期删除日志配置表
SELECT * INTO TABLE @DATA(lt_ztfi_config_log) FROM ztfi_config_log WHERE disabled = '' AND tabname IN @s_tab.
IF lt_ztfi_config_log IS INITIAL.
MESSAGE '表ZTFI_CONFIG_LOG未找到配置' TYPE 'S' DISPLAY LIKE 'E'.
REJECT.
ENDIF.
*// 若存在配置表中代码未指定表,则报错。目的防止误删除。
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0462' ) ). "财务业务接口日志表
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0382' ) ). "EAS接口传输记录-日志表
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI_INTF_LOG' ) ). "财务PI接口日志
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI_STATUS_LOG' ) ). "财务单据-状态修改记录表
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI1241_LOG' ) ). "作业ZFID1241ICP推送凭证信息到影像系统日志表
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0023_AUT_LOG' ) ). "付款单自动签收日志表
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0480_LOG' ) ). "ICP抽取IDP银行行号数据-推送外围系统日志
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0077_BG_LOG' ) ). "ZFID025_02地物产值自动预提需求后台执行日志
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0490' ) ). "账套主数据修改记录
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI0492' ) ). "退款凭证未生成及房源启用标识更新日志表
lr_tabname = VALUE #( BASE lr_tabname ( sign = 'I' option = 'EQ' low = 'ZTFI_PRO_UPD_LOG' ) ). "付款单中项目分期和项目公司更新函数日志表
DATA(lt_temp) = lt_ztfi_config_log.
DELETE lt_temp WHERE tabname IN lr_tabname.
IF lt_temp IS NOT INITIAL.
WRITE:/ '执行失败:'.
LOOP AT lt_temp INTO DATA(ls_temp).
WRITE:/ '表',ls_temp-tabname,'未在代码指定不允许删除。'.
ENDLOOP.
RETURN.
ENDIF.
*// 根据配置条件删除
LOOP AT lt_ztfi_config_log INTO DATA(ls_ztfi_config_log).
CASE ls_ztfi_config_log-tabname.
WHEN 'ZTFI0382'.
PERFORM frm_delete_ztfi0382 USING ls_ztfi_config_log.
CONTINUE.
WHEN 'ZTFI_INTF_LOG'.
PERFORM frm_delete_ztfi_intf_log USING ls_ztfi_config_log.
CONTINUE.
ENDCASE.
CLEAR lv_datum.
CLEAR lr_datum.
CLEAR lr_datum[].
CLEAR lv_where.
"计算日期
lv_datum = sy-datum - ls_ztfi_config_log-zdays.
lr_datum = VALUE #( ( sign = 'I' option = 'LE' low = |{ lv_datum }| ) ).
"删除条件
lv_where = |{ ls_ztfi_config_log-filed_cond } IN LR_DATUM|.
TRY.
DELETE FROM (ls_ztfi_config_log-tabname) WHERE (lv_where).
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
DATA(lv_msg) = |表 { ls_ztfi_config_log-tabname }-{ ls_ztfi_config_log-filed_cond } <={ lv_datum },数据已删除成功,条目数{ sy-dbcnt }。|.
WRITE:/ lv_msg.
CATCH cx_root INTO DATA(oref).
DATA(text) = oref->get_text( ).
WRITE:/ '表',ls_ztfi_config_log-tabname,'删除失败&&',text.
ENDTRY.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_ZTFI0382
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LS_ZTFI_CONFIG_LOG text
*----------------------------------------------------------------------*
FORM frm_delete_ztfi0382 USING VALUE(ls_ztfi_config_log) TYPE ztfi_config_log.
DATA:lr_bizdate TYPE RANGE OF ztfi0382-bizdate.
DO.
lr_bizdate = VALUE #( ( sign = 'E' option = 'CP' low = |*{ sy-datum(4) }*| ) ).
SELECT * INTO TABLE @DATA(lt_ztfi0382)
FROM ztfi0382 UP TO 500000 ROWS
WHERE bizdate IN @lr_bizdate.
IF lt_ztfi0382 IS INITIAL.
EXIT.
ENDIF.
LOOP AT lt_ztfi0382 INTO DATA(ls_ztfi0382) WHERE bizdate CS sy-datum(4).
DATA(lv_tabix) = sy-tabix.
DELETE lt_ztfi0382 INDEX lv_tabix.
ENDLOOP.
DELETE ztfi0382 FROM TABLE lt_ztfi0382.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
DATA(lv_msg) = |表 { ls_ztfi_config_log-tabname }-{ ls_ztfi_config_log-filed_cond } <={ sy-datum(4) - 1 }1231,数据已删除成功,条目数{ sy-dbcnt }。|.
WRITE:/ lv_msg.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_ZTFI0382
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LS_ZTFI_CONFIG_LOG text
*----------------------------------------------------------------------*
FORM frm_delete_ztfi_intf_log USING VALUE(ls_ztfi_config_log) TYPE ztfi_config_log.
DATA:lr_datum TYPE RANGE OF ztfi0382-bizdate,
lv_datum TYPE datum,
lv_where TYPE string.
"计算日期
lv_datum = sy-datum - ls_ztfi_config_log-zdays.
lr_datum = VALUE #( BASE lr_datum ( sign = 'I' option = 'LE' low = |{ lv_datum }| ) ).
"删除条件
lv_where = |{ ls_ztfi_config_log-filed_cond } IN LR_DATUM AND ITFID EQ '{ ls_ztfi_config_log-itfid }'|.
DELETE FROM ztfi_intf_log WHERE (lv_where).
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
DATA(lv_msg) = |表 { ls_ztfi_config_log-tabname }-{ ls_ztfi_config_log-filed_cond } <={ lv_datum },接口编号{ ls_ztfi_config_log-itfid },数据已删除成功,条目数{ sy-dbcnt }。|.
WRITE:/ lv_msg.
ENDFORM.