Um einzelne Zeilen einer beliebigen internen Tabelle zu löschen, verwendet man die Anweisung DELETE. Dabei kann man entweder eine einzige Zeile über den Tabellenschlüssel suchen und löschen, mehrere Zeilen über eine Bedingung suchen und löschen oder benachbarte doppelte Einträge suchen und löschen. Wird bei nicht eindeutigen Schlüsseln ein doppelter Eintrag gefunden, wird der erste Eintrag gelöscht.
Um den Tabellenschlüssel der Tabelle itab als Suchschlüssel zu verwenden, verwendet man eine der folgenden Anweisungen:
DELETE TABLE itab FROM wa.
oder:
DELETE TABLE itab WITH TABLE KEY k1 = f1 ... kn = fn.
Im ersten Fall muss wa ein zum Zeilentyp von itab kompatibler Arbeitsbereich sein. Die Werte der Schlüsselfelder werden aus den entsprechenden Komponenten des Arbeitsbereichs entnommen. Um Tabellen mit elementaren Zeilentyp und dem Schlüssel table_line über den Tabellenschlüssel zu löschen, kann entweder die erste Variante verwendet werden, oder die Pseudokomponente table_line als Operand in der zweiten Variante verwendet werden.
Im zweiten Fall werden die Werte für jedes Schlüsselfeld explizit angegeben. Falls der Name eines Schlüsselfelds erst zur Laufzeit bekannt ist, kann er dynamisch über (k1) = f1 (k2) = f2 … als Inhalt eines Felds k1 k2 … angegeben werden. Falls die Datentypen von f1 … fn nicht kompatibel zu den Schlüsselfeldern sind, findet eine Konvertierung statt.
Die Suche erfolgt für die einzelnen Tabellenarten wie folgt:
· Standard-Tabellen
Der zu löschende Eintrag wird linear gesucht, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhängt.
· Sortierte Tabellen
Der zu löschende Eintrag wird binär gesucht, wobei die Laufzeit logarithmisch von der Anzahl der Tabellenzeilen abhängt.
· Hash-Tabellen
Der zu löschende Eintrag wird über den Hash-Algorithmus der internen Tabelle bestimmt, wobei die Laufzeit nicht von der Anzahl der Tabellenzeilen abhängt.
Wenn eine Zeile gefunden wird, wird sie aus der Tabelle gelöscht und sy-subrc auf 0 gesetzt. Ansonsten ist sy-subrc gleich 4. Wird bei nicht eindeutigen Schlüsseln ein doppelter Eintrag gefunden, wird der erste Eintrag gelöscht.
Um eine oder mehrere Zeilen über eine Bedingung zu löschen, verwendet man folgende Anweisung:
DELETE itab WHERE cond.
Es werden alle Zeilen gelöscht, die den logischen Ausdruck conderfüllen. Der logische Ausdruck cond kann aus verschiedenen Vergleichen zusammengesetzt sein. In jedem einzelnen Vergleich muss der erste Operand eine Komponente der Zeilenstruktur sein. Falls die Tabellenzeilen nicht strukturiert sind, kann der erste Operand der Vergleiche auch die Pseudokomponente table_line sein. Ein Vergleich bezieht sich dann auf die gesamte Zeile. Falls mindestens eine Tabellenzeile gelöscht wurde, wird sy-subrc auf 0, ansonsten auf 4 gesetzt.
Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten comp enthält oder der gesamte Zeilentyp eine Referenzvariable ist, können die Attribute attr des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, über comp->attr bzw. table_line->attr als Vergleichswerte angegeben werden.
Um benachbarte doppelte Einträge zu löschen, verwendet man folgende Anweisung:
DELETE ADJACENT DUPLICATE ENTRIES FROM itab
[COMPARING
f1 f2 ... |ALL FIELDS].
Das System löscht alle benachbarten doppelten Einträge aus der internen Tabelle itab. Einträge sind doppelt, wenn Sie eines der folgenden Vergleichskriterien erfüllen:
· Ohne den Zusatz COMPARING müssen die Inhalte der Schlüsselfelder des Tabellenschlüssels in benachbarten Zeilen identisch sein.
· Mit dem Zusatz COMPARING f1 f2 … müssen die Inhalte der angegebenen Felder f1 f2 … in benachbarten Zeilen gleich sein. Die Felder f1 f2 … können auch dynamisch über (n1) (n2) … als Inhalt eines Felds n1 n2 … angegeben werden. Ist n1 n2 … bei der Ausführung der Anweisung leer, wird es ignoriert. Alle Felder f1 f2 … können durch die Angabe von Offset und Länge weiter auf Teilfelder eingegrenzt werden.
· Mit dem Zusatz COMPARING ALL FIELDS müssen die Inhalte aller Felder in benachbarten Zeilen gleich sein.
Mit dieser Anweisung können alle doppelten Einträge aus einer internen Tabelle gelöscht werden, wenn die Tabelle nach dem angegebenen Vergleichskriterium sortiert ist.
Wird mindestens ein doppelter Eintrag gelöscht, wird sy-subrc auf 0, ansonsten auf 4 gesetzt.

