ABAP中的SET UPDATE TASK LOCAL是什么意思?


 

经常有小伙伴问,看到有些ABAP程序中,在CALL FUNCTION IN UPDATE TASK之前,会加上一步SET UPDATE TASK LOCAL,这个到底是什么意思呢?

1. 基础知识
1.1 SAP LUW
要弄清楚SET UPDATE TASK LOCAL的作用,要先了解SAP LUW这个概念,不知道的小伙伴可以先百度下。简而言之, SAP LUW (logical unit of work) 是一个逻辑业务单元,将属于同一业务单元的数据看做一个整体。在一个SAP LUW内的操作,要么一起成功,要么一起失败。这样可以确保业务逻辑数据的一致性。

注册SAP LUW的方式有下面三种:

◾ Update (bundling using function modules) 
语法:CALL FUNCTION ... IN UPDATE TASK

◾Transactional RFC (bundling using function modules) 
语法:CALL FUNCTION ... IN BACKGROUND UNIT

◾Bundling using subroutines 
语法:PERFORM ... ON COMMIT 


仅当遇到COMMIT WORK关键字是,SAP LUW内注册的内容才会真正的执行。

1.2 Internal Session
一个Session也即一个进程,SAP系统内有三种类型的进程:

DIA - 会话进程
UPD / UPD2 - 更新进程
BTC - 后台进程
SPO - Spool Request (处理打印请求)
对于注册与SAP LUW内的请求,通常是通过UPD请求处理的。也即,在会话进程DIA内,用户可能进行了若干的业务操作(例如,更新了某些业务数据),操作结束后,客户点击保存(程序中触发Commit Work),退出会话进程。

此时,从用户的角度,业务已经结束。但实际,在Commit Work触发后,系统后台会触发UPD进程,处理更新操作。

2. SAP LUW举例
下面代码是注册SAP LUW, 并触发Commit Work的一个最简单的实例:

ls_linkage-aapm_guid = cl_system_uuid=>create_uuid_x16_static( ).
CALL FUNCTION 'ZTEST_INSERT_LINKAGE' IN UPDATE TASK
  EXPORTING
    is_linkage = ls_linkage.

COMMIT WORK.
WRITE: 'done.'.


在调试器中,打开Update Debugging 模式,这样我们可以追踪到执行COMMIT WORK后,系统打开的UPD更新进程。

在这里插入图片描述 

效果入下:
在DIA进程外,会并行打开一个UPD进程来执行SAP LUW注册的内容。

在这里插入图片描述
3. SET UPDATE TASK LOCAL的作用
了解了以上的基础知识,理解SET UPDATE TASK LOCAL就非常容易啦。其实这组关键字已经很好地表达了其作业,也即 “在本进程中执行更新任务” 。

示例代码:

SET UPDATE TASK LOCAL.

ls_linkage-aapm_guid = cl_system_uuid=>create_uuid_x16_static( ).
CALL FUNCTION 'ZTEST_INSERT_LINKAGE' IN UPDATE TASK
  EXPORTING
    is_linkage = ls_linkage.

COMMIT WORK.
WRITE: 'done.'.


这段代码和之前代码的区别就在于,在注册LUW前,先声明了SET UPDATE TASK LOCAL.

这样的效果是,在执行COMMIT WORK时,并不会开启新的UPD进程来进行LUW内程序的执行,而是在本DIA进程内,顺序执行LUW的内容。

效果如下:

在注册IN UPDATE TASK时,没有任何区别,仅注册,不执行
遇到Commit Work后,在本session内,执行Function Module 内部的内容

在这里插入图片描述 

4. 小结与对比
相信通过上面的两个小例子,已经清楚地说明了SET UPDATE TASK LOCAL这组关键字的作用。下面是几点小结和对比:

SET UPDATE TASK LOCAL要声明在CALL FUNCTION IN UPDATE TASK前才会其效果
在使用SET UPDATE TASK LOCAL模式下,COMMIT WORK和COMMIT WORK AND WAIT的效果是一样的(因为顺序执行其实就是在wait 😃 )
SET UPDATE TASK LOCAL模式下只影响high-priority 的Update Function Module, 对于Low-priority 的Function Module是不起作用的,也即low-priority的update function module还是会开启新的UPD进程进行执行

在这里插入图片描述

 

以上便是对于SET UPDATE TASK LOCAL的解读,希望可以解答你的疑问。
————————————————
版权声明:本文为优快云博主「SAP-nkGavin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/nkGavinGuo/article/details/122707200

