ABAP中的內表相當於其他程序設計語言中的二維數組,存儲多行結構相同的數據
不同於二維數組,內表在創建后,列結構與列數是固定不變的,而行數是動態增長的
內表支持循環對每行數據進行操作,也支持整體操作
內表是具有行和列的表結構,然而,不同於數據庫表,內表僅在程序運行期間在內存中存儲數據
ABAP中有三種內表類型:標准表,哈希表,排序表
- ABAP內表數據類型
內表數據對象是實際的內表,可以用數據進行填充
內表數據類型是用於定義內表數據對象的抽象數據類型(ADT)
可以使用的內表數據類型有:
Structure
數據庫表
用戶自定義數據類型
-ABAP內表聲明
1>
TYPES: BEGIN OF line,
field1 TYPE i,
field2 TYPE i,
END OF line.
* 聲明一個數據類型
DATA: ITAB_WA TYPE(LIKE) line. “ 聲明一個內表工作區
DATA: ITAB TYPE(LIKE) line OCCURS 0. “ 聲明一個無工作區的內表
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0. “ 聲明一個有工作區的內表
DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE.
2>
DATA: BEGIN OF line,
field1 TYPE i,
field2 TYPE i,
END OF line.
* 聲明一個line對象,該對象可以作為工作區使用
* 用DATA定義的line本身也是一個結構類型,也可再聲明一個工作區
DATA: ITAB_WA TYPE(LIKE) line. “ 聲明一個工作區
DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE. “ 聲明一個帶工作區的內表
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE . “ 聲明一個帶工作區的內表
3> 直接定義內表,這個內表是有工作區的
DATA: BEGIN OF ITAB OCCURS 0 ,
CARR1 LIKE SPFLI-CARRID,
CONN1 LIKE SPFLI-CONNID,
END OF ITAB.
* DATA: ITAB1 TYPE ITAB.(錯誤的,實踐證明,定義出來的什么都不是)。
正確方法:ITAB1 TYPE ITAB OCCURS 0.(這樣定義后的是一個無工作區的內表)。
DATA: ITAB1 LIKE ITAB OCCURS 0 WITH HEADER LINE. “定義一個帶工作區內表
4> type ref to 定義內表
type ref to 屬於ABAP中面向對象的編程。它是定義一個類的對象。
5>通過數據庫表定義
data itab1 type table of sflight . “ 定義一個不帶內表的工作區
data wa1 like line of sflgit . “ 定義一個內表工作區
data itab1 type table of sflight with header line . “定義一個帶內表的工作區
兩種內表定義方式的主要區別在於是否有隱式表頭行
內表是按行進行訪問的,然而,程序對內表的行操作不能直接進行,必須使用一種接口來傳輸,這個接口就是工作區(Work Area)
--內表操作
填充內表行
append <wa> to <itab> “ 不帶表頭行的填充
append <itab> “ 帶隱式表頭行的填充
插入內表行
insert <wa> into <itab> [INDEX idx] “
insert <itab> [INDEX idx ] “ 隱式表頭行插入內表
-- 如果沒有指定INDEX ,則默認插入到內表最后一行
讀取內表行
read <itab> into <wa> [INDEX idx]
read <itab> [INDEX IDX]
修改內表行
modify <itab> from <wa> [INDEX idx]
modify <itab> [INDEX idx]
-- read itab index 3 .
-- itab-XX = ‘xxx’ .
-- modify itab index 4 .
刪除內表行
delete <itab> [INDEX idx] .
-- 帶表頭行和不帶表頭行語法一致 。
內表循環
Loop at <itab> into <wa> .
<statement block>
endloop. “ 帶表頭行的內表循環操作
Loop at <itab> .
<statement block>
endloop. “ 不帶表頭行內表操作
-- 循環體的MODIFY,DELETE等語句不必指定INDEX項,系統默認處理當前行 .
-- 如果不需要讀取所有的內表行,可以使用WHERE選項進行限制
-- LOOP AT <itab> [WHERE <conditions>]
清空內表
clear <itab> . “清空不帶表頭行內表
clear<itab>[] . “清空帶表頭行內表
內表排序
SORT <itab> [ASCENDING | DESCENDING] [AS TEXT]
--ASCENDING和DESCENDING指定升序還是降序排列,如果不指定,缺省排序方式是升序
--AS TEXT影響字符字段的排序方式,如果不使用該選項,系統將按字符平台相應內部編碼進行排序,否則,系統根據當前語言按字母順序排序字符字段
刪除重復行
DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <comp>].
-- 刪除重復行之前須對內表進行排序
判斷內表行數
DESCRIBE TALBE <itab> LINES <count>.
將內表中部分或全部的數據行整體插入另一內表
INSERT LINES OF <itab1> [FROM n1] [TO n2] INTO [TABLE] <itab2> [INDEX <idx>].
-- insert lines of itab1 from 1 to 100 into itab2 . “ 將內表1前100行數據附加到內表2 .
-- 兩個內表必須具有相同的或可轉換的行結構
將內表中部分或全部的數據行整體填充到另一內表
APPEND LINES OF <itab1> [FROM n1] [TO n2] TO <itab2>.
按照條件或者索引刪除一組選定行
DELETE <itab> [FROM n1] [TO n2] [WHERE <condition>].
-- delete itab1 from 1 to 100 where age >30 . "刪除內表前100行中年齡大於30 的記錄 。
整體復制內表,目標內表原有內容被覆蓋
MOVE <itab1> TO <itab2> 不帶表頭行的內表之間進行復制
MOVE <itab1>[] TO <itab2>[]. 帶表頭行的內表之間進行復制
MOVE <itab1> TO <itab2>[]. 不帶表頭行的內表復制到帶表頭行的內表
MOVE-CORRESPONDING <itab1> TO <itab2> 復制內表1中與內表2具有相同結構的字段進行復制,同樣適用於工作區