Ansicht
Dokumentation

ABAPREAD_TABLE_OUTDESC - READ TABLE OUTDESC

ABAPREAD_TABLE_OUTDESC - READ TABLE OUTDESC

CL_GUI_FRONTEND_SERVICES - Frontend Services   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

READ TABLE, result

Kurzreferenz



... ${ INTO wa $[transport_options$] $}
  $| ${ ASSIGNING <fs> $[CASTING$] $}
  $| ${ REFERENCE INTO dref $}
  $| ${ TRANSPORTING NO FIELDS $}.

Alternativen:

1. ... INTO wa $[transport_options$]

2. ... ASSIGNING <fs> $[CASTING$]

3. ... REFERENCE INTO dref

4. ... TRANSPORTING NO FIELDS

Ausgabeverhalten

Wirkung

Definiert das Ausgabeverhalten einer READ-Anweisung für eine interne Tabelle. Für das Ausgabeverhalten gibt es vier Alternativen:

  • Mit dem Zusatz INTO wird der Inhalt der gefundenen Zeile einem Arbeitsbereich zugewiesen. Dieser Zusatz ist bei jeder Art der Angabe von itab möglich.
  • Mit dem Zusatz ASSIGNING wird die gefundene Zeile einem Feldsymbol <fs> zugewiesen. Dieser Zusatz ist nur möglich, wenn für itab eine vorhandene interne Tabelle angegeben ist.
  • Mit dem Zusatz REFERENCE INTO wird eine Referenz auf die gefundene Zeile in eine Referenzvariable gestellt. Dieser Zusatz ist nur möglich, wenn für itab eine vorhandene interne Tabelle angegeben ist.
  • Mit dem Zusatz TRANSPORTING NO FIELDS werden nur die zugehörigen Systemfelder gefüllt. Dieser Zusatz ist bei jeder Art der Angabe von itab möglich.

Hinweis

Außerhalb von Klassen kann der Zusatz INTO auch zusammen mit TRANSPORTING NO FIELDS angegeben werden, führt aber zu einer Warnung bei der Syntaxprüfung.

Alternative 1

... INTO wa $[transport_options$]


Wirkung

Der Inhalt der gefundenen Zeile wird dem Arbeitsbereich wa zugewiesen. Für wa kann angegeben werden:

  • Ein vorhandener Arbeitsbereich, der zum Zeilentyp der internen Tabelle passt. Der Zeilentyp muss kompatibel zum Datentyp des Arbeitsbereich oder in diesem konvertierbar sein. Wenn der Arbeitsbereich mit dem Zeilentyp der internen Tabelle inkompatibel ist, wird der Inhalt der Tabellenzeile nach den Konvertierungsregeln in den Datentyp des Arbeitsbereichs konvertiert.
  • Eine Inline-Deklaration DATA(var) oder FINAL(var), wobei ein Arbeitsbereich vom Zeilentyp der internen Tabelle deklariert wird. Der Zeilentyp muss statisch vollständig erkennbar sein.

Wird keine Zeile gefunden, bleibt wa unverändert bzw. initial. Wenn bei der Zuweisung an wa ein Konvertierungsfehler auftritt, ist die Ausnahme nicht über CX_SY_CONVERSION_ERROR behandelbar, sondern es kommt direkt zum zugehörigen Laufzeitfehler.

Bei Verwendung der Zusätze transport_options muss der Arbeitsbereich wa kompatibel zum Zeilentyp der internen Tabelle sein.

Hinweis

Für READ TABLE gibt es außerhalb noch eine obsolete Kurzform, bei der die Angabe INTO wa weggelassen werden kann, falls die interne Tabelle eine gleichnamige Kopfzeile itab hat. Die Anweisung wird dann implizit um INTO itab ergänzt. Diese Kurzform ist unabhängig von der obsoleten Schlüsselangabe, bei der ebenfalls die Kopfzeile ausgewertet wird.

Beispiel

Auslesen einer bestimmten Zeile der internen Tabelle sflight_tab und Zuweisung an einen inline deklarierten Arbeitsbereich sflight_wa. Nach erfolgreicher Zuweisung wird der Inhalt einer Komponente der Zeile in der internen Tabelle geändert.

Alternative 2

... ASSIGNING <fs> $[CASTING$]


Wirkung

Die gefundene Tabellenzeile wird einem Feldsymbol zugewiesen. Das Feldsymbol zeigt nach der Anweisung READ TABLE auf die Tabellenzeile im Speicher. Der Zusatz kann nicht angegeben werden, wenn itab als Rückgabewert bzw. Resultat einer funktionalen Methode, eines Konstruktorausdrucks oder eines Tabellenausdrucks angegeben ist, da dieser Wert nach Ausführung der Anweisung nicht mehr vorhanden ist.

