内表與結構體基本類似,它同樣是程式運作中被臨時建立的一個存儲空間,它是一個可包含多條記錄的資料表。
内表共有3種類型:
1)Standard:标準表
2)Sorted:排序表
3)Hashed:哈希表,一般用的比較少
本篇檔案将重點介紹Standart型内表的定義及功能
1.内表的定義
通過關鍵字DATA對内表進行建立,内一的定義可以直接參考結構體或者其它内表及透明表,也可以直接定義字段,其中關鍵字如下:
UNIQUE|NON-UNIQUE:指定關鍵字,隻能應用于排序表或者哈希表。
INITIAL SIZE n:指定初始化内表大小。
WITH HEADER LINE:定義内表是否有表頭。
具體定義有以下幾種方式:
DATA <内表名> TYPE <結構類型> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。
DATA <内表名> LIKE TABLE OF <内表或者透明表> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。
DATA BEGIN OF itab OCCURS n,
......
END OF itab [VALID BETWEEN f1 AND f2]。
FOR EXAMPLE:
TABLES:USER21. “參考某一透明表時,必須先引用定義。類型于C#的USING。
TYPES:BEGIN OF EMP,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
ADDR LIKE USER21-ADDRNUMBER,
END OF EMP。
*參考該結構定義一個初始化大小為10,并且有HEADER LINE的内表
DATA:EMPTAB TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE.
*參考上例已建立内表,重新定義大小為20并且沒有HEADER LINE的内表
DATA:EMPTAB2 LIKE STANDARD TABLE OF TMPTAB INITIAL SIZE 20.
*該方法定義初始化值為10,并有HEADER LINE的内表
DATA:EMPTAB3 LIKE EMPTAB OCCURS10.
*定義一個排序表,以NAME為關鍵字,該内表中NAME字段資料不能重複
DATA:EMPTAB4 LIKE SORTED TABLE OF EMPTAB WITH UNIQUE KEY NAME INITIAL SIZE 10 WITH HEADER LINE.
*定義一個初始化大小為0的哈希表
DATA:EMPTAB5 LIKE HASHED TABLE OF EMPTAB WITH UNIQYE KEY NAME WITH HEADER LINE.
通過第三種方式定義的内表可指定具體字段及初始化大小,預設内表存在HEADER LINE。
TABLES:USER21.
TYPES:BEGIN OF EMP OCCURS 0,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
ADDR LIKE USER21-ADDRNUMBER,
END OF EMP.
2.内表的指派
上面曾介紹過,内表分為有無HEADER LINE兩種。對于有HEADER LINE的内表,可以通過填充HEADER LINE資料後或通過外部的Work Area向内表存儲空間中追加資料,相關文法如下:
APPEND (<work area> into) <ITAB>.
FOR EXAMPLE:
TABLES:USER21.
DATA:BEGIN OF EMP OCCURES 0,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
ADDR LIKE USER21-ADDRNUMBER,
END OF EMP.
EMP-NAME='JERY'.
EMP-TELNUM='010-123888'.
EMP-ADDR='BEIJING'.
APPEND EMP. "資料被賦給内表HEADER LINE後再APPEND到表中最後一行。
對于沒有HEADER LINE的内表,隻能通表外部WORK AREA來傳遞資料,如下所示:
DATA:BEGIN OF EMPTAB,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
ADDR LIKE USER21-ADDRNUMBER,
END OF TMPTAB.
DATA:EMP LIKE STANDART TABLE OF EMPTAB.
EMP-NAME='JERY'.
EMP-TELNUM='010-123888'.
EMP-ADDR='BEIJING'.
APPEND EMPTAB TO EMP. ”資料被賦給WORK AREA後再APPEND到表中。
除了上述的指派方式外,還可以通過OPEN SQL将資料表中的資料按條件查詢後放入内表中,對于OPEN SQL的具體用法,将後在後面介紹。
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
ADDR LIKE USER21-ADDRNUMBER,
SELECT BNAME AS NAME PERSNUMBER AS TELNUM ADDRNUMBER AS ADDR
INTO TABLE EMP FROM USER21. "通過OPEN SQL将從資料表中抓取的資料直接複制給内表。
3.内表資料管理
1.内表的清空
對内表資料的清空共包括4種模式
CLEAR <ITAB>:僅清空HEADER LINE,對内表資料存儲空間不影響。
REFRESH <ITAB>:清空内表資料存儲空間,對HEADER LINE不影響。
REFRESH <itab> FROM TABLE <dbtab>:清空内表存儲空間,填充從資料庫表所獲資料。
FREE <ITAB>:清空内表資料存儲空間,對HEADER LINE不影響。
FOR EXAMPLE:
TABLES:USER21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
ADDR LIKE USER21-ADDRNUMBER,
SELECT BNAME AS NAME PERSNUMBER AS TELNUM ADDRNUMBER AS ADDR INTOTABLE EMP FROM USER21.
USER21-BNAME='JERY'.
REFRESH EMP FROM TABLE USER21. "清除EMP的存儲空間,并從USER21中查找資料填充到内表。
2.INSERT(向内表插入資料)
可以按内表的具體字段向表中插入一行或者多行資料,具體文法如下:
INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx].
INSERT [wa INTO|INITIAL LINE INTO] TABLE itab.
INSERT LINES OF itab1 [FROM idx] [TO idx2] INTO itab2 [INDEX idx3].
DATA:BEGIN OF EMP OCCURS 0,
DATA:EMPTAB1 LIKE EMP.
DATA:EMPTAB2 LIKE EMP OCCURS 10.
EMP='JERY'.
INSERT EMP INDEX 1."若内表有多行資料,該語句将新記錄新增到第一行。
EMPTAB1='TOM'.
INSERT EMPTAB1 INTO TABLE EMP. “将結構體中資料新增到内表
SELECT BNAME AS NAME INTO TABLE EMPTAB2 FROM USER21.
INSERT LINES OF EMPTAB2 FROM 10 INTO EMP."将資料表EMPTAB2從第10行開始的所有資料插入到表EMP中。
3.MODIFY(直接修改内表資料)
按内表位置或者具體内表字段值相等條件修改内表資料。
MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1...fn] WHERE cond.
FOR EXAMPLE:
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
END OF EMP.
SELECT BNAME AS NAME PERSNUMBER AS TELNUM INTO TABLE EMP FROM USER21.
EMP-TELNUM='010-888888'.
MODIFY EMP INDEX 1."修改内表第一行資料為設定值
EMP-TELNUM='0755-888888'.
*查找内表中NAME等于TOM的資料,并按設定修改其TELNUM字段,有多行值時會同時修改。
MODIFY EMP TRANSPORTING TELNUMBER WHERE NAME='TOM'.
4.COLLECT(内表資料分類彙總)
将内表中相同的字段合并,若有類型為I的字段,則将其值加總。
COLLECT [wa INTO] itab.
FOR EXAMPLE:
TYPES:BEGIN OF COMPANY,
NAME(20) TYPE C,
SALES TYPE n,
ENF OF COMPANY.
DATA:COMP TYPE COMPANY,COMPTAB TYPE COMPANY OCCURS 0.
COMP-NAME = 'MOBILE'. COMP-SALES = 10. COLLECT COMP INTO COMPTAB.
COMP-NAME = 'NOTEBOOK'. COMP-SALES = 20. COLLECT COMP INTO COMPTAB.
COMP-NAME = 'MOBILE'.COMP-SALES = 30.COLLECT COMP INTO COMPTAB.
5.SORT(内表資料排序)
對内表進行排序,可以指定具體的排序字段、排序方式(升/降),文法如下:
SORT itab [BY f2 f2...fn] [ASCENDING/DESCENDING]
6.READ(讀取)
依據具體行數或字段值等條件讀取某一内表的資料。
READ TABLE itab FROM wa.
READ TABLE itab WITH [TABLE] KEY k1=v1...kn=vn [BINARY SEARCH].
READ TABLE itab INDEX i.
使用READ操作的表必須的HEADER LINE作為查找出的資料存儲視窗,BINARY SEARCH 可以提高内表資料查找的速度,但是使用前必須先對内表進行排序。
7.LOOP....ENDLOOP(循環讀取内表資料)
循環讀取内表資料,在循環中使用系統變量SY-TABIX可擷取目前所執行的行數。
LOOP AT ITAB FROM n1 TO n2.:讀取内表具體行數間資料。
LOOP AT ITAB WHERE logexp.:按具體字段條件讀取内表。
TABLES:USER21.
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
SELECT BNAME AS NAME PERSNUMBER AS TELNUM INTO TABLE EMP FROM USER21.
*讀取内表的1-10行資料。
LOOP AT EMP FROM 1 TO 10.
WRITE:EMP.
ENDLOOP.
*按NAME條件讀取内表。
LOOP AT EMP WHERE NAME='JERY'.
WRITE:EMP.
ENDLOOP.
8.AT...ENDAT(設定内表循環觸發條件)
該文法為事件控制函數,應用于LOOP循環語句中,用于擷取内表的資料變化事件。
AT NEW f.:當某個字段資料與上一行資料值不同時觸發該事件。
AT END OF f.:當内表中某個字段目前行值與下一行值不同時觸發該事件。
AT FIRST.:當執行内表第一行時觸發該事件。
AT LAST.:當執行内表最後一行時觸發該事件。
9.AT..DELETE(删除内表資料)
DELETE TABLE itab WITH TABLE KEY k1=v1...kn=vn.:按具體值删除。
DELETE TABLE itab [FROM wa].:參照其它内表值删除。
DELETE itab INDEX idx.:删除具體行資料。
DELETE itab FROM idx1 TO idx2.:删除具體行數範圍間資料。
DELETE ADJACENT DUPLICATES FROM itab.:删除重複資料,執行此條件前必須先排序。
10.DESCRIBE(擷取内表的具體屬性)
DESCRIBE TABLE itab LINES n:擷取内表目前總行數,n為整型。
DESCRIBE TABLE itab OCCURS n:擷取内表初始化行數,n為整形。
DESCRIBE TABLE itab KIND K.:擷取内表類型:T:Standard,S:SORTED,H:HASHED。
DATA:N1 TYPE I,N2 TYPE I,K TYPE C.
DATA:BEGIN OF EMP OCCURS 10,
NAME LIKE USER21-BNAME,
TELNUM LIKE USER21-PERSNUMBER,
DESCRIBE TABLE EMP LINES N1. ”表中無資料,回執為0
DESCRIBE TABLE EMP OCCURS N2. “表初始化大小為10,回執為10
DESCRIBE TABLE EMP KIND K. ”預設為STANDARD表,回執為T