!--a11y-->

内部テーブルの単一の行を削除するには、DELETE 命令を使用します。テーブルキーを使用してそのキーを使用する単一の行を検索して削除するか、条件を満たす複数の行を削除するか、隣接する重複エントリを検索して削除します。テーブルのキーが一意でなく、重複エントリがある場合は、最初のエントリが削除されます。
テーブル <itab> のテーブルキーを検索キーとして使用するには、以下のいずれかの命令を使用します。
DELETE TABLE <itab> FROM <wa>.
または
DELETE TABLE <itab> WITH TABLE KEY <k1> = <f1> ...<kn> = <fn>.
最初の命令では、<wa> は<itab> の行データ型と互換性がある作業領域でなければなりません。キー項目の値は、作業領域の対応するコンポーネントから取得されます。
2 番目の命令では、各キー項目の値を明示的に指定する必要があります。実行時までいずれかのキー項目の名前がわからない場合は、(<n i>) = <f i> の書式を使用して、項目 <n i> の内容として指定することができます。<f i> のデータ型がキー項目と互換性がない場合は、システムによってデータ型が変換されます。
以下のように関連する行が検索されます。
キ 標準テーブル
ライナー検索。この検索では実行時間がテーブルエントリ数と正比例します。
キ ソートテーブル
バイナリ検索。この検索では、実行時間がテーブルエントリ数と対数比例します。
キ ハッシュテーブル
内部テーブルのハッシュアルゴリズムを使用してエントリが検索されます。実行時間はテーブルエントリ数とは無関係です。
行が検出されると、その行はテーブルから削除され、SY-SUBRC が 0 に設定されます。行が検出されないと SY-SUBRC は 4 に設定されます。テーブルのキーが一意でない場合に、重複エントリが検出されると、最初のエントリが削除されます。
条件を使用して複数の行を削除するには、以下の命令を使用します。
DELETE <itab> WHERE <cond>.
この命令によって、論理条件 <cond> を満たすすべての行が処理されます。論理条件は、複数の比較で構成することができます。各比較で、最初のオペランドが行構造のコンポーネントでなければなりません。テーブルの行が構造化されていない場合、最初のオペランドを TABLE LINE 式にすることもできます。このようにすると、比較が行全体に適用されます。SY-SUBRC は、1 行でも削除された場合は 0 に設定され、行が削除されなかった場合は 4 に設定されます。
隣接する重複エントリを削除するには、以下の命令を使用します。
DELETE ADJACENT DUPLICATE ENTRIES FROM <itab>
[COMPARING
<f1> <f2> ...
|ALL
FIELDS].
内部テーブル <itab> から隣接する重複エントリがすべて削除されます。エントリは、以下の比較基準のいずれかを満たしていない場合に重複しています。
キ COMPARING オプションを指定しない場合は、テーブルのキー項目の内容が両方の行で同じでなければなりません。
キ COMPARING <f1> <f2> ... オプションを使用する場合は、指定した項目 <f1> <f2> ... の内容が両方の行で同じでなければなりません。また、(<n i>) の書式で項目 <n i> の内容として項目 <f i> を動的に指定することもできます。命令の実行時に <n i> が空である場合は、その項目は無視されます。オフセットと長さを指定して、検索を一部の項目に制限することができます。
キ COMPARING ALL FIELDS オプションを使用する場合は、両方の行のすべての項目の内容が同じでなければなりません。
テーブルが指定した比較基準によってソートされた場合、この命令を使用してすべての重複エントリを内部テーブルから削除することができます。
SY-SUBRC は、1 行でも削除された場合は0 に設定され、行が削除されなかった場合は 4 に設定されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 =
SY-INDEX.
LINE-COL2 = SY-INDEX **
2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
LINE-COL1 = 1.
DELETE TABLE ITAB: FROM
LINE,
WITH TABLE KEY COL1 = 3.
LOOP AT ITAB INTO
LINE.
WRITE: / LINE-COL1,
LINE-COL2.
ENDLOOP.
出力は以下のようになります。
2 4
4 16
ハッシュテーブルに平方数の一覧が書き込まれます。DELETE 命令によって、キー項目 COL1 の内容が 1 または 3 のテーブルの行が削除されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
DELETE ITAB WHERE ( COL2 > 1 ) AND ( COL1 < 4 ).
LOOP AT ITAB INTO
LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 1
4 16
ハッシュテーブルに平方数の一覧が書き込まれます。DELETE 命令によって、項目 COL2 の内容が 1 より大きく、項目 COL1 の内容が 4 より小さいテーブルの行が削除されます。

DATA OFF TYPE I.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE C,
END OF
LINE.
DATA ITAB LIKE STANDARD
TABLE OF LINE
WITH NON-UNIQUE
KEY COL2.
LINE-COL1 = 1. LINE-COL2
= 'A'.APPEND LINE TO ITAB.
LINE-COL1 = 1. LINE-COL2 =
'A'.APPEND LINE TO ITAB.
LINE-COL1 = 1. LINE-COL2 =
'B'.APPEND LINE TO ITAB.
LINE-COL1 = 2. LINE-COL2 =
'B'.APPEND LINE TO ITAB.
LINE-COL1 = 3. LINE-COL2 =
'B'.APPEND LINE TO ITAB.
LINE-COL1 = 4. LINE-COL2 =
'B'.APPEND LINE TO ITAB.
LINE-COL1 = 5. LINE-COL2 =
'A'.APPEND LINE TO ITAB.
OFF = 0. PERFORM LIST.
DELETE ADJACENT DUPLICATES FROM ITAB COMPARING ALL FIELDS.
OFF = 14. PERFORM LIST.
DELETE ADJACENT DUPLICATES FROM ITAB COMPARING COL1.
OFF = 28. PERFORM LIST.
DELETE ADJACENT DUPLICATES FROM ITAB.
OFF = 42. PERFORM LIST.
FORM
LIST.
SKIP TO LINE 3.
LOOP AT ITAB INTO LINE.
WRITE: AT /OFF LINE-COL1, LINE-COL2.
ENDLOOP.
ENDFORM.
出力は以下のようになります。
1 A 1 A 1 A 1 A
1 A 1 B 2 B 2 B
1 B 2 B 3 B 5 A
2 B 3 B 4 B
3 B 4 B 5 A
4 B 5 A
5 A
この例では、標準テーブルが作成されデータが書き込まれます。ここでは、第 2 行の内容が第 1 行と同じなので、最初の DELETE 命令によって ITAB から第 2 行が削除されます。第 2 行の項目 COL1 の内容が第 1 行と同じなので、2 番目の DELETE 命令によって、残りのテーブルから第 2 行が削除されます。第 3 行と第 4 行のデフォルトキー項目 COL2 の内容が第 2 行と同じなので、3 番目の DELETE 命令によって、第 3 行と第 4 行が残りのテーブルから削除されます。第 1 行と第 5 行のデフォルトキーの内容は同じですが、第 5 行は第 1 行と隣接していないので、第 5 行は削除されません。