1.內表有3種類型 :

   Standard:標準表

   Sorted:排序表

   Hashed:哈希表.

 

2. 內表的定義:

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 .

例如:

TABLES: USR21."參考某一透明表時,必須先引用定義
TYPES:BEGIN OF EMP,
      NAME    LIKE  USR21-BNAME,
      TELNUM  LIKE  USR21-PERSNUMBER,
      ADDR    LIKE  USR21-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 EMPTAB INITIAL SIZE 20.

*該方法定義初始化值為10,並有HEADER LINE的內表
DATA:EMPTAB3 LIKE EMPTAB OCCURS 10.

*定義一個排序表,以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 UNIQUE KEY NAME
      WITH HEADER LINE.

3.內表的賦值

    內表分為有無HEADER LINE兩種。對於有HEADER LINE的內表,可以通過填充HEADER LINE數據後或通過外部的Work Area向內表存儲空間中追加數據,相關語法如下:

APPEND (<work area> into) <ITAB>.

    對於沒有HEADER LINE的內表,只能通表外部WORK AREA來傳遞數據,如下所示:

TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
      NAME    LIKE  USR21-BNAME,
      TELNUM  LIKE  USR21-PERSNUMBER,
      ADDR    LIKE  USR21-ADDRNUMBER,
END OF EMP.

EMP-NAME = 'jery'.
EMP-TELNUM = '010-12345678'.
EMP-ADDR = 'beijin'.

APPEND EMP."數據據被賦給內表HEADER LINE 後再APPEND 到表中最後一行.

 

   除了上面的賦值方法外,還可以通過OPEN SQL將數據表中的數據按條件查詢是後放入內表中,如下所示:

TABLES: USR21.

DATA:BEGIN OF EMP OCCURS 0,
     NAME    LIKE  USR21-BNAME,
     TELNUM  LIKE  USR21-PERSNUMBER,
     ADDR    LIKE  USR21-ADDRNUMBER,
END OF EMP.

SELECT BNAME      AS NAME
       PERSNUMBER AS TELNUM
       ADDRNUMBER AS ADDR
INTO TABLE EMP  FROM USR21."通過OPEN SQL將從數據表中抓

 

 

4.內表的清空

   內表的清空包括以下4種模式:

CLEAR  <ITAB>:僅清空HEADER LINE,對內表數據存儲空間不影響。

REFRESH <ITAB>:清空內表數據存儲空間,對HEADER LINE不影響。

PRFRESH <itab> FROM TABLE <datab>:清空內表存儲空間,填充從數據庫表所獲數據。

FREE <ITAB>

 例如:

TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
     NAME    LIKE  USR21-BNAME,
     TELNUM  LIKE  USR21-PERSNUMBER,
     ADDR    LIKE  USR21-ADDRNUMBER,
END OF EMP.

SELECT BNAME      AS NAME
       PERSNUMBER AS TELNUM
       ADDRNUMBER AS ADDR
INTO TABLE EMP  FROM USR21.

USR21-BNAME = 'SANLLY'.
REFRESH EMP FROM TABLE USR21."清空EMP的存儲空間,並從USER中查找數據填充到內表

5.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].

例如:

TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
     NAME LIKE USR21-BNAME,
END OF EMP.

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 USR21.
INSERT LINES OF EMPTAB2 FROM 10 INTO EMP."將數據表EMPTAB2從第10行開始的所有數據插入到表EMP中

6.MODIFY(直接修改內表數據)

   按內表位置或具體內表字段值等條件修改內表數據

  MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1...fn] WHERE cond.

例如:

TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
     NAME    LIKE  USR21-BNAME,
     TELNUM  LIKE  USR21-PERSNUMBER,
END OF EMP.

SELECT BNAME AS NAME
       PERSNUMBER AS TELNUM
INTO TABLE EMP FROM USR21.

EMP-NAME = 'Jery'.
EMP-TELNUM = '010-123456'.
MODIFY EMP INDEX 1."修改內表第一行數據為設定值

EMP-TELNUM = '0755-123456'.
MODIFY EMP TRANSPORTING TELNUM WHERE NAME = 'tom'."查找內表中NAME等於TOM的數據,並按設定修改其TELNUM字段,有多行值時會同時修改。

 

7.COLLECT(內表數據的分類彙總)

   將內表中相同的字段合併,若有類型為I的字段,則將其值加總。

 COLLECT [wa INTO] itab.

例如:
TYPES:BEGIN OF COMPANY,
       NAME(20) TYPE C,
       SALES    TYPE N,
END 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.

 

輸出結果:

NAME   |   SALES

MOBILE   |   40

NOTEBOOK   |   20

 

 

8.SORT(內表數據排序)

  對內表進行排序,可以指定具體的排序字段、排序方式(升/降),語法如下:

  SORT itab [BY f2 f2...fn] [ASCENDING/DESCENDING]

   升序 sort itab (ascending),降序 sort itab descending.

 

 

9.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 可以提高內表數據查找的速度,但是使用前必須先對內表進行排序。

 

 

10.LOOP…ENDLOOP(循環讀取內表數據)

   循環讀取內表數據,在循環中使用系統變量SY-TABIX可獲取當前所執行的行數。

  LOOP AT ITAB FROM n1 TO n2.:讀取內表具體行數間數據。

  LOOP AT ITAB WHERE logexp.:按具體字段條件讀取內表。

例如:
TABLES:USR21.
DATA:BEGIN OF EMP OCCURS 0,
     NAME   LIKE USR21-BNAME,
     TELNUM LIKE USR21-PERSNUMBER,
END OF EMP.

SELECT BNAME AS NAME
       PERSNUMBER AS TELNUM
INTO TABLE EMP FROM USR21.

LOOP AT EMP FROM 1 TO 10."讀取內表的第1到10行
  WRITE:EMP.
ENDLOOP.

underlay和overlay示意圖_表數據

LOOP AT EMP WHERE NAME = 'IBM-ANNY'.
WRITE:EMP.
ENDLOOP.

underlay和overlay示意圖_underlay和overlay示意圖_02

 

 

11. AT...ENDAT(設置內表循環觸發條件)

  該語法為事件控制函數,應用於LOOP循環語句中,用於獲取內表的數據變化事件。

   AT NEW f.:當某個字段數據與上一行數據值不同時觸發該事件。

     AT END OF f.:當內表中某個字段當前行值與下一行值不同時觸發該事件。

     AT FIRST.:當執行內表第一行時觸發該事件。

   AT LAST.:當執行內表最後一行時觸發該事件。

 

 

12. 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.刪除重複數據前必須先排序

 

 

13.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 USR21-BNAME,
     TELNUM LIKE USR21-PERSNUMBER,
END OF EMP.

DESCRIBE TABLE EMP LINES N1. "表中無數據,回執為0
DESCRIBE TABLE EMP OCCURS N2."表初始化大小為10,回執為10
DESCRIBE TABLE EMP KIND K.   "默認為STANDARD表,回執為T