Der Schlüsselbefehl Read table im neuen ABAP mit Tabellenausdrücken

Aus SAP-Wiki
Wechseln zu:Navigation, Suche

Siehe Neues ABAP (ab Release 7.40).

Ab der ABAP-Version 7.40 gibt es auch interessante Alternativen zu "Read table" indem in eckigen Klammern "[[ <tabellenzeile> ]]" die Tabellenzeile angesprochen wird mit einem sogenannten "Tabellenausdruck".

Es kann eine Zeile oder auch genau ein Feld einer Zeile gelesen werden.

Lesen Tabellenzeile mit Index

Alte Syntax mit "Read table index"

Um eine interne Tabelle zu lesen, wird klassisch der Schlüsselbefehl "Read table index .." genutzt.

READ TABLE itab INDEX lv_index INTO wa.

Um dann ein Feld einer anzusprechen: Die Zeile der Tabelle wird gelesen und dann aus der Struktur das Feld angesprochen und der Zielvariablen zugewiesen.

READ TABLE itab INDEX lv_index INTO wa.

lv_feld = wa-feld.

Neue Syntax mit "itab[ index ]"

Erste Zeile wird gelesen mit "[ index ]". Zwischen dem eckigen Klammern und dem Zeilenindex steht jeweils ein Leerzeichen.

Data: ls_sflight type sflight.

ls_sflight = lt_sflight[ 1 ].

Bei einer Zuweisung zu einem Field-Symbol

Assign lt_sflight[ 1 ] to <fs_sflight>.

Man kann auch gleich ein Feld der Struktur zuweisen, was sehr elegant ist

Data: lv_carrid type sflight-carrd.

lv_carrid = lt_sflight[ 1 ]-carrid.

Wenn die Zeile nicht gefunden wird, wird die Exception CX_SY_ITAB_LINE_NOT_FOUND ausgelöst.

Folglich wird auch kein SY-SUBRC gesetzt. Entweder es wird eine Zeile gefunden (SY-SUBRC bleibt bei 0) oder es wird die Exception CX_SY_ITAB_LINE_NOT_FOUND ausgelöst.

Lesen Tabellenzeile mit Bedingung

Struktur einer Tabelle lesen

Es können mehrere Felder innerhalb der Klammern abgefragt werden.

wa = itab[ feld1 = .. feld2 = .. ].

oder auch auf mehrere Zeilen verteilt

wa = itab[ feld1 = ..
           feld2 = .. ].

Bei einer Zuweisung zu einem Field-Symbol

Assign itab[ feld1 = ..
             feld2 = .. ] to <fs>.

Bei einer Zuweisung zu einem Field-Symbol mit inline-Deklaration

Assign itab[ feld1 = ..
             feld2 = .. ] to field-symbol(<fs>).

Feld einer Struktur einer Tabelle lesen

Sehr elegant ist in der neuen Syntax, dass man den Rückgabewert einer Abfrage einer internen Tabelle als Bedingung nutzen kann.

Die Bedingung steht in "[ <Bedingung> ]".

Hier wird von der internen Tabelle LT_SVAL mit dessen Feld TABNAME abgefragt ob hier "EKPO" steht und ob der Wert des Feldes VALUE initial ist.

IF lt_sval[ tabname = 'EKPO' ]-value IS INITIAL.
  RETURN.
ENDIF.

oder hier wird der Warenempfänger aus der internen Tabelle LT_PARTN gelesen.

Data(lv_kunwe) = lt_partn[ PARTN_ROLE = 'WE' ]-PARTN_NUMB.

Keine Zeile gefunden - Ausnahme CX_SY_ITAB_LINE_NOT_FOUND

Man muss beim Tabellenausdruck mit der neuen ABAP-Syntax vorsichtig sein, wenn ein gesuchter Datensatz nicht vorhanden ist. Wenn der Datensatz nicht vorhanden ist, wird eine Ausnahme "CX_SY_ITAB_LINE_NOT_FOUND" ausgelöst und wenn man diese Ausnahme nicht abfängt, kommt es zu einem Laufzeitfehler.

cs_adressen-kunnr_mf = lt_vbpa[ parvw = 'MF' ]-kunnr.

Ausnahme

Hier war ein Partner "MF" nicht in der internen Tabelle LT_VBPA vorhanden.

Tabellenausdruck1.JPG

Behandlung mit TRY-ENDTRY-Fehlerbehandlung

Man könnte die Ausnahme abfangen mit einer TRY-ENDTRY-Fehlerbehandlung.

try.
  cs_adressen-kunnr_mf = lt_vbpa[ parvw = 'MF' ]-kunnr.

  catch CX_SY_ITAB_LINE_NOT_FOUND.
   ... (Fehlerbehandlung)
endtry.

Tabellenausdruck mit Zusatz OPTIONAL

Eleganter ist ab ABAP 7.40 SP8 der Zusatz "optional". Der Befehl funktioniert allerdings nur in Kombination mit "VALUE".

cs_adressen-kunnr_mf = value #( lt_vbpa[ parvw = 'MF' ]-kunnr OPTIONAL )

Web-Links

Literatur