现场符号

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 即使在离开循环后仍保持分配状态。如果要安全地重复使用它们,请立即取消分配。