SAP 內表


內表與結構體基本類似,它同樣是程序運行中被臨時創建的一個存儲空間,它是一個可包含多條記錄的數據表。

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

2.內表和內表結構

2.1  結構體(Structure)

2.1.1 結構體的定義

ABAP 中可以定義結構來包含多個基本類型,便於整理及操作;

結構體不屬於數據字典對象(數據字典中可以定義結構體,但不能存儲數據),在程序運行時會被作為臨時對象存儲在內存空間;

在創建內表時,可參考直接定義的結構體作為內表結構

結構體的定義,可以通過兩種方式實現:
1.第一種方式

語法:
DATA:  BEGIN OF <name>

<field1> . . .

<field2> . . .

. . .

END OF <name>.

如:

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
TABLES : TABNA.
 
DATA : BEGIN OF ADDRESS,
        FLAG   TYPE C,
        ID     LIKE TABNA- ID ,
        NAME1  LIKE TABNA-NAME1,
        CITY   LIKE TABNA-CITY,
       END OF ADDRESS.
 
* 為結構體字段賦值
   MOVE 'X'            TO ADDRESS-FLAG.
   MOVE '0001'         TO ADDRESS- ID .
   MOVE 'Smith'        TO ADDRESS-NAME1.
   MOVE 'Philadelphia' TO ADDRESS-CITY.
 
   WRITE ADDRESS.

2.第二種方式

語法:
TYPES: BEGIN OF <name1>,

<field1> . . . ,

<field2> . . . ,

. . .  ,

END OF <name1>.

DATA: <name2> TYPE <name1>.

如:

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
TYPES : BEGIN OF ADDR,
         FLAG,
         ID      LIKE EMPLOYEE- ID ,
         NAME1   LIKE EMPLOYEE-NAME1,
         CITY    LIKE EMPLOYEE-CITY,
        END OF ADDR.
 
DATA : ADDRESS TYPE ADDR.
 
MOVE 'X'            TO ADDRESS-FLAG,
        '00001'        TO ADDRESS- ID ,
        'Smith'        TO ADDRESS-NAME1,
        'Philadelphia' TO ADDRESS-CITY.
 
WRITE ADDRESS.

2.1.2  結構體的賦值

相同結構體之間可以通過 MOVE … TO … 語句進行賦值;

如若存在類型差異的結構體,則可以通過 MOVE-CORRESSPONDING … TO … 語句將兩個結構體之間相同字段自動匹配賦值:

abap_05_Structure_Set_Value

與基本變量定義類似,結構體的初始化操作也可以通過 CLEAR 語句實現。

如:

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
TABLES : employee.
 
DATA : BEGIN OF address,
         flag,
         id      LIKE employee-id,
         name    LIKE employee-name1,
         city    LIKE employee-city,
       END OF ADDRESS.
 
SELECT * FROM employee.
 
      MOVE - CORRESPONDING employee TO address.
 
      WRITE : / address-flag,  address-id,
             address-name, address-city.
 
      CLEAR address.
ENDSELECT .

2.2  內表(Internal Table)

內表與結構體基本類似,同樣在程序運行過程中存儲在臨時創建的內存空間,它是一個可以存儲多條記錄的數據

2.2.1 內表的定義

通過關鍵字DATA定義內表,可以直接參考結構體或者其他內表及透明表結構,也可以直接定義結構字段。

語法:

①.DATA <NAME> TYPE <STRUCTURE>        WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE].

②.DATA <NAME> LIKE TABLE OF <TABLE> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE].

③.DATA: BEGIN OF itab OCCURS n,

<field>

<field>

END OF itab.

其中,關鍵字說明如下:

[UNIQUE|NON-UNIQUE]: 指定關鍵字,只用於排序表,使用NON-UNIQUE關鍵字的話,排序表數據記錄允許重復關鍵字字段;

[INITIAL SIZE n]:指定初始化內表大小,比較少用,一般默認即可;

[WITH HEADER LINE]: 定義內表是否帶表頭;

 

 

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
*--------------------------------------------------------------------*
* 通過定義結構體並參考該結構定義內表
*--------------------------------------------------------------------*
TABLES : employee.                           "參考某一透明表,必須先引用定義
 
TYPES BEGIN OF emp,
          id          LIKE employee-id,
          name1       LIKE employee-name1,
          country     LIKE employee-country,
         END OF emp.
 
