ABAP-Expertise: Einfach und schnell Daten aus internen Tabellen entfernen

Wenn Du mit der Programmiersprache ABAP arbeitest, weißt Du wahrscheinlich, wie wichtig es ist, Deine Daten effizient und sicher im ABAP-Programm zu verwalten. In vielen Fällen musst Du Daten aus internen Tabellen löschen, um Platz zu schaffen. In diesem Artikel möchte ich Dir gerne zeigen, wie Du schnell und effizient Daten aus internen Tabellen löschen kannst. Es ist unerheblich, ob Du Daten in einer Zeile, eine Zeile oder die gesamte interne Tabelle löschen willst.

Im Artikel „Die wichtigsten Operationen auf interne Tabellen – ABAP“ findest Du zudem eine Übersicht der wichtigsten Konstruktor Operatoren in ABAP 7.40.

Daten in einer Zeile einer internen Tabelle löschen

Damit Du Daten in einer Zeile aus einer internen Tabelle löschen kannst, musst Du zuerst die notwendige Zeile bzw. Arbeitsbereich aus der internen Tabelle selektieren. Anschließend kannst Du die Daten entfernen und die Zeile aktualisieren. Bei einem Feldsymbol wird die Zeile automatisch aktualisiert.

READ

DATA: lt_spfli  TYPE SORTED TABLE OF spfli
               WITH UNIQUE KEY carrid connid
               WITH NON-UNIQUE SORTED KEY city_key
                               COMPONENTS cityfrom cityto,
      lt_spfli2 LIKE lt_spfli.

" Feldsymbol
READ TABLE lt_spfli
           WITH TABLE KEY city_key
                COMPONENTS cityfrom = 'FRANKFURT' cityto = 'NEW YORK'
           ASSIGNING FIELD-SYMBOL(<fs_spfli>).

IF sy-subrc = 0.
  CLEAR <fs_spfli>-fltype.
ENDIF.

" Arbeitsbereich
READ TABLE lt_spfli2
           WITH TABLE KEY city_key
                COMPONENTS cityfrom = 'FRANKFURT' cityto = 'NEW YORK'
           INTO DATA(ls_spfli2).

IF sy-subrc = 0.
  CLEAR ls_spfli2-fltype.
  MODIFY TABLE lt_spfli2 FROM ls_spfli2.
ENDIF.

LOOP

LOOP AT lt_spfli ASSIGNING FIELD-SYMBOL(<fs_spfli>)
  WHERE cityfrom = 'FRANKFURT'
  AND cityto = 'NEW YORK'.

  CLEAR <fs_spfli>-fltype.

ENDLOOP.

Zeile einer internen Tabelle löschen

Mit dem ABAP-Befehl DELETE kannst Du eine Zeile in einer internen Tabelle löschen.

DELETE {{ TABLE lt_itab { FROM wa }
	| { WITH TABLE KEY c1 = d1 c2 = d2 …}}
	| { lt_itab INDEX index }}.

Dabei gibt es erneut zwei Möglichkeiten:

  • Angabe eines Schlüssels (Arbeitsbereich oder Schlüsselkomponente)
  • Index

Struktur – FROM

" Zeile aus internen Tabelle lt_itab löschen deren Schlüssel der Struktur ls_workarea entsprechen
DELETE TABLE lt_itab FROM ls_workarea.

Schlüssel – WITH TABLE KEY

" Alle Zeilen aus der internen Tabelle entfernen, deren Attribut key1 'Primärschlüssel Teil 1' und key2 'Primärschlüssel Teil 2' entsprechen
DELETE TABLE lt_itab WITH TABLE KEY key1 = 'Primärschlüssel Teil 1' key2 = 'Primärschlüssel Teil 2'.

Index – INDEX

" Zeile mit dem Index 1 löschen (1. Zeile aus internen Tabelle entfernen)
DELETE lt_itab INDEX 1.

Bedingung – WHERE

" Alle Zeilen löschen deren Attribut component1 leer ist
DELETE lt_itab WHERE component1 IS INITIAL.
" Alle Zeilen löschen, die im gültigen Bereich basierend vom Systemdatum sind
" Das Startdatum ist kleiner gleich dem aktuellen Datum
" Das Enddatum ist größer gleich dem aktuellen Datum
DELETE lt_itab WHERE begin_date <= sy-datum AND end_date >= sy-datum.

Nicht Bedingung – WHERE NOT

" Alle Zeilen löschen, die nicht die Bedingung erfüllen
DELETE lt_itab WHERE NOT valid_flag = 'X'.

Bereich – IN VALUE rseloption

" Alle Zeilen löschen, deren Attribut key1 nicht 'ERP_UP' entsprechen
DELETE lt_itab WHERE NOT key1 IN VALUE rseloption( ( sign   = 'I'
                                                     option = 'EQ'
                                                     low    = 'ERP_UP'
                                                     high   = '' ) ).

