[英]How is the internal table sorted by default?
所以我想知道當我宣布
lt_table TYPE STANDARD TABLE OF mara.
是不是一樣
lt_table TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.
還是在不聲明 DEFAULT KEY 時選擇了不同的標准表鍵?
正如ABAP 文檔中所解釋的那樣:
如果沒有為標准表定義顯式主鍵,它會自動具有標准鍵。
標准鍵是當您指示DEFAULT KEY
(下面的第一個項目符號點)或什么都沒有(第二個項目符號點)時:
標准密鑰可以聲明如下:
- 明確地,使用語句 TYPES、DATA 等的添加 UNIQUE|NON-UNIQUE KEY,其中指定添加 DEFAULT KEY 而不是組件列表。
- 隱含地,如果在聲明帶有語句 DATA 的標准表中沒有明確指定主鍵。
- 隱含地,如果在語句 DATA 中的 TYPE 后面指定了具有通用主表鍵的標准表類型。
編輯 2022 年 5 月 31 日:“標准表的鍵”的含義可能會有些混淆。 這可能會使人們認為表格已排序,然后訪問速度更快。
那是錯誤的。
只有當你明確地對你的內部表SORT itab BY comp1 comp2
(一次因為它很耗時)並使用READ TABLE itab WITH KEY comp1 = ... comp2 = ... BINARY SEARCH
時,它才會更快。
聲明標准表的主鍵(默認鍵或顯式組件)是一種在SORT
、 READ TABLE
等之后不提及組件的方法,但 ABAP 文檔建議在SORT
、 READ TABLE
等之后顯式聲明它們。
因此,我認為聲明標准表的主鍵沒有任何興趣。
注意: COLLECT
僅基於標准表的主鍵起作用,因此這里沒有選擇,除非您將COLLECT
替換為如下代碼:
ASSIGN itab[ c1 = line-c1 c2 = line-c2 ] TO FIELD-SYMBOL(<exist_line>).
IF sy-subrc = 0.
<exist_line>-counter = <exist_line>-counter + line-counter.
ELSE.
INSERT line INTO TABLE itab.
ENDIF.
如果您想使用排序表來更快地訪問,更喜歡使用TYPE SORTED TABLE
或TYPE HASHED TABLE
(或任何具有輔助鍵的替代語法)聲明表,它確實會對表進行排序並且訪問速度更快,編譯器將發送與標准表相比,使用SORT
(錯誤,因為已經排序)、 READ TABLE
等更好的警告或錯誤消息(如果您使用 ATC,則只有一些警告)。
更多信息,請參閱ABAP 文檔 - itab - 表類別的選擇
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.