!--a11y-->

DELETE 命令で、索引を使用してテーブルから行を削除することができます。
索引を使用して単一の行を削除するには、以下の命令を使用します。
DELETE <itab> [INDEX <idx>].
INDEX オプションを使用すると、索引 <idx> を持つ行がテーブル<itab> から削除され、後続の行の索引の値が 1 ずつ 減らされ、SY-SUBRC が 0 に設定されます。索引 <idx> を持つ行がない場合は、SY-SUBRC は 4 に設定されます。
INDEX オプションを使用しない場合は、上記の命令は LOOP 内でのみ使用することができます。この場合は、現在のループ行を削除します (<idx> は暗黙的に SY-TABIX に設定されます) 。
索引を使用して複数の行を削除するには、以下の命令を使用します。
DELETE <itab> [FROM <n1>] [TO <n2>] [WHERE <condition>].
ここでは、1 つ以上のオプションを指定する必要があります。WHERE オプションは、任意のテーブルからエントリを削除する場合と同じ効果があります。WHERE 句と同様に、FROM と TO を使用して削除する行を索引によって指定することができます。索引が <n 1> と <n 2> の間にある、テーブル<itab> のすべての行が削除されます。FROM オプションを指定しないと、第 1 行以降の行が削除されます。TO オプションを使用しないと、最終行までの行が削除されます。
SY-SUBRC は、1 行でも削除された場合は0 に設定され、行が削除されなかった場合は 4 に設定されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE SORTED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 5
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
DELETE ITAB INDEX: 2, 3, 4.
WRITE: 'SY-SUBRC =’, SY-SUBRC.
SKIP.
LOOP AT ITAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
SY-SUBRC 4
1 1 1
2 3 9
3 5
25
この例では、ソートテーブル ITAB に 5 行が書き込まれます。索引 2 、3 、および 4 を持つ 3 行が削除されます。索引 2 を持つ行が削除されたあと、以降の行の索引は 1 ずつ小さくなります。したがって、次の削除操作によって最初は 4 であった索引を持つ行が削除されます。テーブルには 3 行しかなくなったので、3 回目の削除操作は失敗します。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE TABLE OF LINE.
DO 30
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LOOP AT ITAB INTO
LINE.
IF LINE-COL1 < 28.
DELETE ITAB.
ENDIF.
ENDLOOP.
LOOP AT ITAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 28 784
2 29 841
3 30 900
この例では、ソートテーブル ITAB に 30 行が書き込まれます。LOOP 構文を使用して、COL1 の値が 28 より小さいすべてのテーブル行が削除されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE TABLE OF LINE.
DO 40 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
DELETE ITAB FROM 3 TO 38 WHERE COL2 > 20.
LOOP AT ITAB INTO LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 1
2 4
3 9
4 16
39 1.521
40 1.600
3 から 39 までの間の索引を持ち、COL2 の値が 20 より大きいすべての行が標準テーブル ITAB から削除されます。