現場符號

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 即使在離開迴圈後仍保持分配狀態。如果要安全地重複使用它們,請立即取消分配。