被很多人吐槽的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.
转自:https://www.cnblogs.com/sapSB/p/12157681.html