<think>好的,我现在需要回答用户关于ABAP中符号$的含义和使用场景的问题。首先,我得回忆一下自己对ABAP的了解,特别是关于$符号的部分。 用户提到的引用[2]和[4]都涉及Field Symbol,但可能和$符号无关。不过用户的问题是关于$的,所以需要先确定$在ABAP中的具体作用。我记得在ABAP中,$符号通常不是作为运算符或语法结构的一部分,而是用在其他情境中,比如字符串处理或命名约定。 首先,考虑字符串处理。在ABAP中,如果需要在字符串常量中包含引号,可以使用`'`或者`` ` ``来定义字符串,但有时候可能需要使用转义字符。不过ABAP的字符串定义是否有使用$符号的情况呢?比如,在某些情况下,使用$作为分隔符来定义字符串,比如`DATA(str) = |This is a string|`,但这里用的是竖线。不确定是否有用$的情况。 另外,可能是在正则表达式中,$符号作为行末的匹配符,比如在查找字符串末尾的模式时使用。例如,正则表达式`abc$`匹配以abc结尾的行。这在ABAP的正则表达式中应该适用,因为通常遵循通用的正则语法。 还有一种可能是,在ABAP的字段符号(Field Symbol)或数据引用中,但根据引用[2]和[4],字段符号使用`FIELD-SYMBOLS`声明,而不是$符号。因此可能不相关。 再考虑ABAP的命名规则。变量名是否允许包含$符号?通常ABAP的变量名只能包含字母、数字和下划线,且必须以字母开头,所以$符号可能不允许出现在变量名中。但可能在特定情况下,比如内部系统变量或某些特殊命名约定中使用,但不确定。 另外,可能在ABAP的宏或预处理指令中使用$符号,但ABAP的宏通常是使用DEFINE定义的,调用时使用`&macro&`的形式,可能和$无关。 再想想,ABAP中的动态语句生成,比如使用CONCATENATE或字符串操作来构建语句时,是否会用到$符号作为占位符?例如,在动态访问字段时,可能用结构体-组件名,但这里用的是连字符-,不是$。 或者,在ABAP的注释或特定注释标记中,比如版本控制或特殊标记,例如`"$表示某些内容,但这也可能因项目而异,不是语言本身的特性。 总结可能的用途: 1. 正则表达式中作为行末锚点。 2. 字符串定义中的分隔符(不太常见)。 3. 动态代码生成中的特殊符号(可能性较低)。 4. 内部系统变量或命名中的特殊符号(但ABAP变量命名不允许)。 因此,最可能的答案是,在ABAP中,$符号主要用于正则表达式中的行末匹配,或者在特定字符串处理中作为分隔符,但更常见的是正则表达式中的行末锚点。 需要验证这一点,是否有ABAP的正则表达式使用$来表示行末。例如,使用CL_ABAP_REGEX等类时,模式中的$应该匹配行末。例如: DATA(regex) = CL_ABAP_REGEX=>CREATE_PATTERN( pattern = 'abc$' ). 这会匹配以abc结尾的字符串。 此外,在ABAP中,当使用字符串模板时,可能会用到其他符号,但$可能不在此列。因此,用户的问题中,$符号的主要用途应是在正则表达式中作为行末匹配符,或者在特定情况下作为字符串分隔符,但后者较为少见。 另外,可能在ABAP的转换规则或某些特定函数模块的参数中使用$符号,但需要具体例子支持。例如,在函数模块的参数中,可能用$作为占位符,但这可能不是标准用法。 因此,回答应指出$符号在ABAP中的两种主要用途:正则表达式中的行末锚点,以及在字符串处理中作为分隔符(虽然较少见)。同时需要说明ABAP变量名不允许使用$符号,因此不会出现在变量命名中。 此外,引用文献中没有直接提到$符号,所以可能需要依赖一般ABAP知识,而不是引用中的内容。但用户提供的引用可能不涵盖这一点,所以需要明确说明这一点,并给出例子。 例如: 在正则表达式中,使用$来匹配字符串的结尾: DATA(lv_pattern) = `abc$`. MATCHER->APPLY( IV_TEXT = 'text_abc' ). 如果匹配,则说明字符串以abc结尾。 在字符串处理中,可能使用$作为分隔符,例如: DATA(lv_str) = |This is a $string$ example|. 但通常ABAP使用`或'来定义字符串,所以这种情况较少。 总结,$符号在ABAP中主要用于正则表达式中的行末锚点,帮助匹配字符串的结束位置。其他用途可能较为少见或特定于某些程序。</think>### ABAP 编程语言中 `$` 符号的含义和使用场景 在 ABAP 编程语言中,`$` 符号的用途相对特殊,主要涉及以下两类场景: --- #### 1. **正则表达式中的行末锚点** `$` 符号在正则表达式中表示**行末位置**,用于匹配字符串的结尾。例如,若需要检查字符串是否以特定字符结尾,可以在正则表达式中使用 `$`: ```abap DATA: regex TYPE REF TO cl_abap_regex, matcher TYPE REF TO cl_abap_matcher. " 创建正则表达式,匹配以 'abc' 结尾的字符串 regex = cl_abap_regex=>create_pattern( pattern = 'abc$' ). matcher = regex->create_matcher( text = 'example_abc' ). IF matcher->find( ) = abap_true. WRITE '字符串以 "abc" 结尾'. ENDIF. ``` 此例中,`abc$` 会匹配 `example_abc` 的末尾部分。需要注意的是,ABAP 正则表达式语法遵循通用规则,`^` 表示行首,`$` 表示行末。 --- #### 2. **动态字符串分隔符(较少使用)** 在某些特殊场景中,`$` 可能被用作字符串的分隔符,尤其是在需要避免与其他符号(如单引号 `'` 或双引号 `"`)冲突时。例如: ```abap DATA(lv_str) = |This is a $dynamic$ example|. ``` 不过,ABAP 更推荐使用标准的字符串分隔符(如反引号 ``` 或竖线 `|`),因此 `$` 在此类场景中并不常见。 --- #### 注意事项 - **变量命名限制**:ABAP 的变量命名规范不允许使用 `$` 符号,仅支持字母、数字和下划线[^1]。 - **与 Field Symbol 无关**:`$` 符号与 ABAP 的 Field Symbol(字段符号)无关,后者通过 `FIELD-SYMBOLS` 关键字声明,用于动态内存访问[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值