[ABAP] Daten aus einer internen Tabelle löschen

Typen & Daten

* Typen
TYPES : BEGIN OF ty_s_sflight,
          carrid   TYPE sflight-carrid,
          connid   TYPE sflight-connid,
          seatsmax TYPE sflight-seatsmax,
          flag     TYPE abap_bool,
        END OF ty_s_sflight.

TYPES: ty_it_sflight TYPE STANDARD TABLE OF ty_s_sflight WITH DEFAULT KEY.

* Daten
DATA(it_sflight) = VALUE ty_it_sflight( ).

* Select
SELECT carrid,
       connid,
       seatsmax,
       CASE WHEN seatsmax > 200 THEN @abap_true " CASE-Anweisung zum Setzen der Spalte "flag"
       END AS flag
  INTO TABLE @it_sflight
  FROM sflight.

Variante 1 (INDEX)

* Eintrag mit Index 1
DELETE it_sflight INDEX 1.

cl_demo_output=>display( it_sflight ).

Variante 2 (Struktur)

* Genau einen Eintrag entsprechend der Struktur
DELETE TABLE it_sflight FROM VALUE #( carrid = 'LH' connid = '400' seatsmax = 280 flag = abap_true ).

cl_demo_output=>display( it_sflight ).

Variante 3 (TABLE KEY)

* Einträge mit Primärschlüssel aus Tabelle löschen
DELETE TABLE it_sflight WITH TABLE KEY carrid = 'LH' connid = '400' flag = abap_true.

cl_demo_output=>display( it_sflight ).

Variante 4 (WHERE)

* Alle Einträge mit leerem flag löschen
DELETE it_sflight WHERE flag IS INITIAL.
* Alle Einträge innerhalb eines Bereiches löschen
DELETE it_sflight WHERE seatsmax > 200 AND seatsmax < 350.
* Alle Einträge die nicht der Bedingung entsprechen
DELETE it_sflight WHERE NOT carrid = 'AA'.

cl_demo_output=>display( it_sflight ).

Variante 5 (RANGE)

* alle Carrier, die nicht 'AA' sind aus der iTab löschen
DELETE it_sflight WHERE NOT carrid IN VALUE rseloption( ( sign   = 'I'
                                                          option = 'EQ'
                                                          low    = 'AA'
                                                          high   = '' ) ).

cl_demo_output=>display( it_sflight ).

Variante 6 (RANGE mit Pattern)

* Alle Einträge beginnend mit 'A' und 'L' löschen
DELETE it_sflight WHERE carrid IN VALUE rseloption( ( sign   = 'I'
                                                      option = 'CP'
                                                      low    = 'A*'
                                                      high   = '' )
                                                    ( sign   = 'I'
                                                      option = 'CP'
                                                      low    = 'L*'
                                                      high   = '' ) ).

cl_demo_output=>display( it_sflight ).

Variante 7 (RANGE leer)

* Achtung: löscht alle Einträge in it_sflight!
DELETE it_sflight WHERE carrid IN VALUE rseloption( ).

cl_demo_output=>display( it_sflight ).

Variante 8 (Pattern CP)

* alle Einträge, deren carrid mit 'L' beginnen
DELETE it_sflight WHERE carrid CP 'L*'.

cl_demo_output=>display( it_sflight ).

Variante 9 (dynamische WHERE-Condition)

* Stringtab mit WHERE-Conditions -> Leerzeichen beachten!
DATA(it_where) = VALUE stringtab(
                                  ( |testfehler = 'AA'| )
                                  ( |carrid EQ 'AA' AND connid CP '001*' | )
                                  ( |seatsmax > 300| )
                                ).

LOOP AT it_where ASSIGNING FIELD-SYMBOL(<w>).

  WRITE: / <w>.

  TRY.
* dynamische WHERE-Condition ausführen
* fehlerhafte WHERE-Conditions werfen eine Exception
      DELETE it_sflight WHERE (<w>).
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

ENDLOOP.

cl_demo_output=>display( it_sflight ).

Variante 10 (Pseudokomponente TABLE_LINE)

* Die Tabellenzeile mit der Struktur ty_s_sflight wird gelöscht
DELETE it_sflight WHERE table_line = VALUE ty_s_sflight( carrid = 'LH' connid = '400' seatsmax = 280 flag = abap_true ).

cl_demo_output=>display( it_sflight ).

Variante 11 (CO [Contains Only])

* Carrier darf nur Zeichen 'A' und/oder 'Z' und/oder ' ' enthalten
* -> löscht Einträge für 'AA ', 'AZ '
DELETE it_sflight WHERE carrid CO 'AZ '.

cl_demo_output=>display( it_sflight ).