• SAP的PI日志查看工具


    被很多人吐槽的SAP PI能坚挺的活下来,真是不容易。。。

    SXI_MONITOR是PI的标准的消息查看器,如果又权限的话,甚至可以做自定义字段的查询增强(如果对单据创建接口,增加单号。。。速度杠杠的)

    SXI_MONITOR为什么不好呢,一是不直观,东西太多,太复杂了。二呢就是展示消息太麻烦了,这让很多人深恶痛绝。

    下面说一下PI日志的几个表:

    SXMSPEMAS——Integration Engine: Enhanced Message Queue (Master) 队列消息的框架信息,包含发送接收方的接口名字,命名空间,系统等。
    SXMSPMAST——Integration Engine: Message Queue (Master) 队列消息的主要信息,包含了用户啊,开始结束时间等等。

    SXMSCLUR——XMB: Resources Cluster 消息报文

    下面上代码:(随便写写的,有不当的地方可以自行完善)

    REPORT ZLYLOG123.
    DATA:V_DA TYPE SXMSCLUR.
    DATA LT_BIN_CONTENT     TYPE SDOKCNTBINS.
    DATA:V_TAB TYPE TABLE OF XSTRING,
         W_TAB TYPE XSTRING.
    TYPES:BEGIN OF TY_SHOW,
            OBJECT_ID TYPE CRMT_PO_NUMBER_SOLD,
            MSGTYPE   TYPE C,
            OB_SYSTEM TYPE AIT_SNDR,
            OB_NS     TYPE RM_OIFNS,
            OB_NAME   TYPE RM_OIFNAME,
            IB_SYSTEM TYPE AIT_RCVR,
            IB_NS     TYPE RM_IIFNS,
            IB_NAME   TYPE RM_IIFNAME,
            MSGINFO   TYPE CHAR100,
            IXML      TYPE STRING,
            OXML      TYPE STRING,
          END OF TY_SHOW,
          BEGIN OF TY_DETAIL,
            MSGGUID    TYPE SXMSMGUID,
            PID        TYPE SXMSPID,
            MSGTYPE       TYPE SXMSPMTYPE,
            MSGSTATE   TYPE    SXMSPMSTAT,
            QOSMODE    TYPE SXMSQOS,
            SENDTIMEST TYPE    TIMESTAMPL,
            REF_TO_MSG TYPE    SXMSMGUID,
            OB_SYSTEM  TYPE AIT_SNDR,
            OB_NS      TYPE RM_OIFNS,
            OB_NAME    TYPE RM_OIFNAME,
            IB_SYSTEM  TYPE AIT_RCVR,
            IB_NS      TYPE RM_IIFNS,
            IB_NAME    TYPE RM_IIFNAME,
          END OF TY_DETAIL.
    DATA:IM_CLUSTKEY TYPE  SXMSCLUSTKEY,
         EX_RES      TYPE  SXMSREST,
         EX_XRES     TYPE  SXMSXREST,
         EW_XRES     TYPE SXMSXRESS,
         EX_NS       TYPE  SXMSNST,
         IM_MANDT    TYPE  SYMANDT,
         WA_CLUR     TYPE SXMSCLUR,
         GV_FROM     TYPE TIMESTAMPL,
         GV_TO       TYPE TIMESTAMPL,
         GT_SHOW     TYPE TABLE OF TY_SHOW,
         GW_SHOW     LIKE LINE OF GT_SHOW,
         GT_LOG      TYPE TABLE OF ZCRMTVSLOG,
         GW_LOG      TYPE ZCRMTVSLOG,
         GT_DETAIL   TYPE TABLE OF TY_DETAIL,
         GW_DETAIL   LIKE LINE OF GT_DETAIL.
    DATA:GT_FIELDCAT TYPE LVC_T_FCAT.
    DATA GS_FIELDCAT LIKE LINE OF GT_FIELDCAT.
    DATA LS_LAYOUT TYPE LVC_S_LAYO.
    DATA:RESULT TYPE STRING.
    DATA:LV_B TYPE I,
         LV_E TYPE I,
         LV_L TYPE I.
    
    TABLES:SXMSPEMAS.
    
    DEFINE APPEND_FIELDCAT .
      CLEAR GS_FIELDCAT.
      GS_FIELDCAT-FIELDNAME = &1.
      GS_FIELDCAT-SCRTEXT_L = &2.
      GS_FIELDCAT-OUTPUTLEN = &3.
      GS_FIELDCAT-NO_ZERO = &4.
      APPEND GS_FIELDCAT TO GT_FIELDCAT.
    END-OF-DEFINITION.
    *table:SXMSPEMAS 接口信息
    
    SELECTION-SCREEN:BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001.
    SELECT-OPTIONS:S_SEND FOR SXMSPEMAS-OB_SYSTEM.
    SELECT-OPTIONS:S_OBNS FOR SXMSPEMAS-OB_NS.
    SELECT-OPTIONS:S_OBNAME FOR SXMSPEMAS-OB_NAME.
    SELECT-OPTIONS:S_IEND FOR SXMSPEMAS-OB_SYSTEM.
    SELECT-OPTIONS:S_IBNS FOR SXMSPEMAS-OB_NS.
    SELECT-OPTIONS:S_IBNAME FOR SXMSPEMAS-OB_NAME.
    SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (31) TEXT-CM7 FOR FIELD EXEDATE.
    PARAMETERS: EXEDATE TYPE SY-DATUM.
    SELECTION-SCREEN COMMENT 46(2) TEXT-CM9 FOR FIELD EXETIME.
    PARAMETERS: EXETIME  TYPE SY-UZEIT.
    SELECTION-SCREEN END OF LINE.
    SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (31) TEXT-CM8 FOR FIELD EXE2DATE.
    PARAMETERS: EXE2DATE  TYPE SY-DATUM.
    SELECTION-SCREEN COMMENT 46(2) TEXT-CM9 FOR FIELD EXE2TIME.
    PARAMETERS: EXE2TIME  TYPE SY-UZEIT.
    SELECTION-SCREEN END OF LINE.
    SELECTION-SCREEN END OF BLOCK BLK01.
    
    
    INITIALIZATION.
      IF EXETIME IS INITIAL.
        EXEDATE = SY-DATLO.
        IF SY-TIMLO < 010000.
          EXEDATE = EXEDATE - 00000001.
        ENDIF.
        EXETIME = SY-TIMLO - 003600.
      ENDIF.
      IF EXE2DATE IS INITIAL.
        EXE2DATE = SY-DATLO + 00000001.
      ENDIF.
    
    
    
    START-OF-SELECTION.
      "优先查询logb表记录,然后再拼接时间戳否则按时间戳查询
    *  IF S_NOBJ IS NOT INITIAL OR S_OBJ IS NOT INITIAL OR S_TYPE IS NOT INITIAL.
    *    SELECT SINGLE * INTO GW_LOG FROM ZCRMTVSLOG WHERE NEW_OBJECT_ID IN S_NOBJ AND OBJECT_ID IN S_OBJ AND PROCESS_TYPE IN S_TYPE.
    *    IF GW_LOG-UZEIT < '000059'.
    *      GW_LOG-UZEIT = '000000'.
    *    ELSEIF GW_LOG-UZEIT > '235900'.
    *      GW_LOG-UZEIT = '235900'.
    *    ELSE.
    *      GW_LOG-UZEIT = GW_LOG-UZEIT - 60.
    *    ENDIF.
    *    CONVERT DATE GW_LOG-DATUM TIME GW_LOG-UZEIT INTO TIME STAMP GV_FROM TIME ZONE SY-ZONLO.
    *    GW_LOG-UZEIT = GW_LOG-UZEIT + 120.
    *    CONVERT DATE GW_LOG-DATUM TIME GW_LOG-UZEIT INTO TIME STAMP GV_TO TIME ZONE SY-ZONLO.
    *  ELSE.
    * EXE timestamp (UTC) supplied: Convert to date/time in local user timezone:
      IF EXEDATE IS NOT INITIAL.
        CONVERT DATE EXEDATE TIME EXETIME INTO TIME STAMP GV_FROM TIME ZONE SY-ZONLO.
      ENDIF.
    * EXE TO timestamp (UTC) supplied: Convert to date/time in local user timezone:
      IF EXE2DATE IS NOT INITIAL.
        CONVERT DATE EXE2DATE TIME EXE2TIME INTO TIME STAMP GV_TO TIME ZONE SY-ZONLO.
      ENDIF.
    
    *  ENDIF.
      "get mast data from SXMSPMAST
      SELECT
            SXMSPMAST~MSGGUID
            SXMSPMAST~PID
            SXMSPMAST~MSGTYPE
            SXMSPMAST~MSGSTATE
            SXMSPMAST~QOSMODE
            SXMSPMAST~SENDTIMEST
            SXMSPMAST~REF_TO_MSG
            SXMSPEMAS~OB_SYSTEM
            SXMSPEMAS~OB_NAME
            SXMSPEMAS~IB_SYSTEM
            SXMSPEMAS~IB_NAME
        INTO TABLE GT_DETAIL
        FROM SXMSPMAST
        INNER JOIN SXMSPEMAS
        ON SXMSPMAST~MSGGUID = SXMSPEMAS~MSGGUID
        AND SXMSPMAST~PID = SXMSPEMAS~PID
        WHERE SXMSPMAST~SENDTIMEST BETWEEN GV_FROM AND GV_TO AND SXMSPMAST~MSGTYPE = 'S' AND SXMSPMAST~PID = 'RECEIVER'
        AND   SXMSPEMAS~OB_SYSTEM IN S_SEND
        AND   SXMSPEMAS~OB_NS IN S_OBNS
        AND   SXMSPEMAS~OB_NAME IN S_OBNAME
        AND   SXMSPEMAS~IB_SYSTEM IN S_IEND
        AND   SXMSPEMAS~IB_NS IN S_IBNS
        AND   SXMSPEMAS~IB_NAME IN S_IBNAME
        .
      SORT GT_DETAIL BY REF_TO_MSG.
      LOOP AT GT_DETAIL INTO GW_DETAIL.
        CLEAR:EX_RES[],EX_XRES[],EX_NS[],WA_CLUR.
        IM_CLUSTKEY-MSGGUID = GW_DETAIL-MSGGUID.
        IM_CLUSTKEY-PID     = GW_DETAIL-PID.
        IM_MANDT = 300.
        "导入XML各项数据
        IMPORT LT_RES  TO EX_RES LT_XRES TO EX_XRES LT_NS TO EX_NS FROM DATABASE SXMSCLUR(IS) TO WA_CLUR CLIENT IM_MANDT ID IM_CLUSTKEY.
        "读取XML报文
        READ TABLE EX_XRES INTO EW_XRES INDEX 1.
        IF SY-SUBRC = 0.
    
          "XML报文解码
          RESULT = CL_ABAP_CODEPAGE=>CONVERT_FROM(
              SOURCE      = EW_XRES-RESCONTENT ).
          SEARCH RESULT FOR '<OBJECT_ID>'.
          IF SY-SUBRC = 0.
            LV_B = SY-FDPOS + 11.
            SEARCH RESULT FOR '</OBJECT_ID>'.
            IF SY-SUBRC = 0.
              LV_E = SY-FDPOS.
              LV_L = LV_E - LV_B.
              GW_SHOW-OBJECT_ID = RESULT+LV_B(LV_L).
              GW_SHOW-IXML = RESULT.
            ENDIF.
          ENDIF.
        ENDIF.
        "读取报文对应的返回报文
        READ TABLE GT_DETAIL INTO GW_DETAIL WITH KEY REF_TO_MSG = GW_DETAIL-MSGGUID.
        IF SY-SUBRC = 0.
          DELETE GT_DETAIL WHERE MSGGUID = GW_DETAIL-MSGGUID.
          CLEAR:EX_RES[],EX_XRES[],EX_NS[],WA_CLUR.
          IM_CLUSTKEY-MSGGUID = GW_DETAIL-MSGGUID.
          IM_CLUSTKEY-PID     = GW_DETAIL-PID.
          IM_MANDT = 300.
          MOVE-CORRESPONDING GW_DETAIL TO GW_SHOW.
          "导入各项数据
          IMPORT LT_RES  TO EX_RES LT_XRES TO EX_XRES LT_NS TO EX_NS FROM DATABASE SXMSCLUR(IS) TO WA_CLUR CLIENT IM_MANDT ID IM_CLUSTKEY.
          "读取XML报文
    "      *******************定制字段内容***************
          READ TABLE EX_XRES INTO EW_XRES INDEX 1.
          IF SY-SUBRC = 0.
            "XML报文解码
            RESULT = CL_ABAP_CODEPAGE=>CONVERT_FROM(
                SOURCE      = EW_XRES-RESCONTENT ).
            SEARCH RESULT FOR '<MSGTYPE>'.
            IF SY-SUBRC = 0.
              LV_B = SY-FDPOS + 9.
              SEARCH RESULT FOR '</MSGTYPE>'.
              IF SY-SUBRC = 0.
                LV_E = SY-FDPOS.
                LV_L = LV_E - LV_B.
                GW_SHOW-MSGTYPE = RESULT+LV_B(LV_L).
              ENDIF.
            ENDIF.
            SEARCH RESULT FOR '<MSGINFO>'.
            IF SY-SUBRC = 0.
              LV_B = SY-FDPOS + 9.
              SEARCH RESULT FOR '</MSGINFO>'.
              IF SY-SUBRC = 0.
                LV_E = SY-FDPOS.
                LV_L = LV_E - LV_B.
                GW_SHOW-MSGINFO = RESULT+LV_B(LV_L).
              ENDIF.
            ENDIF.
            GW_SHOW-OXML = RESULT.
            APPEND GW_SHOW TO GT_SHOW.
          ENDIF.
    "      *******************定制字段内容***************
        ELSE.
          APPEND GW_SHOW TO GT_SHOW.
        ENDIF.
        CLEAR:GW_SHOW.
      ENDLOOP.
    
      REFRESH GT_FIELDCAT.
      LS_LAYOUT-CWIDTH_OPT    = 'X'. "优化列宽选项是否设置
      LS_LAYOUT-ZEBRA                = 'X'.
    *  ls_layout-box_fname        = 'SEL'.
      APPEND_FIELDCAT:'OBJECT_ID'             '单号'              35   'X',
                      'MSGTYPE'             '接口结果'              1000   'X',
                      'MSGINFO'             '返回消息'              1000   'X',
                      'OB_SYSTEM'           '发送系统'              20     'X',
                      'OB_NS'               '发送命名空间'          40     'X',
                      'OB_NAME'             '发送接口名称'          40     'X',
                      'IB_SYSTEM'           '接收系统'              20     'X',
                      'IB_NS'               '接收命名空间'          40     'X',
                      'IB_NAME'             '接收接口名称'          40     'X',
                      'IXML'             '传入XML报文'              1000   'X',
                      'OXML'             '返回XML报文'              1000   'X'.
    
    
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          I_CALLBACK_PROGRAM       = SY-REPID
          I_CALLBACK_PF_STATUS_SET = 'PRM_SET_STATUS'
          I_CALLBACK_USER_COMMAND  = 'PRM_USER_COMMAND'
          IS_LAYOUT_LVC            = LS_LAYOUT
          IT_FIELDCAT_LVC          = GT_FIELDCAT[]
    *     I_GRID_TITLE             = LV_TITLE
          I_DEFAULT                = 'X'
          I_SAVE                   = 'A'
        TABLES
          T_OUTTAB                 = GT_SHOW
        EXCEPTIONS
          PROGRAM_ERROR            = 1
          OTHERS                   = 2.
      IF SY-SUBRC <> 0.
      ENDIF.
    
    FORM PRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
      SET PF-STATUS 'ZSTAT'.
    ENDFORM.
    FORM PRM_USER_COMMAND USING P_UCOMM    LIKE SY-UCOMM
                            P_SELFIELD TYPE SLIS_SELFIELD.
    
      CHECK P_UCOMM = '&IC1'.
    
      READ TABLE GT_SHOW INTO GW_SHOW INDEX P_SELFIELD-TABINDEX.
      IF SY-SUBRC = 0.
        DATA: LDO_XML TYPE REF TO CL_XML_DOCUMENT.
        DATA: LDF_SUBRC TYPE SYSUBRC.
    
    * 创建XML对象
        LDO_XML = NEW CL_XML_DOCUMENT( ).
        IF P_SELFIELD-FIELDNAME = 'IXML'.
          LDF_SUBRC = LDO_XML->PARSE_STRING( GW_SHOW-IXML ).
        ELSEIF P_SELFIELD-FIELDNAME = 'OXML'.
          LDF_SUBRC = LDO_XML->PARSE_STRING( GW_SHOW-OXML ).
        ELSE.
          CHECK 1 = 2.
        ENDIF.
    
        IF LDF_SUBRC = 0.
          LDO_XML->DISPLAY( ).
        ELSE.
    *      MESSAGE S000 WITH '解析XML失败!' DISPLAY LIKE 'E'.
    *      PERFORM FRM_SHOW_STRING USING IM_XML.
        ENDIF.
    
        CLEAR LDO_XML.
      ENDIF.
    ENDFORM.

    效果展示:

  • 相关阅读:
    什么是重构,什么不是重构
    Sql Server Merge 关键字 一个条语句实现增删改查
    SQLServer查询一天时间内的数据
    数据库索引原理 二
    重构代码时的7个阶段
    “旁观者效应”是如何毁掉我们的代码
    ClassNotFoundException: org.apache.storm.kafka.spout.KafkaSpoutConfig
    Flume+Kafka整合使用
    SLF4J: Detected both log4joverslf4j.jar AND bound slf4jlog4j12.jar on the class path
    Could not find or load main class org.apache.flume.tools.GetJavaProperty
  • 原文地址:https://www.cnblogs.com/sapSB/p/12157681.html
Copyright © 2020-2023  润新知