大数跨境
0
0

ABAP 里星号 * 的十种用法

ABAP 里星号 * 的十种用法 思创湾
2025-06-19
0
图片


在大多数编程语言里,星号 " * " 的最基础作用之一,就是用来执行四则运算中的乘法运算。


当然,在 JavaScript 和 TypeScript 这些上手容易,但是很难精通的编程语言里," * " 不出意外地能够玩出很多花活。


比如 JavaScript 的生成器语法(function* 与 yield*).


JavaScript 在关键字 function 之后紧跟星号,可声明生成器函数。调用该函数会返回一个实现迭代器协议的 Generator 对象。


yield* 语法用于将控制权委托给另一个可迭代对象或生成器,实现逻辑拼装与流水线。


看个例子:


functionnumbers() {  yield 1;  yield 2;}
functionwrapper() {  yield 0;  yieldnumbers(); // 委托  yield 3;}
for (const n of wrapper()) {  console.log(n); }


执行上面这段代码,生成器对象 wrapper 会依次生成 0,1,2,3 四个整数:



模块系统:import * as 与 export * from


  • import * as:将被导入文件内的所有对象,导入并整合到单一命名空间对象,方便消费者使用「统一的名称」进行消费。

  • export * from:将文件内的所有对象进行导出。


看一个例子。


utils.js 文件里定义两个简单的 function:


export const add = (x, y) => x + y;export const sub = (x, y) => x - y;


math.js 将 utils 的全部对象用星号进行导出,此外再导出一个 pi 常量。


export * from './utils.js';    export const pi = 3.14159;


app.js 作为消费者,将 math.js 导出的对象,全部导入;使用 as 定义别名 math, 这样接下来可以用 math. 来消费这些导入对象


import * as math from './math.js';console.log(math.add(34));    // 7console.log(math.pi);           // 3.14159


再来看 ABAP 编程语言和 ABAP 系统里的星号用法,根据笔者 18 年的 ABAP 开发经历,想到以下这几种。


1. 注释


JavaScript 里使用 /* 和 */ 来注释代码块。ABAP 使用行首的星号来注释代码。


2. OPEN SQL 里的字段列表通配符


在 ABAP 的 Open SQL 查询中,星号常用作字段列表的通配符,表示选取所有字段。


例如,SELECT * FROM scarr INTO TABLE lt_scarr 将从表 SCARR 中选择所有列并放入内表 lt_scarr.


这里 * 充当通配符,简化了列名的书写,相当于列出了该表的每个字段,类似 JavaScript 里的 import * 和 export *.


星号还用于 COUNT(*) 聚合函数以统计记录数。


SELECT * 会一次性读取整行数据,这可能导致不必要的 I/O 和数据传输开销,尤其对于像 BSEG 这样字段很多的宽表而言。


SAP 官方建议尽量仅选择实际业务需要的列,而非盲目使用 SELECT *.


3. 解构引用操作符(De-reference operator)


看个例子:


DATA: lr TYPE REF TO int4.CREATE DATA lr.ASSIGN lr->* TO FIELD-SYMBOL(<data>).<data> = 2.WRITE:/ lr->*.


上面的代码会打印 2.


在 ABAP 中,数据引用(Data Reference)是一种指向运行时动态分配数据对象(如 int4、String、自定义结构等)的特殊变量类型。


使用 DATA lr TYPE REF TO int4 声明后,lr 就是一个数据引用,它并不直接存储整型数值,而是通过后续语句 CREATE DATA lr 来动态分配一块大小为 int4 的内存,并将其地址写入 lr.


Field Symbol 则类似于 C 语言里的指针或 C++ 的引用,是 ABAP 中的一种动态别名工具。


通过 ASSIGN lr->* TO FIELD-SYMBOL(<data>) 将 lr 指向的实际内存空间,分配给一个 Field Symbol,之后对 `<data>` 的操作就等同于直接访问该数据对象本身。


解除引用操作符 ->* 可用于将类型为 REF TO XXX 的引用变量的值(即该引用所指向内存)取出,从而访问其实际值或内部组件。 


4. SAPGUI 里的字段遮罩掩码标识符


Field Masking(字段遮罩)功能是一种基于 SAP GUI 界面层的数据保护解决方案,主要针对敏感字段进行掩码处理,使未获得授权的用户无法看到敏感数值,这些敏感数据会显示为字段遮罩掩码 *.


授权用户仍可查看原始值。


Field Masking 通过一系列配置与角色授权机制实现,能够在不改动数据库底层数据的前提下,实现对界面展示的动态过滤与掩码;同时配合字段访问追踪(Field Access Trace)能够记录用户对敏感字段的访问情况,以满足审计与合规性需求。


字段遮罩在实际业务场景中可应用于隐藏客户个人信息、财务金额、薪资信息等各种需要保护的敏感数据。


SAP 官网地址:

https://help.sap.com/docs/FIELD_MASKING_FOR_SAP_GUI/7a0e56f44f62457fbae43e834256cc3a/a01ece64357f4c028cbe0127a0f5b8f5.html



5. ABAP 权限控制领域的 Full Authorization(完全授权),谨慎使用!


SAP 官网提到,在编辑 ABAP Authorization 时,对S_TCODE, S_START 这些 Authorization Object 进行维护时,谨慎使用 " * ", 因为这意味着 Full Authorization 即完全权限的分配:



6. SAP Query 里的 overflow 标志


SAP 帮助文档提到,在 SAP Query 里对某列进行求和操作时,如果该列用于显示 total 值的 output length 不够长,ABAP 会在受影响的值前面加上星号,以提示数据溢出的问题。


https://help.sap.com/doc/saphelp_nw74/7.4.16/en-us/4e/56898907564f49e10000000a42189e/frameset.htm



7. 不同货币单位的金额不能简单求和


SAP Business By Design 和 SAP Cloud for Customer 后台均基于 ABAP,笔者也参与过这两个 SAP 产品的研发工作。


在浏览器里使用这两个产品的报表开发工具时,在某些时候会看到某些字段值显示为星号。


根据 SAP Note 2502994 介绍,系统显示星号是有意为之的行为,例如基于 Customer BO 创建报表时,用户试图显示每个 Customer 对应的所有 Opportunities 的金额之和。



显然货币单位不同,则金额无法直接做求和操作。此时要么进行货币转换配置(Currency Conversion), 要么将货币单位也作为 Report 的 characteristic 之一,让报表基于每种货币单位分别进行求和。


8. 作为 ABAP 变量名


* " 可以作为 ABAP 变量名的一部分或者全部使用,但仅限在 ABAP 报表编程上下文里使用,无法在 ABAP 类中使用。

下面的代码会打印 1 * 2 的结果 2.


不过我想没有谁会在项目代码里使用这种命名方式吧,肯定会挨打。



9. ABAP 已废弃语法的一部分


看下面这段代码:


DATA: itab(10) OCCURS 20 WITH HEADER LINE.APPEND '1' TO itab.APPEND '2' TO itab.WRITE:/ boolc( itab[] = itab-*sys* ).


执行代码,打印 abap_true 即 X.


  • itab(10):itab为内表名,(10) 表示内表单行定长 10 字节的 C 类型字段。

  • OCCURS 20:给内表初始分配 20 行的内存存储空间,不限制最终行数。这种早期语法始于 SAP R/2 时代,那时内存拮据,需要显式预估内表容量。沧海桑田,几十年之后的如今,内存早就白菜价了,ABAP 开发不再需要这种小家子气的写法。

  • WITH HEADER LINE:给内表声明一个附带的 Header Line,这是一个与表同名的结构化工作区,也称隐式工作区。Header Line 既可当作工作区被 APPEND、CLEAR、LOOP AT 等语句读写,也可在表达式中被隐式引用,因此容易与实际表体 itab[] 混淆,引发逻辑缺陷。因此,SAP 官方文档在 ABAP OO 语境里已将其标记为过时语法。


https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abensys_table_body.htm


itab[] 用于标识内表去除 Header Line 之后的 Body 内容。



itab[] 同 itab-*sys* 完全等价,二者都是时代的弃儿,禁止在 ABAP 类的上下文里使用。



10. SAPGUI 里的模糊查找


比如 SE16 里的查询,用星号表示匹配一个或者多个字符,用来实现模糊查找。



匹配结果:



本文罗列了笔者所知的 ABAP 里星号的十种使用场景。如果大家发现有遗漏的场景,欢迎在评论区补充。






思创湾·SAP(中国)科创赋能中心,是 SAP 与上海市静安区人民政府、市北高新集团联合打造,由市北高新聚能湾创新创业中心运营,面对科技企业的创新赋能平台。平台集创新、孵化、赋能、交流、服务于一体,通过科技创新与产业赋能双轮驱动,为创业者和科创企业赋能转型注入数字新活力。


图片


图片

【声明】内容源于网络
0
0
思创湾
思创湾,是SAP与上海市静安区人民政府、市北高新集团联合打造,由市北高新聚能湾创新创业中心运营,面对科技企业的创新赋能平台。平台集创新、孵化、赋能、交流、服务于一体,通过科技创新与产业赋能双轮驱动,为创业者和科创企业赋能转型注入数字新活力。
内容 126
粉丝 0
思创湾 思创湾,是SAP与上海市静安区人民政府、市北高新集团联合打造,由市北高新聚能湾创新创业中心运营,面对科技企业的创新赋能平台。平台集创新、孵化、赋能、交流、服务于一体,通过科技创新与产业赋能双轮驱动,为创业者和科创企业赋能转型注入数字新活力。
总阅读38
粉丝0
内容126