天天看點

ABAP開發基礎知識:5) 内表(Internal Table)

    内表與結構體基本類似,它同樣是程式運作中被臨時建立的一個存儲空間,它是一個可包含多條記錄的資料表。

    内表共有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