*--------------------------------------------------------------------*
* 參考EMP 結構定義一個初始化大小為10,並有HEADER LINE的內表
*--------------------------------------------------------------------*
DATA : emptab TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE .
 
 
*--------------------------------------------------------------------*
* 參考EMPTAB內表,重新定義沒有HEADER LINE的內表
*--------------------------------------------------------------------*
DATA : emptab_n LIKE STANDARD TABLE OF emptab.
 
 
*--------------------------------------------------------------------*
* 定義一個允許重復KEY,並且沒有HEADER LINE的排序表
*--------------------------------------------------------------------*
DATA : emptab_s TYPE SORT TABLE OF emp WITH NON - UNIQUE KEY id.
 
 
*--------------------------------------------------------------------*
* 通過第三種方式定義的內表,可指定具體字段,默認內表存在HEADER LINE
*--------------------------------------------------------------------*
TYPES BEGIN OF emp OCCURS 0,
           id         LIKE employee-id,
           name1      LIKE employee-name1,
           country    LIKE employee-country,
         END OF emp.

 

 

2.2.2  內表有無 HEADER LINE 的區別

對於有HEADER LINE的內表,可以通過填充HEADER LINE數據后或通過 外部Work Area 向內表存儲空間中追加數據。

 

abap_05_Internal_Table_With_Header_Line

對於沒有HEADER LINE的內表,只能通過 外部Work Area來傳遞數據:

 

abap_05_Internal_Table_Without_Header_Line

語法:

①.APPEND [<Work Area> INTO] <ITAB>.

如:

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TABLES : employee.
 
TYPES : BEGIN OF emp,
     id  LIKE employee-id,
     name1   LIKE employee-name1,
     country LIKE employee-country,
        END OF emp.
 
* 有 HEADER LINE 的內表
DATA : emptab  TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE .
 
* 沒有 HEADER LINE 的內表
DATA : emptab2 TYPE STANDARD TABLE OF emp INITIAL SIZE 10,        
 
* Work Area
       emptab_wa TYPE emp.                                                                          
 
SELECT * FROM employee.
 
     MOVE - CORRESPONDING employee TO emptab.
     APPEND emptab.
 
     MOVE - CORRESPONDING employee TO emptab_wa.
     APPEND emptab_wa TO emptab2.
 
ENDSELECT .

由於沒有HEADER LINE的內表通過Work Area 傳遞數據在性能上會優於HEADER LINE直接填充HEADER LINE,

所以,一般基本都使用沒有 HEADER LINE 的內表。

除非一些特殊情況,才會使用 HEADER LINE 內表。

2.2.3 內表數據處理

1. 遍歷讀取內表數據 (LOOP … ENDLOOP.)

 

01
02
03
04
05
06
07
08
09
10
11
LOOP AT emptab WHERE country BETWEEN ‘A’ AND ‘D’.
 
      WRITE :  / emptab-country, emptab-name1, emptab-sales.
 
ENDLOOP .
 
IF sy-subrc NE 0.  
 
      WRITE : / ‘ NO ENTRIES ’.  
 
ENDIF .

解析:

a.LOOP 語句后,允許使用WHERE語句篩選數據。

b.程序中,出現 sy-subrc 變量,這是系統全局變量,用於檢查是否符合條件,

如若符合條件 sy-subrc 返回0 ,如果不符合,則返回4.

2. 讀取內表數據 (READ TABLE …)

在數據內表,可以通過READ TABLE關鍵字根據具體行數或主鍵字段讀取內表中的某行記錄:

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
TABLES : employee.
 
TYPES BEGIN OF emp,
          country     LIKE employee-country,
          name1       LIKE employee-name1,
         END OF emp.
 
DATA : emptab TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE .
 
SELECT * FROM EMPLOYEE.
 
     MOVE - CORRESPONDING employeeTO emptab.
     APPEND EMPTAB.
 
ENDSELECT .
 
READ TABLE ….

READ TABLE 選項:

1) READ TABLE <EMPTAB>.

2) READ TABLE <EMPTAB>  WITH KEY <k1> = <v1>…  <kn> = <vn>.

3) READ TABLE <EMPTAB>  WITH TABLE KEY <k1> = <v1> …  <kn> = <vn>.

4) READ TABLE <EMPTAB>  WITH KEY  = <value>

5) READ TABLE <EMPTAB>  WITH KEY . . .  BINARY SEARCH.

