抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

之前在写BDC批量导入笔记的时候,遇到了需要通过代码读取Session日志相关的内容。最后研究了一下发现主要是通过APQIAPQLE这两个数据库获取日志信息。所以此处记录一下读取的过程。

代码读取Session日志信息

一、SM35界面与数据库表间关系

通常我们是通过SM35去查看Session日志信息的。图片内容如下所示:

1.SM35事务码界面

选择想要查看的日志,双击进入查看该Session的日志内容。

2.Session日志界面

而我们需要获取的就是上面的两图中的信息。第一张图的信息存储在数据库表APQI中,可以从该表中查看到执行成功和失败的Message数量,以及后续关联详细Message信息的数据库表APQLE的主键QID值。

下图是数据库表APQI根据Session Name(GROUPID)的值查找出来的Session数据。红框圈起来的部分与第一张图中的事务码、异常、成功和屏幕等信息对应。

3.APQI数据库表数据

第二张图中的详细Message信息则存放在数据库表APQLE中。通过主键QID字段确定一个Session中的所有Message内容。如下图所示。

4.APQLE数据库表数据

二、从数据库读取页面内容

1.信息获取流程

从上面的对应关系我们可以知道想要读取SM35中Session的流程是:

  • 选通过数据库表APQI的主键Group name(GROUPID),查找到自己新建的Session数据的QID
  • 通过上面的QID去数据库表APQLE中查找到自己对应事务码的Message信息

2.Group name

再通过代码创建Session会话时,会使用到下面的Function。该Function是用于打开批量输入会话的。在使用过程中需要传入一个GROUP的参数,这个参数对应的就是数据库表APQI的Group name字段。而这个Function还有一个可选的输入参数QID字段。如下图所示。在这里拿到QID的话就可以在后面直接去数据库表APQLE中拿到该Session的Message内容了。

5.OPEN GROUP参数介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
FORM OPEN_GROUP .
*--------------------------Variables-----------------------------------*
CONSTANTS:
LC_GROUP TYPE C LENGTH 12 VALUE 'INTERNAL_ORD'.
DATA:
LV_HOLDDATE TYPE SY-DATUM,
LV_USER TYPE C LENGTH 12.
*----------------------------Logic-------------------------------------*
LV_USER = SY-UNAME.
* LV_HOLDDATE = SY-DATUM.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = LC_GROUP
HOLDDATE = LV_HOLDDATE
"' '=Delete,'X'=keep after processing
KEEP = GC_X
USER = LV_USER
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.

3.通过Group name读取Message

如果你无法直接获得QID字段,则可以通过GROUPID字段的值取到QID,然后再通过QID查询到具体的Session的Message内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
FORM GET_SESSION_STATE .
*--------------------------Variables-----------------------------------*
CONSTANTS:
LC_GROUP TYPE C LENGTH 12 VALUE 'INTERNAL_ORD'.
*----------------------------Logic-------------------------------------*
REFRESH:GT_FMESG.
SELECT MAX( M~CREDATE ) AS CREDATE, MAX( M~CRETIME ) AS CRETIME,
I~MART, I~MID, I~MNR, I~MSGV1, I~MSGV2, I~MSGV3, I~MSGV4
FROM APQI AS M
INNER JOIN APQLE AS I
ON M~QID = I~QID
INTO CORRESPONDING FIELDS OF TABLE @GT_FMESG
WHERE M~GROUPID = @LC_GROUP
AND I~TCODE = @GC_MM02
AND I~MID <> @GC_NULL
GROUP BY I~MART, I~MID, I~MNR, I~MSGV1, I~MSGV2, I~MSGV3, I~MSGV4.
IF SY-SUBRC NE 0.
"Session尚未运行完成,请等待
MESSAGE S000 WITH TEXT-E04 DISPLAY LIKE GC_E.
IF GV_RUNFLAG IS INITIAL.
GV_RUNFLAG = GC_X."仅执行一次的标记
WAIT UP TO 5 SECONDS.
PERFORM GET_SESSION_STATE.
ELSE.
"Session运行异常
MESSAGE S000 WITH TEXT-E05 DISPLAY LIKE GC_E.
EXIT.
ENDIF.
ENDIF.
ENDFORM.

4.展示Message内容

如果想要将该Message的内容使用弹框的形式展示出来,则可以考虑是下面的方式。

现将获得到的Message放入类型为ESP1_MESSAGE_TAB_TYPE的内表中,最后调用Function C14Z_MESSAGES_SHOW_AS_POPUP,将内容展示出来。

(1)内容转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
*--------------------------Variables-----------------------------------*
"全局变量定义
DATA:
BEGIN OF GS_FMESG, "Session日志的Message结构
MART LIKE APQLE-MART,
MID LIKE APQLE-MID,
MNR LIKE APQLE-MNR,
MSGV1 LIKE APQLE-MSGV1,
MSGV2 LIKE APQLE-MSGV2,
MSGV3 LIKE APQLE-MSGV3,
MSGV4 LIKE APQLE-MSGV4,
END OF GS_FMESG,
GS_MESSAGEP TYPE ESP1_MESSAGE_WA_TYPE."最后弹框展示Message的结构

DATA:
GT_FMESG LIKE TABLE OF GS_FMESG,
GT_MESSAGEP TYPE ESP1_MESSAGE_TAB_TYPE.
*----------------------------Logic-------------------------------------*
FORM SET_MESSAGE_VALUE .
CHECK GT_FMESG IS NOT INITIAL.
REFRESH: GT_MESSAGEP.
CLEAR: GS_MESSAGEP,GS_FMESG.
LOOP AT GT_FMESG INTO GS_FMESG.
GS_MESSAGEP-LINENO = SY-TABIX.
GS_MESSAGEP-MSGID = GS_FMESG-MID.
GS_MESSAGEP-MSGNO = GS_FMESG-MNR.
GS_MESSAGEP-MSGTY = GS_FMESG-MART.
GS_MESSAGEP-MSGV1 = GS_FMESG-MSGV1.
GS_MESSAGEP-MSGV2 = GS_FMESG-MSGV2.
GS_MESSAGEP-MSGV3 = GS_FMESG-MSGV3.
GS_MESSAGEP-MSGV4 = GS_FMESG-MSGV4.
INSERT GS_MESSAGEP INTO TABLE GT_MESSAGEP.
CLEAR: GS_FMESG,GS_MESSAGEP.
ENDLOOP.

FREE: GT_FMESG.
ENDFORM.

(2)调用Message弹框

1
2
3
4
5
6
7
FORM DISPLAY_RESULT .
CHECK GT_MESSAGEP IS NOT INITIAL.
CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
TABLES
I_MESSAGE_TAB = GT_MESSAGEP.
FREE: GT_MESSAGEP.
ENDFORM.

5.效果展示

(1)SM35界面

6.SM35界面Message

(2)程序Message弹框

7.程序Message弹框

评论