现场符号
Field-Symbols 是 ABAP 相当于指针,除了 Field-Symbols 总是被解引用(不可能改变内存中的实际地址)。
声明
要声明 Field-Symbol,必须使用关键字 FIELD-SYMBOLS
。类型可以是通用的(ANY [... TABLE]
)来处理各种变量。
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
分配
Field-Symbols 是声明中的 unassigned
,这意味着它们指向什么都没有。访问未分配的 Field-Symbol 将导致异常,如果未被捕获,将导致短转储。因此,应该用 IS ASSIGNED
检查状态:
IF <fs> IS ASSIGNED.
*... symbol is assigned
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-name1 = 'Max'.
ENDLOOP.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
<fs>-name1 = 'Max'.
ENDLOOP.
注意! Field-Symbols 即使在离开循环后仍保持分配状态。如果要安全地重复使用它们,请立即取消分配。