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.

效果展示:

SAP的PI日志查看工具详解编程语言

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/18662.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论