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

公衆號: SAP Technical
本文做者: matinal
 

 

前言部分

你們能夠關注個人公衆號,公衆號裏的排版更好,閱讀更溫馨。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

相關文章
相關標籤/搜索