關於使用READ TABLE語句的幾點注意事項

來源:互聯網
上載者:User

轉載自:http://www.dlsap.com/thread-34-1-1.html

向原作者 莫懷遠 致謝

 

1.  如果使用READ TABLE語句來讀取內部表資料,而不是簡單看傳回值判斷是否存在,那麼在使用READ TABLE語句之前,一定要記得使用CLEAR語句清空內部表的工作區。

2.  READ TABLE itab WITH KEY = v BINARY SEARCH.

  使用READ TABLE語句的二分法搜尋以 代替標準順 序搜尋時, 必須首先按關鍵字中指定的次序對內表進行排序。如果系統找到匹配指定關鍵字的多行,則讀取索引最低的行。二分法搜尋 比線性搜尋要快。因此,應儘可能將內表排序並且使用二分法搜尋。如果找到有匹配關鍵字的條目,則將系統欄位 SY-SUBRC 設定為0並且 SY-TABIX 包含該行的索引。否則,將 SY-SUBRC 設定為非零。

3.  WITH KEY 中的檢索條件比較符不能使用‘<>’(不等於)。

  如果只想取得內部表中不等於某條件的一條記錄,那麼請使用下面變通方法。
       LOOP AT itab WHERE KEY <> ‘XX’.
          此處取得第一條記錄。
          EXIT.
       ENDLOOP.

   如果在運行時 <KEY> 值為空白,則 統忽略該關鍵字段。另外可對關鍵字段指定位移量和長度。

BTW:
感謝binary search,有一次到日本做項目,有這麼個課題,
內部表中的資料如下
A    B    C
01  001 20060301
01  001  20060201
01  001 20060101

要求取出距現在時間最近的記錄。
我的做法是先排序
SORT IT_TAB BY A
                         B ASCENDING
                         C DESCENDING.
然後用二分法讀取
READ IT_TAB INTO WA_TAB WITH KEY A = '01'
                                                         B = '001'
                                                         BINARY SEARCH.
應該取到01  001 20060301這條記錄。(也確實取得是這條記錄)
這時來之日本SAP公司的檢證人員就挑毛病了,說你用二分法從中間切入,怎麼能保證取到20060301這條,而不是20060201?
SE接到質問讓我抓圖證明用二分法沒錯,否則改用普通READ。
我聽了馬上告訴SE,ABAP文法就是這樣的,這是“常識”!
系統如果找到匹配指定關鍵字的多行,則讀取索引最低的行。
經過我的特殊排序後,20060301所在行索引最低。
過後他調查了一下,一點脾氣都沒有,乖乖地說OK,呵呵。

轉載自:http://www.dlsap.com/thread-34-1-1.html

向原作者 莫懷遠 致謝

 

1.  如果使用READ TABLE語句來讀取內部表資料,而不是簡單看傳回值判斷是否存在,那麼在使用READ TABLE語句之前,一定要記得使用CLEAR語句清空內部表的工作區。

2.  READ TABLE itab WITH KEY = v BINARY SEARCH.

  使用READ TABLE語句的二分法搜尋以 代替標準順 序搜尋時, 必須首先按關鍵字中指定的次序對內表進行排序。如果系統找到匹配指定關鍵字的多行,則讀取索引最低的行。二分法搜尋 比線性搜尋要快。因此,應儘可能將內表排序並且使用二分法搜尋。如果找到有匹配關鍵字的條目,則將系統欄位 SY-SUBRC 設定為0並且 SY-TABIX 包含該行的索引。否則,將 SY-SUBRC 設定為非零。

3.  WITH KEY 中的檢索條件比較符不能使用‘<>’(不等於)。

  如果只想取得內部表中不等於某條件的一條記錄,那麼請使用下面變通方法。
       LOOP AT itab WHERE KEY <> ‘XX’.
          此處取得第一條記錄。
          EXIT.
       ENDLOOP.

   如果在運行時 <KEY> 值為空白,則 統忽略該關鍵字段。另外可對關鍵字段指定位移量和長度。

BTW:
感謝binary search,有一次到日本做項目,有這麼個課題,
內部表中的資料如下
A    B    C
01  001 20060301
01  001  20060201
01  001 20060101

要求取出距現在時間最近的記錄。
我的做法是先排序
SORT IT_TAB BY A
                         B ASCENDING
                         C DESCENDING.
然後用二分法讀取
READ IT_TAB INTO WA_TAB WITH KEY A = '01'
                                                         B = '001'
                                                         BINARY SEARCH.
應該取到01  001 20060301這條記錄。(也確實取得是這條記錄)
這時來之日本SAP公司的檢證人員就挑毛病了,說你用二分法從中間切入,怎麼能保證取到20060301這條,而不是20060201?
SE接到質問讓我抓圖證明用二分法沒錯,否則改用普通READ。
我聽了馬上告訴SE,ABAP文法就是這樣的,這是“常識”!
系統如果找到匹配指定關鍵字的多行,則讀取索引最低的行。
經過我的特殊排序後,20060301所在行索引最低。
過後他調查了一下,一點脾氣都沒有,乖乖地說OK,呵呵。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.