你們能夠關注個人公衆號,公衆號裏的排版更好,閱讀更溫馨。html
SAP自帶的函數:
CTVB_COMPARE_TABLES和BKK_COMPARE_TABLES;
彷佛能夠比較兩個內表,得出第二個內表不一樣於第一個內表的部分(新增/刪除了那些部分)
可是,具體的使用,還請有經驗的朋友不吝賜教啊!
由於,我在測試數據時,發現這兩個函數的效果不那麼簡單。
若是上述函數確實能夠,提取兩個內表不一樣部分,則我能夠據此作兩次比較,獲得兩個內表的交集。
因此,我先用另一種方式解決了-本身寫了一個提取兩個內表交集的函數,供你們檢閱:
*" IMPORTING
*" VALUE(ITAB1) TYPE INDEX TABLE
*" VALUE(ITAB2) TYPE INDEX TABLE
*" EXPORTING
*" VALUE(ITABSAME) TYPE INDEX TABLE
*"----------------------------------------------------------------------
field-symbols:
<S1>,
<S2>.
data:
L1 type i,
L2 type i.
assign local copy of initial line of:
ITAB1 to <S1>,
ITAB2 to <S2>.
describe: table ITAB1 lines L1,
table ITAB2 lines L2.
"對記錄行數少的內表,執行第一層循環;
"在第二層循環中,找到對應記錄,便可追加到結果內表;
"同時退出第二層循環,繼續執行第一層循環的下一行
IF L1 <= L2.
LOOP AT ITAB1 INTO <S1>.
LOOP AT ITAB2 INTO <S2>.
IF <S1> EQ <S2>.
APPEND <S1> TO ITABSAME.
EXIT.
ENDIF.
ENDLOOP.
ENDLOOP.
ELSE.
LOOP AT ITAB2 INTO <S2>.
LOOP AT ITAB1 INTO <S1>.
IF <S1> EQ <S2>.
APPEND <S2> TO ITABSAME.
EXIT.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDIF.
ENDFUNCTION.
另外一個問題,想請教你們,在上面代碼裏,第二層循環是爲了找出,第一層循環的當前記錄,在第二個內表裏是否存在;函數
因此,若是ABAP自帶了,判斷一個內表中,是否存在某個記錄的函數的話,那第二層循環就能夠省去,則上述函數執行效率也會成倍提高了。測試
如下轉自華亭博客:感謝華亭的分享:code
函數模塊:CTVB_COMPARE_TABLES
這個函數模塊比較兩個內表,將被刪除、增長和修改的內錶行分別分組輸出。
輸入參數:
TABLE_OLD:舊錶
TABLE_NEW:新表
KEY_LENGTH:鍵長度,指定內表中的前若干個字節(在 Unicode 系統中爲字符,所以指定長度內不能存在數值類型的字段)爲主鍵,作爲內錶行是否爲增長的判斷條件。
IF_SORTED:排序標記,若是已排序,在比較時能夠提升效率。
輸出參數:
TABLE_DEL:被刪除的行
TABLE_ADD:被增長的行
TABLE_MOD:被修改的行
NO_CHANGES:表沒有被修改的標記,若是這個標記爲 「X」,就沒必要去讀前面三個內表了。htm