Hi 大家好
今天要來介紹內表以及結構的各種操作,
幾乎所有的ABAP程式都是圍繞這兩種概念在開發的,
只要能清楚理解今天分享的概念就離成為一個厲害的ABAPER不遠了!
之前的分享有介紹到內表是我們可以在程式內定義的TABLE,
只有在這支程式裡面可以使用。
先從結構講起,
結構:定義了我們要存放的資料有哪些欄位,不是實際存放資料的地方
舉例:今天公司想要蒐集員工的資料,而人資說發公告說要蒐集的有姓名、年齡、入職時間、部門
公告這件事就是定義結構,
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 ITAB.
CLEAR ITAB[]. "加個括弧就可刪除表身
清空內表的表身資料
REFRESH ITAB.
釋放內表的記憶體,但不清除表的資料
FREE ITAB.
資料都拋入內表中,想要讓資料根據某個欄位排序時可以用SORT語法
SORT ITAB descending."降冪排列
SORT ITAB ASCENDING " 生冪排列
SORT ITAB BY Column . "依照某的欄位排序可以用by
將資料插入到內表的特定位置。你可以指定插入的行號,也可以插入到內表的開頭
INSERT wa INTO itab. "插入到內表的開頭。
INSERT wa INTO itab INDEX 2. " 插入到第二行。
將資料追加到內表的末尾,內表的行數會自動增加
APPEND wa TO itab. — 將工作區中的資料追加到內表末尾。
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
以上是今天的分享!