iT邦幫忙

2024 iThome 鐵人賽

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

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

Day12 內表VS工作區VS結構 ! 一次搞懂內表怎麼玩

  • 分享至 

  • xImage
  •  

Hi 大家好
今天要來介紹內表以及結構的各種操作,
幾乎所有的ABAP程式都是圍繞這兩種概念在開發的,
只要能清楚理解今天分享的概念就離成為一個厲害的ABAPER不遠了!

前情提要

之前的分享有介紹到內表是我們可以在程式內定義的TABLE,
只有在這支程式裡面可以使用。

內表VS工作區VS結構

先從結構講起,
結構:定義了我們要存放的資料有哪些欄位,不是實際存放資料的地方
舉例:今天公司想要蒐集員工的資料,而人資說發公告說要蒐集的有姓名、年齡、入職時間、部門
公告這件事就是定義結構,

TYPES : BEGIN OF EMPLOYEE_DATA,
NAME TYPE C ,
AGE TYPE I ,
DATE TYPE D,
Department type c ,
end of EMPLOYEE_DATA .

工作區:參照結構定義而來的變數,可以存放一行資料
舉例:人資發了一張回條給你,只能填入你自己的姓名、年齡、入職時間、部門

DATA workarea_employee_data type EMPLOYEE_DATA .

內表:參照結構定義而來的變數,可以存放多行資料
舉例:人資發了一張表給部門,請大家填入姓名、年齡、入職時間、部門

DATA ITAB_EMPLOYEE_DATA  TYPE TABLE OF EMPLOYEE_DATA . 

DATA ITAB_EMPLOYEE_DATA  TYPE TABLE OF EMPLOYEE_DATA WITH HEADERLINE . "加上WITH HEADERLINE代表宣告一個帶有表頭的內表,表頭就等於工作區的功能

內表初始化

在拋資料進內表前通常會先將內表初始化,確保沒有我們不需要的資料

有三種不同的語法可以用 CLEAR 、 REFRESH 、FREE

CLEAR : 

如果內表帶表頭-> CLEAR只刪除表頭資料
如果內表不帶表頭->CLEAR 刪除表身資料
如果內表有代表頭又想用CLEAR刪除表身資料

CLEAR ITAB.
CLEAR  ITAB[]. "加個括弧就可刪除表身

REFRESH :

清空內表的表身資料

REFRESH ITAB.

FREE:

釋放內表的記憶體,但不清除表的資料

FREE ITAB.

內表排序

資料都拋入內表中,想要讓資料根據某個欄位排序時可以用SORT語法

SORT ITAB descending."降冪排列
SORT ITAB ASCENDING " 生冪排列
SORT ITAB BY Column . "依照某的欄位排序可以用by

想在內表中加入一行數據

ABAP 有三個語法可以做到分別是INSERT、APPEND、COLLCET

Insert

將資料插入到內表的特定位置。你可以指定插入的行號,也可以插入到內表的開頭

INSERT wa INTO itab. "插入到內表的開頭。
INSERT wa INTO itab INDEX 2. " 插入到第二行。

Append

將資料追加到內表的末尾,內表的行數會自動增加

APPEND wa TO itab. — 將工作區中的資料追加到內表末尾。

Collect

COLLECT的用法是把工作區的資料插入內表,如果內表中已經存在具有相同key的,它會將該記錄的數值進行累加。通常用於對資料進行分組並累加操作
舉例:今天內表中裝著訂單資料,欄位有訂單號碼、業務員編號、訂單金額

DATA: BEGIN OF itab OCCURS 0,
        vbeln TYPE char10,     " 訂單號碼
        sales TYPE char10,     " 業務員
        netwr TYPE p DECIMALS 2, " 訂單金額
      END OF itab.

* 插入第一筆訂單
itab-vbeln = '00001'.  " 訂單號碼
itab-sales = 'John'.   " 業務員
itab-netwr = 100.00.   " 訂單金額
COLLECT itab INTO itab.

* 插入第二筆訂單,相同業務員,訂單號不同
itab-vbeln = '00002'.
itab-sales = 'John'.
itab-netwr = 200.00.
COLLECT itab INTO itab.

* 插入第三筆訂單,不同業務員
itab-vbeln = '00003'.
itab-sales = 'Mary'.
itab-netwr = 300.00.
COLLECT itab INTO itab.

* 插入第四筆訂單,相同訂單號和業務員,訂單金額將會累加
itab-vbeln = '00001'.
itab-sales = 'John'.
itab-netwr = 50.00.
COLLECT itab INTO itab.

* 從內表讀取統計結果
LOOP AT itab.
  WRITE: / '訂單號碼:', itab-vbeln, ' 業務員:', itab-sales, ' 訂單金額:', itab-netwr.
ENDLOOP.

在上面這個例子中只有訂單號碼&業務員名稱都一樣的才會加總訂單金額

結果會像這樣

訂單號碼: 00001  業務員: John  訂單金額: 150.00
訂單號碼: 00002  業務員: John  訂單金額: 200.00
訂單號碼: 00003  業務員: Mary  訂單金額: 300.00

以上是今天的分享!


上一篇
Day 11 工程師每日任務 ABAP中的Debug介紹
系列文
從0開始的ABAP之旅 12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言