首页
学习
活动
专区
圈层
工具
发布

每日5分钟,学习一个 ABAP 冷门知识点 (7):ABAP 里百分号 % 的三大使用场景

本系列之前的文章:

到底哪些单词不能作为 ABAP 透明表名称使用?

聊聊 ABAP 里感叹号 ! 的用法

ABAP 内表也能用 SELECT 来读取了?

ABAP 里的问号操作符

ABAP 里星号 * 的十种用法

星号在 ABAP 中的十大应用场景之补充:搜索和字符串操作

星号在 ABAP 中的十大应用场景之补充:代码自动补全(Code Completion)

特殊符号 # 在 ABAP 世界中的四种用法

今天咱们来聊聊百分号 %.

在 SAP ABAP 编程世界中,百分号 % 虽然不像加号、星号那样频繁出现在代码里,但它仍然在不同版本的 ABAP 语言和 SAP 系统的多个场景中扮演着独特角色。

从早期 R/3 到最新的 S/4HANA,以及 ABAP CDS 等技术框架中,我们都会遇到 % 符号的身影。

下面这些 % 在 ABAP 中的用法,你都知道几种呢?

1. ABAP 变量命名符号

在面向过程的 ABAP 编程上下文中,开发者可以使用包括百分号在内的特殊字符作为变量或类型名称的起始字符。

这种命名虽然不常见,但在语法上是被允许的。

DATA: %1 TYPE string VALUE 'ss'.

然而,随着 ABAP Objects 的引入,ABAP 命名规则变得更严格。

在 ABAP Objects 环境下,标识符必须以字母或下划线开头,不再允许以百分号等特殊符号起头。

换言之,在类、方法、属性等 ABAP OO 对象中,% 不再是合法的名称首字符。

这一改变反映了 ABAP 语言朝现代编程规范的演进:使用非常规符号命名被视为不良实践。

笔者之前的文章曾经详细介绍过到底哪些字符是 ABAP 变量命名的合法字符,大家可以参照下表来阅读文章:

那些令人哭笑不得,看了想揍人的 ABAP 变量命名方式,强烈不推荐

2. ABAP 底层系统程序中的内部变量

历史上,SAP 自身也曾经在底层系统程序中以百分号开头命名变量、类型等符号,用于表示内部或系统级的对象。

这意味着,以 % 起头往往暗示「SAP 系统保留」或「SAP 底层实现」性质的元素。

至今为止,ABAP 开发人员仍能在某些 SAP 标准对象中看到百分号命名遗留的痕迹。

下面是一些例子。

笔者特殊符号 # 在 ABAP 世界中的四种用法提到的 CL_ABAP_CHAR_UTILITIES,其常量属性值全部以 % 开头。

又比如 ABAP 应用层 与底层 ABAP 内核交互的机制中,存在一个隐藏的数据类型 %_C_POINTER,其名称同样以百分号和下划线起始。

这种类型用于保存与 C 语言指针等长的内存地址,在 ABAP 调用 C 内核方法时扮演桥梁作用,在笔者这篇文章有详细介绍:

SAP ABAP 里的隐藏数据类型:%_c_pointer

SE38 打开系统级报表 <REPINI>,能看到大量的 module 和 subroutine 均以 % 前缀来命名。

这些以 % 打头的类型和变量,一般的 ABAP 应用开发「不会」直接使用,而是SAP 内部保留的实现细节,它们的命名方式体现了系统、特殊和底层的意味。

3. ABAP Open SQL 查询中的通配符

在 ABAP 编程中,最常见的 % 用法之一,是在数据库查询的字符串模式匹配中充当通配符。

ABAP Open SQL 遵循标准 SQL 语法,使用 % 表示任意长度的字符序列,用 _ 下划线表示单个任意字符。

https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenwhere_logexp_like.htm

这与许多数据库的通配符规则相同。例如,条件 WHERE NAME LIKE 'SMITH%' 将匹配所有名称以 SMITH 开头的记录;而 LIKE 'M_HN' 则可以匹配 MAHN、MCHN 等第二个字母任意,但首字母为 M、剩余尾部字母为 HN 的字符串。

需要区分的是,Open SQL 内使用 % 和 _ 作为通配符仅针对数据库字符串匹配。

在 ABAP 其他上下文(例如字符串操作、内存过滤)中,并不使用 % 表示通配含义,而是采用 ABAP 自身的通配符语法。

例如,在纯 ABAP 逻辑中,判断一个字符串是否符合某模式可以使用运算符 CP(Cover Pattern).

CP 模式下,星号 * 表示任意长度字符串,加号 + 表示单个字符。这与 SQL 语法有所区别。

关于星号在 ABAP 中的用法大全,请参阅笔者这篇文章:

需要指出,当使用 % 做模糊查询时,性能取决于底层数据库对 LIKE 的优化情况和索引使用情况。

如果一个模式以 % 开头(例如 LIKE '%ABC'),数据库通常无法使用前导匹配索引,会进行全表扫描。

因此在设计查询时,应尽量避免完全以通配符起头的模式。

另外,Open SQL 对某些特殊情况做了优化,例如条件 field LIKE '%'(即仅一个 % 通配整个字符串)在经过数据库接口处理后,会被直接判断为恒真,而不会真的对每条记录做逐个匹配。

以上行为记录在下面这篇 SAP 官网帮助文档中:

这一优化细节在一般查询中不需特别考虑,但了解其存在有助于理解系统行为。

大家还知道 ABAP 其他关于 % 的用法吗?欢迎评论区补充。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OZFuC5P76zqYVmq-Tx8lrRRQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券