Hi 大家好
今天來介紹ABAP中稍微進階一點的技術Field Symbol
Field Symbol 是一種指向內存位置的指標(類似於 C 語言中的指標)。它不會存儲實際資料,而是引用一個內存地址,指向其他變量或內表中的某一行或字段。讓使用者動態操作內存中的資料,而不用複製資料到另一個變數。
DATA: my_var TYPE i VALUE 100.
FIELD-SYMBOLS: <fs_var> TYPE i. "定義Field symbol
ASSIGN my_var TO <fs_var>. " 將 my_var 綁定到 Field Symbol
WRITE: / <fs_var>. " 輸出 Field Symbol 的值
在這個例子中,<fs_var> 被分配到變量 my_var,所以當你使用 <fs_var> 時,實際上是在操作 my_var 的內存。
提高性能:使用 Field Symbol 處理資料時,不需要複製資料,比使用工作區複製更有效率。特別是在處理大量資料時,Field Symbol 可以提升程式性能。
動態訪問內存:Field Symbol 可以在程式執行時動態分配和操作變數或內表中的資料行。
內表行操作效率高:當你要遍歷內表並修改數據時,使用 ASSIGNING 和 Field Symbol 比單純使用工作區和 LOOP AT INTO 更高效。
#定義Field Symbol 的方式
FIELD-SYMBOLS: <fs_var> TYPE i. "跟定義一般變數一樣指定數據類型
FIELD-SYMBOLS: <fs_var> TYPE any . "不指定數據類型
FIELD-SYMBOLS: <fs_var> TYPE any table . " 定義為內表類型
一般的assign如同上面的範例
ASSIGN my_var TO <fs_var>. " 將 my_var 綁定到 Field Symbol
ASSIGN TABLE FIELD (dobj) to <fs_var>.
ASSIGN COMPONENT comp of STRUCTURE struc to <fs_var>."分配結構體struc內的comp欄位到Field Symbol
情境:內表中包含多筆訂單,每筆訂單有訂單號碼、業務員和訂單金額。我們用 Field Symbol 遍歷內表,根據業務員姓名來動態調整訂單金額(例如,對特定業務員提供 10% 折扣)。
TYPES: BEGIN OF ty_order,
vbeln TYPE char10, " 訂單號碼
sales TYPE char10, " 業務員姓名
netwr TYPE p DECIMALS 2, " 訂單金額
END OF ty_order.
DATA: it_orders TYPE TABLE OF ty_order WITH EMPTY KEY. " 定義內表
DATA: wa_order TYPE ty_order. " 定義工作區
FIELD-SYMBOLS: <fs_order> TYPE ty_order. " 定義 Field Symbol
" 填充內表
wa_order-vbeln = '00001'.
wa_order-sales = 'John'.
wa_order-netwr = 1000.
APPEND wa_order TO it_orders.
wa_order-vbeln = '00002'.
wa_order-sales = 'Alice'.
wa_order-netwr = 2000.
APPEND wa_order TO it_orders.
wa_order-vbeln = '00003'.
wa_order-sales = 'John'.
wa_order-netwr = 1500.
APPEND wa_order TO it_orders.
wa_order-vbeln = '00004'.
wa_order-sales = 'Bob'.
wa_order-netwr = 3000.
APPEND wa_order TO it_orders.
" 使用 Field Symbol 遍歷內表並動態修改數據
LOOP AT it_orders ASSIGNING <fs_order>.
" 給名為 'John' 的業務員提供 10% 折扣
IF <fs_order>-sales = 'John'.
<fs_order>-netwr = <fs_order>-netwr * 0.9.
ENDIF.
" 顯示修改後的結果
WRITE: / '訂單號碼:', <fs_order>-vbeln,
' 業務員:', <fs_order>-sales,
' 訂單金額:', <fs_order>-netwr.
ENDLOOP.
如果是不用Field Symbol 的寫法
data wa_order type ty_order. "定義工作區
LOOP AT it_orders into wa_order.
IF wa_order-sales = 'John'.
wa_order-netwr = wa_order-netwr * 0.9.
ENDIF.
modify it_orders from wa_order .
endloop.
雖然看起來程式碼沒有多很多,
但每次loop都多了資料複製到工作區,
再從工作區搬回去的動作,
在處理大量資料時就會影響到程式的效能!
以上就是今天的分享