6) READ TABLE <EMPTAB>  INDEX <i>.

7) READ TABLE <EMPTAB> COMPARING <f1> <f2> . . . .

8) READ TABLE <EMPTAB> COMPARING ALL FIELDS.

9) READ TABLE <EMPTAB> TRANSPORTING <f1> <f2> . . . .

10) READ TABLE <EMPTAB> TRANSPORTING NO FIELDS.

關鍵字說明:

[KEY|TABLE KEY]: 通過內表的主鍵字段查找

[BINARY SEARCH]: 二分法查找,使用該方法時,在READ TABLE之前,必須對內表排序

[INDEX]: 根據內表索引查找

[COMPARING]:只查找設置的字段

[COMPARING ALL FIELDS]:查找內表所有的字段

[TRANSPORTING]: 只輸出設置的字段數據

[TRANSPORTING NO FIELDS]: 不輸出任何數據

3. 內表排序

對內表進行排序,指定具體排序的排序字段、排序方式(升序/降序)

默認情況下,為升序。

語法:

SORT itab [BY <f1> <f2> …] [ASCENDING|DESCENDING]

4. 內表分類匯總(COLLECT TABLE …

通過COLLECT TABLE關鍵字,可以對內表中相同記錄合並,若有數字類型(I、P、F)的字段,會將其合並匯總。

語法:

COLLECT [<work area> INTO] itab.

 

 

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
TABLES : EMPLOYEE.
 
TYPES BEGIN OF EMP,
       COUNTRY    LIKE EMPLOYEE-COUNTRY,
       SALES      LIKE EMPLOYEE-SALES,
         END OF EMP.
 
DATA :  EMPTAB   TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE ,
        EMPTAB_C TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE .
 
DATA :  EMPTAB_WA TYPE EMP.
 
* 賦值
EMPTAB-COUNTRY = 'D' .
EMPTAB-SALES         = 400.
APPEND EMPTAB.
 
EMPTAB-COUNTRY = 'USA' .
EMPTAB-SALES         = 1000.
APPEND EMPTAB.
 
EMPTAB-COUNTRY = 'GB' .
EMPTAB-SALES         = 500.
APPEND EMPTAB.
 
EMPTAB-COUNTRY = 'D' .
EMPTAB-SALES         = 7800.
APPEND EMPTAB.
 
SORT EMPTAB BY COUNTRY.
 
LOOP EMPTAB.
      
      MOVE - CORRESPONDING EMPTAB TO EMPTAB_WA.
 
      COLLECT EMPTAB INTO EMPTAB_C.
 
ENDLOOP .

 

輸出結果:

D       8200

GB       500

USA    1000

或者直接從數據表取數匯總:

 

01
02
03
04
05
06
07
08
09
10
11
12
SELECT * FROM EMPLOYEE.
 
    MOVE - CORRESPONDING EMPLOYEE TO EMPTAB.
    COLLECT EMPTAB.
 
ENDSELECT .
 
LOOP AT EMPTAB.
 
    WRITE :  / EMPTAB-COUNTRY, EMPTAB-SALES.
 
ENDLOOP .

5.系統字段 SY-TABIX

與前面提到的 SY-SUBRC 字段一樣,SY-TABIX 也為系統的全局變量;

用於在循環遍歷內表時,當前記錄的索引值:

 

1
2
3
4
5
6
7
8
SELECT * FROM EMPLOYEE
    INTO CORRESPONDING FIELDS OF TABLE EMPTAB.
 
LOOP AT EMPTAB.
 
    WRITE :  / SY-TABIX, EMPTAB-COUNTRY, EMPTAB-NAME1.
 
ENDLOOP .

 

2.2.4 維護內表數據

1.通過索引值維護內表

語法:

INSERT   <EMPTAB> INDEX <i

MODIFY <EMPTAB> INDEX <i>.

DELETE   <EMPTAB> INDEX <i>.

說明:

INSERT: 向內表數據I處插入數據記錄

MODIFY:修改內表數據I處記錄

DELETE:刪除內表I處數據記錄

如:

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT * FROM EMPLOYEE.
    MOVE - CORRESPONDING EMPLOYEE TO EMPTAB.
    APPEND EMPTAB.
ENDSELECT .
 
READ TABLE EMPTAB INDEX 1.
MOVE 'ABC' TO EMPTAB-NAME1.
MODIFY EMPTAB INDEX SY-TABIX.
 
* 每次執行完之后,判斷SY-SUBRC是否為0
IF SY-SUBRC NE 0.
 
    WRITE :  / ‘Attempt to modify failed.’.
 
ELSE .
 
   WRITE :  / EMPTAB-COUNTRY, EMPTAB-NAME1.
 
ENDIF .
 
INSERT EMPTAB INDEX 1.
DELETE EMPTAB INDEX SY-TABIX.

2. 維護沒有HEADER LINE的內表

APPEND <work area> TO <internal table>.

COLLECT <work area> INTO <internal table>

INSERT <work area> INTO <internal table>.

MODIFY <internal table> FROM <work area>.

READ TABLE <internal table> INTO <work area>.

LOOP AT <internal table> INTO <work area>.

說明:

APPEND: 向內表追加數據

COLLECT:內表數據分類匯總

INSERT:向內表插入數據

MODIFY:修改內表數據

READ TABLE:讀取內表數據

LOOP AT:遍歷內表數據

3. 清空內表

清空內表有4種方式:

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

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

FREE <internal table>:清空內表數據存儲空間,對HEADER LINE不影響

4.獲取內表信息

可以通過 DESCRIBE 關鍵字獲取內表的相關信息。

語法:

DESCRIBE TABLE <internal table> [LINES <var1>] [OCCURS <var2>].

說明:

LINES: 獲取內表存儲記錄數

OCCURS:獲取內表存儲空間大小

內表行的操作:

1.      工作區.程序對內表的操作不能直接進行,必須通過一種接口來傳輸,這個接口就是工作區(WorkArea).如果程序需要從關系數據庫中撮數據到內表各行中,必須先將數據讀入工作區,然后把工作區中的數據賦給內表的行.工作區必須具有和內表的行一致或者可相互轉換的數據結構.

2.      表行頭.在創建內表對象的同時可以隱式地定義一個同名工作區.創建了帶表頭的內表之后,可以認為程序中存在兩個數據對象,一個是內表,另一個與內表結構相同的結構體.如果一個語句中,該名稱同時代表內表或同名表的工作區,則需要在內表名稱之后加“[]”。

3.      插入行.(INSERT語句)語法:       INSERT line INTO itab INDEXidx.”通過索引插入單行.       INSERT [line INTO|INITIAL LINE INTO] TABLEitab.”一般性插入語句.對於標准表,不指定索引值,附加至表最后一行,與APPEND語句效果完全一致.對於排序表,插入的行不可以打亂 按照關鍵字排序的順序,否則插入不成功.對於哈希表,插入過程中系統按照關鍵字對行進行定位.INSERTwa_company INTO TABLE itab_company.”將一個內表中的所有行插入到另一個內表中.

4.      附加行.(APPEND語句)附加行是在一個已經存在的索引表中使 用APPEND語句增添新行.可以對單行或多行進行操作.語法:APPEND [lineTO|INITIAL LINE TO ]itab.”單行APPEND LINES OF Itab1 [FROM n1][TO n2]TO itab2.”多行.

5.      聚集附加.(COLLECT語句)COLLECT line INTOitab.要求:內表必需為扁平結構,行要與工作區兼容,而且除關鍵字以外的字段必須為數字類型.

6.      讀取一行.(READ語句)READ TABLE itab [INTO wa| ASSIGNING<fa>] INDEXidx.讀取的結果可以是結構與行類型兼容的工作區或字段符號<fs>.如果讀取成功,則SY-TABIX返回該行的索引.一般在 訪問目標工作區之前,要先用SY-SUBRC字段查看一下讀取成功與否.READTABLE itab FROM key [INTO wa|ASSIGNING<fs>].目標數據結構中的關鍵字段必須已經被預賦值,內表中相同關鍵字的首個數據行中的其他字段將被讀入目標區 域中.READTABLE itab WITH TABLE KEY k1 = f1 …ki = fi [INTO wa |ASSIGNING<fs>].指定表中的所有表關鍵字段的值,目標結構在操作前可以為任何值,內表數據行整體讀入目標區 域.READTABLE itab WITH KEY k1 = f1 …ki = fi [INTO wa|ASSIGNING<fs>].KEY列表可以為任意字段,不一定是表關鍵字.

7.      修改一行.(MODIFY語句)MODIFY itab [FROM wa] [INDEX idx][TRANSPORTINGf1,f2…].使用FROM選項指定的工作區域wa代替itab中索引為idx的現有行,一般需要指定INDEX選 項.MODIFYTABLE itab FROM wa [TRANSPORTINGf1,f2…].工作區域wa在語句操作過程中起到雙重作用,其一是根據其關鍵字段的值來確定需要替換的內表的行;其二是根據 其他非關鍵字段的值來替換內表行中相應字段的數據.如果只希望更新部分字段的值,可以使用TRANSPORTING選項.MODIFYitab FROM wa TRANSPORTING f1,f2…WHERE cond.使用WHERE選項修改多行.

8.      刪除一行.DELETE語句.DELETE itab INDEXidx.如果刪除成功,則所有行的索引數減一,SY-SUBRC值為0,如果不存在索引行為idx,則SY-SUBRC返回 4.DELETETABLE itab FROM wa.DELETE TABLE itab WITH KEY k1 = f1…ki =fi.DELETE TABLE [FROM n1 ][TO n2][WHERE<condition>].

9.      循環處理.LOOP AT itab <result> [FROMn1][TO n2] [WHERE<condition>].       <statement block>.ENDLOOP.

10.   初始化內表.

CLEARitab.該語句將內表重置為填充前的狀態,該表將不包含任何行.如果內表有表頭行,會同時清空內表數據行和表頭行的內容.

CLEAR itab[].只希望初始化內表本身,保留表頭行的內容.REFRESHitab.如果內表有表頭行,該語句確保只初始化內表本身.FREE itab.使用CLEAR或REFRESH初始化內表后,系統仍保持在內在中為內表預留的空間.該語句可以重置內表並同時釋放其內存,而不必先使用 REFRESH或CLEAR語句.…itabIS INITIAL…

11.  整體復制內表.如果想將內表的全部內容復制到另一個內表中,可以進行整體賦值操作,使用MOVE或”=”.MOVE itab1 TOitab2.Itab1 = itab2.

12.  比較內表大小.內表可用作邏輯表達式的操作數進行比較.…itab1<operator>itab2… 其中<operator>可以為操作符EQ,=,NE,<>,><,GE,>=,LE,<=,GT,& gt;,LT,<等. 業務表的操作.

 長文本取值,調用系統函數read_text。使用 READ_TEXT(函數) 可以讀出 STXL 表中的 LRAW 數據

數據類型是LRAW,比如:STXL-CLUSTD。LRAW 類型的列,和普通列不同,其實不是簡單的對應一個 主特征. 對其數據的讀取,要用到 IMPORT和EXPORT...使用 內表 把要存儲的數據導入進去,想讀取的時候, 再把數據導出到內表,然后進行操作,刪除和更新,就和一般關系型表一樣. LRAW不可以進行查詢操 作. 而且定義包含LRAW的表,要求很多,首先,一個表只能一個這樣的列,而且是在最后一列,倒數第2列 是一個INT2類型.連名字都要求固定. 第一列 : MANDT 第二列: RELID ,char類型,2bytes.是表儲存的AREA ID. 第三列: 名字可以自己定義,是這個表的KEY 第四列: SRTF2,INT4類型,存的行數 第五列""倒數第三列: 用戶自己定義 倒數第二列: CLUSTR, INT2類型,存儲的是最有一列的字符數 最后一列: CLUSTD,LRAW類型 其中, 1 ,4,和倒數第2列是系統自動生成.,當然可以把第1列指定為自己生成。

對於LRAW的讀取,不是SELECT語句, 而是IMPORT,舉個例子 * From R/3 table zmytable insert internal table itab TYPES: BEGIN OF mytable_line, ? ? ? ? line(3000) TYPE c, ? ? ? END OF mytable_line. DATA itab ?TYPE TABLE OF mytable_line. * CLEAR itab. IMPORT itab ?FROM DATABASE zmytable(hk) ID zmytable-order_no . 說明 ? 關於我這里定義的3000,大家可以自己根據需要定義,lraw字段,定義時,最小是256,實際使用多 少沒關系,LRAW的存儲,是壓縮存儲的,所以不能select這個列 ? 以上功能,就是把R/3里面的cluster table : zmytable里面的LRAW列取出來放到ITAB里面. 這里,要先知道存貯在LRAW結構類型,然后定義一個一樣的,就可以取出來值了


免責聲明!

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



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