REPORT demo_int_tables_DELETE_from .
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.
Die Listenausgabe ist:
2 4
4 16
Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In den DELETE-Anweisungen werden die Zeilen der Tabelle gelöscht, in der das Schlüsselfeld col1 den Inhalt 1 oder 3 hat.

REPORT demo_int_tables_DELETE_where.
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.
Die Listenausgabe ist:
1 1
4 16
Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In der DELETE-Anweisung werden die Zeilen der Tabelle gelöscht, in der die Inhalte von Feld col2 größer als 1 und von Feld col1 kleiner als 4 sind.

REPORT demo_int_tables_DELETE_adjacen.
DATA off TYPE i.
DATA: BEGIN OF line,
col1 TYPE
i,
col2(1) 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.
Die Listenausgabe ist:
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
Es wird eine Standard-Tabelle angelegt und gefüllt. Die erste DELETE-Anweisung löscht die zweite Zeile, da sie den gleichen Inhalt wie die erste Zeile hat. Die zweite DELETE-Anweisung löscht die zweite Zeile aus der restlichen Tabelle, da der Inhalt des Feldes col1 mit dem der ersten Zeile gleich ist. Die dritte DELETE-Anweisung löscht die dritte und vierte Zeile aus der restlichen Tabelle, da der Inhalt des Schlüsselfeldes col2 gleich mit dem der zweiten Zeile ist. Obwohl der Inhalt des Schlüsselfelds für die erste und fünfte Zeile gleich ist, wird die fünfte Zeile nicht gelöscht, weil sie nicht zur ersten Zeile benachbart ist.
Die Anweisung DELETE, die auch zum Löschen von Zeilen beliebiger Tabellen dient, erlaubt auch das Löschen über den Zeilenindex. Es können einzelne oder mehrere Zeilen über den Index gelöscht werden.
Um eine Zeile über den Index zu löschen, verwendet man folgende Anweisung:
DELETE itab [INDEX idx].
Bei Verwendung der Option INDEX wird die Zeile mit dem Index idx aus der Tabelle itab gelöscht, der Index der folgenden Zeilen um 1 erniedrigt und sy-subrc auf 0 gesetzt. Gibt es keine Zeile mit dem Index idx, wird sy-subrc auf 4 gesetzt.
Ohne den Zusatz INDEX kann obige Anweisung nur innerhalb einer LOOP-Schleife verwendet werden. Dann wird die aktuelle Zeile gelöscht. idx wird also implizit auf sy-tabix gesetzt.
Um mehrere Zeilen über den Index zu löschen, verwendet man folgende Anweisung:
DELETE [FROM n1] [TO n2] [WHERE condition].
Dabei muss mindestens einer der Zusätze angegeben werden. Der WHERE-Zusatz arbeitet wie bei beliebigen Tabellen. Zusätzlich zum WHERE-Zusatz können die zu löschenden Zeilen bei Index-Tabellen auch direkt mit FROM und TO angegeben werden. Es werden alle Zeilen aus itab gelöscht, deren Index zwischen n1 und n2 liegt. Ohne den Zusatz FROM werden die Einträge ab der ersten Zeile gelöscht. Ohne den Zusatz TO werden die Einträge bis zur letzten Zeile gelöscht.
Wird mindestens eine Zeile gelöscht, wird sy-subrc auf 0, ansonsten auf 4 gesetzt.

REPORT demo_int_tables_delete_ind_1.
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.
Die Listenausgabe ist:
sy-subrc 4
1 1 1
2 3 9
3 5
25
Es wird eine sortierte Tabelle itab mit fünf Zeilen gefüllt. Dann werden drei Zeilen mit den Indizes 2, 3 und 4 gelöscht. Nach dem Löschen der Zeile mit Index 2, wird der Index der folgenden Zeilen um 1 erniedrigt. Beim nächsten Löschvorgang wird daher die Zeile gelöscht, die zuerst den Index 4 hatte. Der dritte Löschvorgang scheitert, weil die Tabelle nur noch aus 3 Zeilen besteht.

REPORT demo_int_tables_delete_ind_2.
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.
Die Listenausgabe ist:
1 28 784
2 29 841
3 30 900
Es wird eine Standard Tabelle itab mit 30 Zeilen gefüllt. Innerhalb einer LOOP-Schleife werden alle Zeilen, deren Wert im Feld col1 kleiner als 28 ist, gelöscht.

REPORT demo_int_tables_delete_ind_3.
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.
Die Listenausgabe ist:
1 1
2 4
3 9
4 16
39 1.521
40 1.600
Es werden alle Zeilen mit Index zwischen 3 und 39 aus der Standard-Tabelle itab gelöscht, bei denen die Werte in col2 größer als 20 sind.