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