1. 背景
有时我们想控制ABAP代码在UPDATE TASK中的逻辑,例如某些逻辑执行,某些逻辑不执行。
那么,我们应该如何判断当前代码运行的环境呢?也即,怎么知道一段运行时代码是运行在当前的ABAP session中,还是运行在update session中呢?
2. 解决方案
要识别这个场景,需要使用到ABAP的系统类CL_SYSTEM_TRANSACTION_STATE
, 它提供了一系列的系统级别的方法,以返回当前SAP LUW状态。
系统类类
CL_SYSTEM_TRANSACTION_STATE
是与SAP LUW概念紧密绑定在一起的一个服务类
,他会直接调用ABAP Kernel
返回对应的信息。
CL_SYSTEM_TRANSACTION_STATE
类描述正在运行的事务的当前状态,其对应方法的含义如下:
- 如果事务正在进行本地(UPDATE LOCAL)或远程更新(IN UPDATE TASK),方法
GET_INUPDATE_TASK( )
返回值1,否则返回值为0。 - 如果为事务开启了本地更新( SET UPDATE TASK LOCAL ),方法
GET_UPDATE_TASK_LOCAL( )
返回值1。否则返回值为0。 - 如果事务正在PERFORM … ON COMMIT或PERFORM … ON ROLLBACK注册的子程序中执行,方法
GET_ON_END_OF_TRANSACTION( )
返回值1,否则返回值为0。 - 如果事务正在PERFORM … ON COMMIT注册的子程序中执行,方法
GET_ON_COMMIT( )
返回值1,否则返回值为0。 - 如果事务正在PERFORM … ON ROLLBACK注册的子程序中执行,方法
GET_ON_ROLLBACK( )
返回值1。在回滚。否则返回值为0。 - 方法
GET_SAP_LUW_KEY( )
返回一个唯一标识当前SAP-Transaction的键值,这个键值在事务的对话框部分和更新部分都是相同的。
因此,借助此系统类,可以轻易地完成对于程序运行环境的判断。例如,判断代码是否是在UPDATE TASK的Session中执行的程序如下:
IF cl_system_transaction_state=>get_in_update_task( ) = 1.WRITE 'Update task is active'.
ELSE.WRITE 'Update task is inactive'.
ENDIF.
3. 小结
本文介绍了ABAP程序中的一个系统类CL_SYSTEM_TRANSACTION_STATE,通过此类,可以识别出程序在当前SAP LUW状态。