Für <fs> kann angegeben werden:

  • Ein vorhandenes Feldsymbol, dessen Typisierung zum Zeilentyp der internen Tabelle passt. Mit dem optionalen Zusatz CASTINGa kann ein Casting durchgeführt werden. Er hat die gleiche Bedeutung, wie wenn er ohne weitere Zusätze bei der Anweisung ASSIGN angegeben ist: Das Feldsymbol muss entweder vollständig oder mit einem der generischen eingebauten ABAP-Typen c, n, p oder x typisiert sein. Die zugewiesene Tabellenzeile wird auf den Typ des Feldsymbols gecastet. Dabei können die gleichen Ausnahmen wie bei ASSIGN auftreten.
  • Eine Inline-Deklaration FIELD-SYMBOL(<fs>), wobei ein Feldsymbol vom Zeilentyp der internen Tabelle deklariert wird. Wenn dieser nicht statisch festgestellt werden kann, wird das Feldsymbol mit dem generischen Typ any deklariert und ihm wird initial die Konstante space zugewiesen. Der Zusatz CASTING ist hinter einer Inline-Deklaration nicht möglich.

Wenn keine Zeile gefunden wird, bleibt <fs> unverändert bzw. initial.

So lange das Feldsymbol auf die Zeile zeigt, ändern Zuweisungen an das Feldsymbol die Zeile der internen Tabelle. Dabei gelten bezüglich der Modifikation von Schlüsselfeldern der primären und sekundären Tabellenschlüssel folgende Einschränkungen:

  • Die Schlüsselfelder des primären Tabellenschlüssels von sortierten Tabellen und Hash-Tabellen sind schreibgeschützt und dürfen nicht manipuliert werden, da ansonsten die interne Tabellenverwaltung invalidiert wird. Entsprechende Versuche führen in der Regel zu einer unbehandelbaren Ausnahme.

  • Die Schlüsselfelder eines sekundären Tabellenschlüssels sind dagegen nur dann schreibgeschützt, während der sekundäre Tabellenschlüssel verwendet wird. Dies ist innerhalb von LOOP-Schleifen und bei Verwendung der Anweisung MODIFY der Fall, bei denen der sekundäre Tabellenschlüssel hinter USING KEY angegeben ist. Ansonsten sind die Schlüsselfelder nicht schreibgeschützt.

Die Verwaltung von eindeutigen Sekundärschlüsseln wird nach einer Modifikation von Einzelzeilen beim nächsten Zugriff auf die internen Tabelle (delayed update) und von nicht-eindeutigen Sekundärschlüsseln bei der nächsten expliziten Verwendung des sekundären Tabellenschlüssels (lazy update) aktualisiert. Die Überprüfung der Eindeutigkeit eines Sekundärschlüssels findet erst zum Zeitpunkt der Aktualisierung statt. Eine interne Tabelle kann sich nach einer Modifikation einzelner Zeilen also in einem inkonsistenten Zustand bezüglich der Sekundärschlüssel befinden, der erst bei der nächsten Verwendung der Tabelle zu einer Ausnahme führt. Wenn die nächste Verwendung nicht unmittelbar nach der Modifikation erfolgt, können Sekundärschlüssel mit Methoden der Klasse CL_ABAP_ITAB_UTILITIES explizit aktualisiert werden, um eventuelle Ausnahmen an Ort und Stelle zu behandeln.

Die Verwaltung von eindeutigen Sekundärschlüsseln wird nach einer Modifikation von Einzelzeilen über Feldsymbole beim nächsten Zugriff auf die interne Tabelle (delayed update) und von nicht-eindeutigen Sekundärschlüsseln bei der nächsten expliziten Verwendung des sekundären Tabellenschlüssels (lazy update) aktualisiert. Die Überprüfung der Eindeutigkeit eines Sekundärschlüssels findet erst zum Zeitpunkt der Aktualisierung statt. Eine interne Tabelle kann sich nach einer Modifikation einzelner Zeilen über Feldsymbole also in einem inkonsistenten Zustand bezüglich der Sekundärschlüssel befinden, der erst bei der nächsten Verwendung der Tabelle zu einer Ausnahme führt. Wenn die nächste Verwendung nicht unmittelbar nach der Modifikation erfolgt, können Sekundärschlüssel mit Methoden der Klasse CL_ABAP_ITAB_UTILITIES explizit aktualisiert werden, um eventuelle Ausnahmen an Ort und Stelle zu behandeln.

