READ TABLE 選項:
- READ TABLE <EMPTAB>.
- READ TABLE <EMPTAB> WITH KEY <k1> = <v1>… <kn> = <vn>.
READ TABLE <EMPTAB> WITH TABLE KEY <k1> = <v1> … <kn> =
<vn>.
- READ TABLE <EMPTAB> WITH KEY = <value>.
- READ TABLE <EMPTAB> WITH KEY . . . BINARY SEARCH.
- READ TABLE <EMPTAB> INDEX <i>.
- READ TABLE <EMPTAB> COMPARING <f1> <f2> . . . .
- READ TABLE <EMPTAB> COMPARING ALL FIELDS.
- READ TABLE <EMPTAB> TRANSPORTING <f1> <f2> . . . .
- 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.
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.
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.
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.
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呢?