Show TOC Anfang des Inhaltsbereichs

Tabellenzeilen löschen  Dokument im Navigationsbaum lokalisieren

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.

Eine Zeile über den Tabellenschlüssel löschen

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.

Mehrere Zeilen über eine Bedingung löschen

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.

Benachbarte doppelte Einträge löschen

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.

Beispiel

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.

Beispiel

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.

Beispiel

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.

Tabellenzeilen über den Index löschen

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.

Einzelne Zeilen löschen

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.

Mehrere Zeilen löschen

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.

Beispiel

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.

Beispiel

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.

Beispiel

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.

 

Ende des Inhaltsbereichs