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來傳遞數據,如下所示:

       TABLES:USER21.

       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的具體用法,將后在后面介紹。

       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.

       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,

       END OF EMP.

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

       FOR EXAMPLE:

       TABLES:USER21.

       DATA:BEGIN OF EMP OCCURS 0,

                NAME LIKE USER21-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 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:

      TABLES:USER21.

   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-NAME='JERY'.

    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.:按具體字段條件讀取內表。

       FOR EXAMPLE:

   TABLES:USER21.

   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.

   *讀取內表的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。

       FOR EXAMPLE:

       DATA:N1 TYPE I,N2 TYPE I,K TYPE C.

   DATA:BEGIN OF EMP OCCURS 10,

       NAME LIKE USER21-BNAME,

       TELNUM LIKE USER21-PERSNUMBER,

       END OF EMP.

       DESCRIBE TABLE EMP LINES N1. ”表中無數據,回執為0

       DESCRIBE TABLE EMP OCCURS N2. “表初始化大小為10,回執為10

   DESCRIBE TABLE EMP KIND K. ”默認為STANDARD表,回執為T

     

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM