内部テーブルの重複を削除する時は事前にソートする事

DELETE ADJACEMENT DUPLICATES FROM 内部テーブル COMPARING 項目.で内部テーブルの重複を削除する場合は、事前にソートされた状態にしましょう。

REPORT ZTEST.
TYPES:
  BEGIN OF TYP_TEST,
    INTG TYP I,
  END OF TYP_TEST,
  TYP_IT_TEST TYPE STANDARD TABLE OF TYP_TEST.

DATA:
  ST_TEST TYPE TYP_TEST,
  IT_TEST TYPE TYP_TD_TEST.

START-OF-SELECTION.

ST_TEST-INTG = 1.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 3.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 2.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 1.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 1.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 3.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 2.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 1.
APPEND ST_TEST TO IT_TEST.

ST_TEST-INTG = 1.
APPEND ST_TEST TO IT_TEST.

DELETE ADJACEMENT DUPLICATES FROM IT_TEST COMPARING INTG.

LOOP AT IT_TEST INTO ST_TEST.

  WRITE:
    /006(5) ST_TEST-INTG.

ENDLOOP.

DELETE ADJACEMENT DUPLICATESで重複を削除する前のIT_TESTは、

  • IT_TEST
#INTG
11
23
32
41
51
63
72
81
91

↑こうなっています。

LOOP AT IT_TEST INTO ST_TEST.の時点でIT_TESTがどうなっているかと言うと、

  • IT_TEST
#INTG
11
23
32
41
53
62
71

↑こうなっています。
DELETE ADJACEMENT DUPLICATESは隣接する行で重複しているか判断するので、ソートされてないと
うまくいかないんですよね。

DELETE ADJACENT DUPLICATE ENTRIES FROM itab
[COMPARING f1 f2 ... |ALL FIELDS].
内部テーブル itab から、すべての隣接する重複エントリが削除されます。
https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/06/aafd54fc4011d195280000e8353423/content.htm?no_cache=true

これを回避するためには、重複を削除する前にIT_TESTにSORTをかけます。

*中略
APPEND ST_TEST TO IT_TEST.

SORT IT_TEST BY INTG ASCENDING.

DELETE ADJACEMENT DUPLICATES FROM IT_TEST COMPARING INTG.

LOOP AT IT_TEST INTO ST_TEST.

  WRITE:
    /006(5) ST_TEST-INTG.

ENDLOOP.

こうすれば、↓のようにちゃんと重複が削除されます。

  • IT_TEST
#INTG
11
22
33