Hinweise

  • Die Typisierung des Feldsymbols muss zum Zeilentyp der internen Tabelle passen.
  • Wenn die READ-Anweisung erfolgreich ist (sy-subrc hat den Wert 0) ist garantiert, dass das Feldsymbol direkt nach Ausführung der Anweisung auf einen Speicherbereich zeigt. Eine Abfrage mit IS ASSIGNED ist dort nicht notwendig.
  • Es ist sicherer, den Rückgabewert sy-subrc auszuwerten, als IS ASSIGNED zu verwenden, da dem Feldsymbol schon ein Speicherbereich zugewiesen sein kann. Dies trifft insbesondere bei Inline-Deklarationen zu.
  • Wenn die Zeile, auf die das Feldsymbol zeigt, gelöscht wird, ist dem Feldsymbol kein Speicherbereich mehr zugewiesen und es kann nicht mehr statt eines Datenobjekts verwendet werden. Wenn das Feldsymbol nicht direkt hinter READ-Anweisung verwendet wird, kann also eine Überprüfung mit IS ASSIGNED sinnvoll sein.

Beispiel

Auslesen einer bestimmten Zeile der internen Tabelle sflight_tab und Zuweisung an ein inline deklariertes Feldsymbol sflight>. Nach erfolgreicher Zuweisung wird der Inhalt einer Komponente der Zeile in der internen Tabelle geändert. Siehe auch das Beispiel zur Zuweisung eines Tabellenausdrucks an ein Feldsymbol.

Alternative 3

... REFERENCE INTO dref


Wirkung

Es wird eine Referenz auf die gefundene Tabellenzeile in die Datenreferenzvariable dref gestellt. Der Zusatz kann nicht angegeben werden, wenn itab als Rückgabewert bzw. Resultat einer funktionalen Methode, oder eines Tabellenausdrucks eines Konstruktorausdrucks angegeben ist, da dieser Wert nach Ausführung der Anweisung nicht mehr vorhanden ist.

Für dref kann angegeben werden:

  • Eine vorhandene Datenreferenzvariable, deren statischer Typ kompatibel zum Zeilentyp der internen Tabelle oder der generische Typ data ist.
  • Eine Inline-Deklaration DATA(var) oder FINAL(var), wobei eine Datenreferenzvariable deklariert wird, deren statischer Typ der Zeilentyp der internen Tabelle ist. Der Zeilentyp muss statisch vollständig erkennbar sein.

Wenn keine Zeile gefunden wird, bleibt <dref> unverändert bzw. initial.

Durch Dereferenzierung der Datenreferenz kann der Inhalt der gefundenen Tabellenzeile ausgewertet und verändert werden. Es gelten die gleichen Einschränkungen bezüglich der Modifikation von Schlüsselfeldern der primären und sekundären Tabellenschlüssel wie beim Zugriff über Feldsymbole (siehe Zusatz ASSIGNING).

Hinweise

  • Wenn die READ-Anweisung erfolgreich ist (sy-subrc hat den Wert 0) ist garantiert, dass die Datenreferenzvariable direkt nach Ausführung der Anweisung auf eine Zeile zeigt. Eine Abfrage mit IS BOUND ist dort nicht notwendig.
  • Der REFERENCE INTO ist neben der Anweisung GET REFERENCE und dem Referenzierungsoperator REF die einzige Möglichkeit, Stack-Referenzen zu erzeugen. Stack-Referenzen können ungültig werden, wenn das referenzierte Datenobjekt gelöscht wird.
  • Bei Anwendung auf interne Tabellen im Heap erzeugt REFERENCE INTO speichererhaltende Heap-Referenzen.
  • Alle Referenzen (Heap- und Stack-Referenzen), die auf Zeilen interner Tabellen zeigen, können ungültig werden, wenn die Zeilen gelöscht werden. Wenn ein Datenreferenzvariable nicht direkt hinter READ-Anweisung verwendet wird, kann also eine Überprüfung mit IS BOUND sinnvoll sein.

Beispiel

Auslesen einer bestimmten Zeile der internen Tabelle sflight_tab und Zuweisung einer Referenz auf die gefundene Zeile an die inline deklarierte Datenreferenzvariable sflight_ref. Nach erfolgreicher Zuweisung wird der Inhalt einer Komponente der Zeile in der internen Tabelle geändert.

Alternative 4

... TRANSPORTING NO FIELDS


Wirkung

Mit dem Zusatz TRANSPORTING NO FIELDS überprüft die Anweisung READ TABLE lediglich, ob die gesuchte Zeile vorhanden ist, und füllt die Systemfelder sy-subrc sowie sy-tabix. Auf den Inhalt einer gefundenen Zeile kann dadurch nicht zugegriffen werden.

Hinweise

  • Zum Feststellen der Zeilennummer im Tabellenindex kann auch die Tabellenfunktion line_index verwendet werden.

Beispiel

Überprüfung, ob eine bestimmte Zeile der internen Tabelle sflight_carr vorhanden ist und Zuweisung der Zeilennummer im primären Tabellenindex der gefundenen Zeile in sy-tabix an idx.








ROGBILLS - Synchronize billing plans   ROGBILLS - Synchronize billing plans  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 20341 Date: 20240523 Time: 142738     sap01-206 ( 296 ms )