iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
佛心分享-IT 人自學之術

從0開始的ABAP之旅 系列 第 13

Day13 ABAP進階 學會Field symbol沒有人敢把你當菜雞

  • 分享至 

  • xImage
  •  

Hi 大家好
今天來介紹ABAP中稍微進階一點的技術Field Symbol

什麼是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 可以提升程式性能。

  • 動態訪問內存: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如同上面的範例

ASSIGN my_var TO <fs_var>.  " 將 my_var 綁定到 Field Symbol

分配表的欄位到 Field Symbol

ASSIGN TABLE FIELD (dobj) to <fs_var>.

分配結構體的欄位到 Field Symbol

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都多了資料複製到工作區,
再從工作區搬回去的動作,
在處理大量資料時就會影響到程式的效能!

以上就是今天的分享/images/emoticon/emoticon29.gif


上一篇
Day12 內表VS工作區VS結構 ! 一次搞懂內表怎麼玩
下一篇
Day14 ABAP中的第三種呼吸 Module pool
系列文
從0開始的ABAP之旅 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言