Es wurde der Tabellentyp RSELOPTION verwendet. Dabei handelt es sich um einen Tabellentyp, der SELECT-OPTIONS für Tabellen abbildet. Diesen Tabellentyp kann man anstelle von RANGES verwenden. Das ist deshalb notwendig, da die Verwendung von RANGES obsolet ist. Ein RANGE definiert eine spezielle interne Tabelle vom Typ STANDARD TABLE mit Kopfzeile zur Abbildung von Intervallen (z.B. für SELECT-OPTIONS und WHERE … IN).

Folgende Tabellentypen kann man anstelle von RANGES verwenden:

  • RSELOPTION
  • CMS_TAB_BII_CAG_TYP_RNG
  • FIWTIN_T_SELOPT
  • PIQ_SELOPT_T
  • PSI_WE_SELOPT_TT

Folgende Zeilentypen kann man anstelle von RANGES verwenden:

  • RSDSSELOPT
  • RSIS_S_RANGE
  • SELOPT

Mehrere Bereich – IN VALUE rseloption

" Alle Zeilen löschen, deren Attribut key1 mit 'ERP' und 'UP' beginnen
DELETE lt_itab WHERE NOT key1 IN VALUE rseloption( ( sign   = 'I'
                                                     option = 'CP'
                                                     low    = 'ERP*'
                                                     high   = '' )
                                                   ( sign   = 'I'
                                                     option = 'CP'
                                                     low    = 'UP*'
                                                     high   = '' ) ).

Muster – CP

" Alle Zeilen löschen deren Attribut key1 Werte enthält, die mit "ERP" beginnen
DELETE lt_itab WHERE key1 CP 'ERP*'.

Insgesamt kann man dabei weitere Vergleichsoperatoren für zeichenartige Operatoren verwenden. Insgesamt stehen folgende zur Verfügung:

OperatorAusgeschriebenBedeutung
COContains OnlyEnthält nur Zeichen
CNContains Not OnlyEnthält nicht nur Zeichen (CO ist falsch)
CAContains AnyEnthält mindestens ein Zeichen
NAContains Not AnyEnthält kein Zeichen (CA ist falsch)
CSContains StringInhalt ist enthalten
NSContains No StringEnthält nicht den Inhalt (CS ist falsch)
CPCovers PatternInhalt passt zum Muster
NPNo PatternInhalt passt nicht zum Muster (CP ist falsch)

Dynamische Bedingung – LOOP stringtab

" Dynamische WHERE-Bedingungen mit Stringtab
DATA(lt_where) = VALUE stringtab( ( |key1 = 'ERP_UP'| )
                                  ( |begin_date <= sy-datum AND end_date >= sy-datum| )
                                  ( |NOT valid_flag = 'X'| ) ).

LOOP AT lt_where ASSIGNING FIELD-SYMBOL(<fs_where>).

  TRY.
      " Dynamisches Löschen - Dynamische WHERE-Bedingungen
      DELETE lt_itab WHERE (<fs_where>).
    CATCH cx_root INTO DATA(ex_text).
      MESSAGE ex_text->get_text( ) TYPE 'E'.
  ENDTRY.

ENDLOOP.

Interne Tabelle löschen

Man kann natürlich auch über den DELETE-Befehl mehre Zeilen oder gar die ganze interne Tabelle löschen.

DELETE itab [FROM table_index1] [TO table_index2] [WHERE bedingung].

Durch FROM und TO wird ein Bereich aus Tabellenindizes angegeben, auf die das DELETE beschränkt werden soll. Durch WHERE wiederrum wird ein logischer Ausdruck angegeben, der das Löschen von Zeilen in der internen Tabelle einschränkt. Gerade beim DELETE-Befehl sollte man sehr vorsichtig sein und stets eine Bedingung mit WHERE angeben, damit man nur die Datensätze löscht, die man löschen möchte.

Beim Löschen von Zeilen in internen Tabellen mit DELETE wird normalerweise kein Speicher in der internen Tabelle freigegeben. Dazu müssen Anweisungen wie CLEAR oder FREE verwendet werden. Mehr dazu findest Du im Artikel „Die wichtigsten Operationen auf interne Tabellen – ABAP“.

Interne Tabelle leeren – DELETE

DELETE lt_itab.

Interne Tabelle über Bereich leeren – IN VALUE rseloption

" Alle Einträge in internen Tabelle löschen
DELETE lt_itab WHERE key1 IN VALUE rseloption( ).

Über den Autor

Andreas Geiger

Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.

Mehr zu ERP UP

ERP UP unterstützen

Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.

Schreibe einen Kommentar