被很多人吐槽的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