天天看點

ABAP 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: 不輸出任何資料

1、先了解一下KEY

ABAP的內表和我們真正的DB 表是類似的,有結構有欄位,但是在處理Key上DB表顯得更為随意,可以要也可以不要,

而內表如果沒有顯式聲明,會将內表中的所有非數值欄位的欄位都作為KEY,當然也可以顯式聲明KEY。

With- 這種結構用的地方主要就是在內表的處理上,包括DELETE,READ.

READ 可以用WITH KEY 或者WITH TABLE KEY,但是DELETE隻能用WITH TABLE KEY。

2、READ TABLE WITH KEY

使用其他關鍵字段進行讀取。

READ TABLE WITH KEY 傳入的是free search key, 支援僅僅傳入主鍵集合的某一個primary key或者secondary key。

READ TABLE WITH KEY 傳入的不一定是内表中真正的關鍵字段,隻要是内表行元件即可。

WITH KEY中的檢索條件比較符不能使用‘<>’(不等于)。
*變量聲明
DATA: BEGIN OF LINE,
        COL1 TYPE C,
        COL2 TYPE N,
        COL3 TYPE I,
      END OF LINE.
DATA: LINE2 LIKE LINE.
DATA: ITAB LIKE STANDARD TABLE OF LINE WITH HEADER LINE WITH KEY COL1 COL2 .

*内表指派
LINE-COL1 = '1'.
LINE-COL2 = '1'.
LINE-COL3 = 10.
APPEND LINE TO ITAB.
LINE-COL1 = '2'.
LINE-COL2 = '2'.
LINE-COL3 = 20.
APPEND LINE TO ITAB.

*結構體内容清空
CLEAR: LINE.

*結構體内容指派
LINE-COL1 = '1'.
LINE-COL2 = '1'.
"注:這裡不能省略下面語句,否則查找不到
LINE-COL3 = 10.

*READ TABLE操作
READ TABLE ITAB INTO LINE2 WITH KEY = LINE.
"READ TABLE ITAB INTO LINE2 WITH KEY COL1 = 1 . "結果一樣
"READ TABLE ITAB INTO LINE2 WITH KEY COL2 = 1.  "結果一樣
"READ TABLE ITAB INTO LINE2 WITH KEY COL3 = 10. "結果一樣
WRITE: / SY-SUBRC, LINE2-COL1.
           

3、READ TABLE WITH TABLE KEY

使用表關鍵字段進行讀取。

READ TABLE WITH TABLE KEY後指定的是table primary key。 如果一個table定義了多個primary key,則必須将所有的key全部在語句中指定,否則會遇到syntax error “key must be completely provided”。

DATA: BEGIN OF LINE,
        COL1 TYPE C,
        COL2 TYPE N,
        COL3 TYPE I,
      END OF LINE.
DATA: LINE2 LIKE LINE.
DATA: ITAB LIKE STANDARD TABLE OF LINE WITH HEADER LINE WITH KEY COL1 COL2 .
LINE-COL1 = '1'.
LINE-COL2 = '1'.
LINE-COL3 = 10.
APPEND LINE TO ITAB.
LINE-COL1 = '2'.
LINE-COL2 = '2'.
LINE-COL3 = 20.
APPEND LINE TO ITAB.
CLEAR: LINE.
LINE-COL1 = '1'.
LINE-COL2 = '1'.
"注:這裡不能省略下面語句,否則查找不到
LINE-COL3 = 10.
READ TABLE ITAB INTO LINE2 WITH TABLE KEY COL1 = 1 COL2 = 1. "隻能這樣寫,主鍵必須寫全
WRITE: / SY-SUBRC, LINE2-COL1.
           

4、TRANSPORTING NO FIELDS

READ TABLE <itab> INTO <wa> WITH KEY <key> [TRANSPORTING …|ALL FIELDS|NO FIELDS].

關鍵字TRANSPORTING NO FIELDS 用于read table with key

一般用于讀取内表的時候,隻是判斷該内表中是否有次資料 不需要讀取到工作區中。

READ TABLE LT_DATA INDEX 1 TRANSPORTING NO FIELDS.
           

此處是判斷内表LT_DATA的第一行是否有資料,一般接下來都是用

IF sy-subrc = 0 判斷該表中是否有次資料

DATA: BEGIN OF LINE,
        COL1 TYPE I,
        COL2 TYPE I,
      END OF LINE.
DATA ITAB LIKE SORTED TABLE OF LINE WITH UNIQUE KEY COL1.

DO 4 TIMES.
  LINE-COL1 = SY-INDEX.
  LINE-COL2 = SY-INDEX ** 2.
  INSERT LINE INTO TABLE ITAB.
ENDDO.

READ TABLE ITAB WITH KEY COL2 = 16 TRANSPORTING NO FIELDS.
WRITE: 'SY-SUBRC =', SY-SUBRC,
/ 'SY-TABIX =', SY-TABIX.
           
ABAP READ TABLE

