【ABAP系列】SAP ABAP 取兩個內表的交集 比較兩個內表的不同


公眾號: matinal
本文作者: matinal
 

 

前言部分

大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。

正文部分

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”,就不必去讀前面三個內表了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM