欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > SAP PI接口自定义监控应用

SAP PI接口自定义监控应用

2025/5/6 12:04:44 来源:https://blog.csdn.net/woniu_maggie/article/details/146095147  浏览:    关键词:SAP PI接口自定义监控应用

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.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词