5、TRANSPORTING讀取一行的部分字段

系統根據<key>(關鍵字段)條件查找對應的條目後,隻将TRANSPORTING中指定的元件字段存儲到工作區域中。

… NO FIELDS表示不傳輸任何元件,此種情況下,READ語句隻影響系統字段 SY-SUBRC 和 SY-TABIX(前提條件是索引表),并且在TRANSPORTING NO FIELDS情況下,如果指定了<wa>,則會忽略掉。

DATA: BEGIN OF LINE,
        COL1 TYPE I,
        COL2 TYPE I,
      END OF LINE.
DATA ITAB LIKE SORTED TABLE OF LINE WITH UNIQUE KEY COL1.

DO 4 TIMES.
  LINE-COL1 = SY-INDEX.
  LINE-COL2 = SY-INDEX ** 2.
  INSERT LINE INTO TABLE ITAB.
ENDDO.

CLEAR LINE.
READ TABLE ITAB WITH TABLE KEY COL1 = 3 INTO LINE TRANSPORTING COL2."主鍵沒有被傳輸

WRITE: 'SY-SUBRC =', SY-SUBRC,
       'SY-TABIX =', SY-TABIX.
WRITE: / LINE-COL1, LINE-COL2.
           
ABAP READ TABLE

6、COMPARING比較讀取的單行内容

READ TABLE <itab> INTO <wa> [COMPARING <f1> <f2> …|ALL FIELDS].

系統根據(關鍵字段)讀取指定的單行并先存儲到工作區中,讀取行之後,将表與工作區中的相應元件進行比較。

… <F1> …<Fn>表示隻比較指定的字段,

… ALL FIELDS表示比較所有元件

如果系統找根據指定<key>找到了對應的條目,且進行比較的字段内容相同,則将 SY-SUBRC 設定為0,如果進行比較的字段内容不同,則傳回值 2;如果系統根據<key>找不到條目,則包含 4。如果系統找到條目,則無論比較結果如何,都将其讀入目标區域。

DATA: BEGIN OF LINE,
        COL1 TYPE I,
        COL2 TYPE I,
      END OF LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.

DO 3 TIMES.
  LINE-COL1 = SY-INDEX.
  LINE-COL2 = SY-INDEX ** 2.
  INSERT LINE INTO TABLE ITAB.
ENDDO.

LINE-COL1 = 2.
LINE-COL2 = 3.

READ TABLE ITAB FROM LINE INTO LINE COMPARING COL2.
WRITE: 'SY-SUBRC =', SY-SUBRC.
WRITE: / LINE-COL1, LINE-COL2.
           
ABAP READ TABLE
DATA: BEGIN OF LINE,
        COL1 TYPE I,
        COL2 TYPE I,
        COL3 TYPE I,
      END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.

DO 10 TIMES.
  LINE-COL1 = SY-INDEX.
  LINE-COL2 = SY-INDEX ** 2.
  LINE-COL3 = SY-INDEX ** 3.
  APPEND LINE TO ITAB.
ENDDO.

*CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( ITAB ).

CLEAR: LINE.
LINE-COL1 = 2.
LINE-COL2 = 4.

"隻要根據關鍵字或索引條件在内表中讀取到相應資料,不管該資料行是否
"與COMPARING 指定的字段相符,都會覆寫存儲到工作區中。
READ TABLE ITAB INTO LINE INDEX 4 COMPARING COL1 COL2.
WRITE: / SY-SUBRC, SY-TABIX,LINE-COL1,LINE-COL2,LINE-COL3.

CLEAR: LINE-COL3.
"也可以使用關鍵字KEY來讀取指定行再進行比較
READ TABLE ITAB INTO LINE WITH KEY COL1 = 4 COL2 = 16 COMPARING COL1 COL2.
WRITE: / SY-SUBRC, SY-TABIX,LINE-COL1,LINE-COL2,LINE-COL3.
           
ABAP READ TABLE

7、表的通路方式

目前內表的通路,主要有Index、Binary Search(二進制法)、線性、Hash算法等。

通路表可以用WITH KEY 或WITH KEY - BINARY SEARCH或 WITH TABLE KEY。

內表的通路和內表的類型有直接的關系,具體情況如下:

Standard Table:線性通路

标準表:順序搜尋,查找時間會随着條目的增加而線性增加

Sorted Table :BinarySearch

排序表:二分查找,查找時間會随着條目的增加而對數級增加

Hashed Table :Hash算法

哈希表:使用雜湊演算法進行查詢,查找時間不依賴于條目數

我們在使用Standard Table時,如果通路表使用With Key或With Table Key的效率都會比 With key — Binary Search 差,因為前面兩個都是采用線性方式,With Table key 很多人會了解成DB的INDEX通路,那麼在了解內表的時候就要稍微變通一下。如果使用的是Sorted table, 則預設使用Binary Search,你也可以在文法中加Binary Search 但是加不加都是一樣的效果。

如果不用READ TABLE呢?

繼續閱讀