ABAP 指针

举报
雨绸缪 发表于 2023/05/26 17:58:59 2023/05/26
【摘要】 FIELD-SYMBOLS 定义在 ABAP 编程中 FIELD-SYMBOLS 使用非常广泛,类似于指针,可以指代任何变量。FIELD-SYMBOLS 是现有数据对象(或现有数据对象的一部分)的占位符或符号名称,由语句 FIELD-SYMBOLS 声明。内存区域在程序运行时分配给 FIELD-SYMBOLS。字段符号,顾名思义,就是“符号”。 换句话说,它是一个类似于链接或快捷方式的图像...

FIELD-SYMBOLS 定义

在 ABAP 编程中 FIELD-SYMBOLS 使用非常广泛,类似于指针,可以指代任何变量。

FIELD-SYMBOLS 是现有数据对象(或现有数据对象的一部分)的占位符或符号名称,由语句 FIELD-SYMBOLS 声明。内存区域在程序运行时分配给 FIELD-SYMBOLS。

字段符号,顾名思义,就是“符号”。 换句话说,它是一个类似于链接或快捷方式的图像,指向其他变量、结构和内部表。它是指向数据对象(例如变量或结构)的符号

FIELD-SYMBOLS不会像数据对象那样在程序的数据区域中保留物理空间。相反,它用作内存区域的动态名称,特定数据对象或对象的一部分位于该内存区域中。可以在语句的操作数位置使用字段符号代替数据对象。当执行这种类型的语句时,必须在处理内部表时通过语句 ASSIGN 或添加 ASSIGNING 为 FIELD-SYMBOLS 分配内存区域。

FIELD-SYMBOLS几乎可以指向任何数据对象。FIELD-SYMBOLS 等同于使用 ->* 取消引用的数据引用变量。与数据引用变量不同,值语义用于访问字段符号访问字段符号就像访问命名数据对象(或对象的一部分)。然而,对于数据引用变量,引用语义适用。

语法格式

FIELD-SYMBOLS 的实现既用于数据对象的通用工作,也用于数据对象的显式转换。

语法格式:

FIELD-SYMBOLS: <fs_tab> type standard table,

                             <fs_wa> type mara.

当不输入 <type> 时,<fs> 继承赋给它的变量的所有属性

当输入 <type> 时,赋给它的变量必须与 <fs> 同类型。

FIELD-SYMBOLS: <F1>.
    
DATA : DAT(8) VALUE '20221222'.
ASSIGN DAT TO <F1>.
WRITE:/ <F1>.

注意,这里定义了 <f1> 之后,使用 assign .. to .. ,将变量分配给内部字段<f1>,这时 <f1> 才继承了 DAT 日期类型的属性及值。

又比如:

DATA: var TYPE i VALUE 2.
FIELD-SYMBOLS: <fs_num> TYPE i.
ASSIGN var TO <fs_num>.
WRITE: / <fs_num>.
<fs_num> = 4.
WRITE: / var.

输出: 2 和 4.

分配指针

Field-Symbols 默认是 unassigned,这意味着它们指向什么都没有。如果访问未分配的 Field-Symbol 将导致异常,如果未被捕获,将导致短转储。因此,应该在使用前用 IS ASSIGNED 检查状态:

IF <FS_EXAMPLE> IS ASSIGNED.
**Your code
ENDIF.

因为它们只是引用,所以内部不能存储真实资料。因此,在每种使用情况下都需要声明 DATA。


DATA: w_name  TYPE string VALUE `Max`,
      w_index TYPE i      VALUE 1.
 
FIELD-SYMBOLS <fs_name> TYPE any.

ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'.        "Changes to <fs_name> now also affect w_name

* As <fs_name> is generic, it can also be used for numbers

ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.    
ADD 1 TO <fs_name>.          "w_index gets incremented by one

取消分配

有时重置 Field-Symbol 会很有用。这可以使用 UNASSIGN 来完成。

UNASSIGN <fs>.
* Access on <fs> now leads to an exception again

用于内表

Field-Symbols 可用于修改內表。

LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
    wa-name = 'Leo'. 
ENDLOOP.    

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
    <fs>-name = 'Leo'. 
ENDLOOP.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。