Anfang des InhaltsbereichsTabellenzeilen 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> = <f 1>... <k n> = <f n>.

Im ersten Fall muß <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 (<n i >) = <f i > als Inhalt eines Felds <n i > angegeben werden. Falls die Datentypen von <f i > nicht kompatibel zu den Schlüsselfeldern sind, findet eine Konvertierung statt.

Die Suche erfolgt für die einzelnen Tabellenarten wie folgt:

Der zu löschende Eintrag wird linear gesucht, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhängt.

Der zu löschende Eintrag wird binär gesucht, wobei die Laufzeit logarithmisch von der Anzahl der Tabellenzeilen abhängt.

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 <cond> erfüllen. Der logische Ausdruck <cond> kann aus verschiedenen Vergleichen zusammengesetzt sein. In jedem einzelnen Vergleich muß 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> <f 2>...
                                             |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:

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.

 

 

Ende des Inhaltsbereichs