前言部分
大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。
正文部分
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自帶了,判斷一個內表中,是否存在某個記錄的函數的話,那第二層循環就可以省去,則上述函數執行效率也會成倍提升了。
以下轉自華亭博客:感謝華亭的分享:
函數模塊:CTVB_COMPARE_TABLES
這個函數模塊比較兩個內表,將被刪除、增加和修改的內表行分別分組輸出。
輸入參數:
TABLE_OLD:舊表
TABLE_NEW:新表
KEY_LENGTH:鍵長度,指定內表中的前若干個字節(在 Unicode 系統中為字符,因此指定長度內不能存在數值類型的字段)為主鍵,做為內表行是否為增加的判斷條件。
IF_SORTED:排序標記,如果已排序,在比較時可以提高效率。
輸出參數:
TABLE_DEL:被刪除的行
TABLE_ADD:被增加的行
TABLE_MOD:被修改的行
NO_CHANGES:表沒有被修改的標記,如果這個標記為 “X”,就不必去讀前面三個內表了。