Anfang des Inhaltsbereichs

Tabellenzeilen lesen Dokument im Navigationsbaum lokalisieren

Um eine einzelne Zeile einer beliebigen Tabelle auszulesen, verwendet man die Anweisung

READ TABLE <itab> <key> <result>.

In beliebigen Tabellen können Zeilen nur über einen Schlüssel und nicht über den Index gesucht werden. Mit der Angabe <key> wird der Suchschlüssel angegeben. Die Angabe <result> bestimmt, wie mit einer gefundenen Zeile verfahren wird.

Falls ein Eintrag gefunden wird, wird SY-SUBRC auf Null, ansonsten auf Vier gesetzt, falls er nicht durch einen Zusatz beeinflußt wird. Bei Index-Tabellen wird SY-TABIX auf den Index der gefundenen Zeile gesetzt. Wird bei nicht eindeutigen Schlüsseln ein doppelter Eintrag gefunden, wird der erste Eintrag genommen.

Angabe des Suchschlüssels

Als Suchschlüssel kann der Tabellenschlüssel oder ein anderer Schlüssel angegeben werden.

Verwendung des Tabellenschlüssels

Um den Tabellenschlüssel der Tabelle <itab> als Suchschlüssel zu verwenden, ist <key> wie folgt anzugeben:

READ TABLE <itab> FROM <wa> <result>.

oder als:

READ TABLE <itab> WITH TABLE KEY <k 1> = <f 1>... <k n> = <f n> <result>.

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.

Im zweiten Fall werden die Werte für jedes Schlüsselfeld explizit angegeben. Es dürfen keine identischen Schlüsselangaben mehrfach vorgenommen werden. 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. Falls der Zeilentyp der internen Tabelle unstrukturiert ist, kann ein Vergleich mit der Pseudokomponenten table_line angegeben werden:

READ TABLE <itab> WITH TABLE KEY table_line = <f> <result>.

Der Inhalt der gesamten Tabellenzeilen werden mit dem Inhalt des Felds <f> verglichen. Falls <f> nicht kompatibel zum Zeilentyp der Tabelle ist, wird der Wert in den Zeilentyp konvertiert. Dieser Suchschlüssel ermöglicht es bestimmte Zeile auch in solchen internen Tabellen zu finden, deren Zeilentyp nicht strukturiert ist, also ein Einzelfeld oder ein interner Tabellentyp ist.

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 Schlüsselwerte angegeben werden.

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

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

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

Der Eintrag wird über den Hash-Algorithmus der internen Tabelle bestimmt, wobei die Laufzeit nicht von der Anzahl der Tabellenzeilen abhängt.

Verwendung eines anderen Suchschlüssels

READ TABLE <itab> WITH KEY <k 1> = <f 1>... <k n> = <f n> <result>.

Der Suchschlüssel besteht aus beliebigen Tabellenfeldern <k 1 >...<k n >. Falls der Name einer Komponente erst zur Laufzeit bekannt ist, kann er dynamisch über (<n i >) = <f i > als Inhalt eines Felds <n i > angegeben werden. Ist <n i > bei der Ausführung der Anweisung leer, wird das Suchfeld ignoriert. Falls die Datentypen von <f i > nicht kompatibel zu den Komponenten sind, findet eine Konvertierung statt. Alle Komponenten des Suchschlüssels können durch die Angabe von Offset und Länge weiter auf Teilfelder eingegrenzt werden.

Falls der Zeilentyp der internen Tabelle unstrukturiert ist, kann wie oben ein Vergleich mit der Pseudokomponenten table_line angegeben werden. Ebenso können die Attribute von Objekten als Schlüssel angegegen werden.

Die Suche erfolgt für alle Tabellenarten linear, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhängt.

Angabe des Ausgabeverhaltens

Das Ausgabeverhalten spezifiziert, was mit einer gefundenen Zeile passiert.

Verwendung eines Arbeitsbereichs

Um die gefundene Zeile in einen Arbeitsbereich zu schreiben, gibt man das Ausgabeverhalten <result> wie folgt an:

READ TABLE <itab> <key> INTO <wa> [COMPARING <f 1> <f 2>...
                                             |ALL FIELDS]
                                  [TRANSPORTING <f1> <f 2>...
                                                |ALL FIELDS
                                                |NO FIELDS].

Ohne die Zusätze COMPARING oder TRANSPORTING muß der Inhalt der Tabellenzeile in den Datentyp des Arbeitsbereichs <wa> konvertierbar sein. Bei der Angabe von COMPARING oder TRANSPORTING müssen Zeilentyp und Arbeitsbereich kompatibel sein. Es empfiehlt sich, immer einen zum Zeilentyp kompatiblen Arbeitsbereich zu verwenden.

Mit dem Zusatz COMPARING wird erreicht, daß bei strukturierten Zeilentypen die angegebenen Tabellenfelder <f i > vor dem Transport mit den entsprechenden Feldern des Arbeitsbereichs verglichen werden. Durch die Angabe ALL FIELDS werden alle Teilfelder verglichen. Wird ein Eintrag mit dem angegeben Suchschlüssel <key> gefunden und ist der Inhalt der verglichenen Felder gleich, gibt SY-SUBRC den Wert 0 zurück. Sind die Inhalte nicht gleich, gibt SY-SUBRC den Wert 2 zurück. Findet das System keinen Eintrag, gibt SY-SUBRC den Wert 4 zurück. Ein gefundener Eintrag wird unabhängig vom Ergebnis des Vergleichs in den Zielbereich gelesen.

Mit dem Zusatz TRANSPORTING kann man bei strukturierten Zeilentypen angeben, welche Tabellenfelder <f i > in den Arbeitsbereich transportiert werden sollen. Durch die Angabe ALL FIELDS, werden wie ohne die Angabe von TRANSPORTING die Inhalte aller Felder transportiert. Durch die Angabe NO FIELDS, werden keine Felder transportiert. Im letzten Fall dient die READ-Anweisung also nur dazu, die Systemfelder SY-SUBRC und bei Index-Tabellen SY-TABIX zu füllen. Die Angabe des Arbeitsbereichs <wa> mit TRANSPORTING NO FIELDS ist also nicht notwendig und sollte weggelassen werden.

In beiden Zusätzen können die Felder <f i > auch dynamisch über (<n i >) als Inhalt eines Felds <n i > angegeben werden. Ist <n i > bei der Ausführung der Anweisung leer, wird es ignoriert. Alle Felder <f i > können durch die Angabe von Offset und Länge weiter auf Teilfelder eingegrenzt werden.

Verwendung eines Feldsymbols

Um die gefundene Zeile einem Feldsymbol zuzuweisen, gibt man das Ausgabeverhalten <result> wie folgt an:

READ TABLE <itab> <key> ASSIGNING <FS>.

Nach der READ-Anweisung zeigt das Feldsymbol auf die Tabellenzeile. Wenn der Zeilentyp strukturiert ist, empfiehlt es sich, das Feldsymbol bei der Deklaration entsprechend zu typisieren, damit auf die Komponenten der Zeilen zugegriffen werden kann. Falls eine statische Typisierung nicht möglich ist, muß für den Zugriff auf die Komponenten von Strukturen mit weiteren Feldsymbolen und der Möglichkeit Strukturen komponentenweise zuzuweisen gearbeitet werden.

Mehr Informationen zur Zuweisung von Tabellenzeilen an Feldsymbole befinden sich unter Zugriff über Feldsymbole.

Beispiel

REPORT demo_int_tables_read_comparing.

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 = 2.
line-col2 = 3.

READ TABLE itab FROM line INTO line COMPARING col2.

WRITE: 'SY-SUBRC =', sy-subrc.
SKIP.
WRITE: / line-col1, line-col2.

Die Listenausgabe ist:

SY-SUBRC =    2

         2        4

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefüllt. Der zum Zeilentyp kompatible Arbeitsbereich LINE wird mit den Zahlen 2 und 3 gefüllt. In der READ-Anweisung wird die Zeile der Tabelle gefunden, in der das Schlüsselfeld COL1 den gleichen Inhalt wie der Arbeitsbereich hat und in diesen kopiert. SY-SUBRC ist zwei, da beim Vergleich des Felds COL2 unterschiedliche Zahlen gefunden werden.

Beispiel

REPORT demo_int_tables_read_transport .

DATA: BEGIN OF line,
        col1 TYPE i,
        col2 TYPE i,
      END OF line.

DATA itab LIKE SORTED 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.

CLEAR line.

READ TABLE itab WITH TABLE KEY col1 = 3
                INTO line TRANSPORTING col2.

WRITE:   'SY-SUBRC =', sy-subrc,
       / 'SY-TABIX =', sy-tabix.
SKIP.
WRITE: / line-col1, line-col2.

Die Listenausgabe ist:

SY-SUBRC =    0
SY-TABIX =       3

         0        9

Eine sortierte Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In der READ-Anweisung wird die Zeile der Tabelle gelesen, in der das Schlüsselfeld COL1 den Wert 3 hat. Es wird nur der Inhalt von COL2 in den Arbeitsbereich LINE kopiert. SY-SUBRC ist Null und SY-TABIX ist drei, da ITAB eine Index-Tabelle ist.

Beispiel

REPORT demo_int_tables_read_transp_no .

DATA: BEGIN OF line,
        col1 TYPE i,
        col2 TYPE i,
      END OF line.

DATA itab LIKE SORTED 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.

READ TABLE itab WITH KEY col2 = 16  TRANSPORTING NO FIELDS.

WRITE:   'SY-SUBRC =', sy-subrc,
       / 'SY-TABIX =', sy-tabix.

Die Listenausgabe ist:

SY-SUBRC =    0
SY-TABIX =       4

Eine sortierte Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In der READ-Anweisung wird die Zeile der Tabelle gesucht, in der das Feld COL2 den Wert 16 hat. Es wird nicht der Tabellenschlüssel verwendet. Es werden keine Felder in einen Arbeitsbereich kopiert und keine Zeilen einem Feldsymbol zugewiesen. Es werden lediglich Systemfelder gesetzt. SY-SUBRC ist Null, da eine Zeile gefunden wurde und SY-TABIX ist vier.

Beispiel

REPORT demo_int_tables_read_assigning .

DATA: BEGIN OF line,
        col1 TYPE i,
        col2 TYPE i,
      END OF line.

DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1.

FIELD-SYMBOLS <fs> LIKE LINE OF itab.

DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.

READ TABLE itab WITH TABLE KEY col1 = 2 ASSIGNING <fs>.

<fs>-col2 = 100.

LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

Die Listenausgabe ist:

         1        1
         2      100
         3        9
         4       16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In der READ-Anweisung wird die Zeile der Tabelle gelesen, in der das Schlüsselfeld COL1 den Wert 2 hat und dem Feldsymbol <FS> zugewiesen. Der Komponente COL2 von <FS> wird der Wert 100 zugewiesen. Dadurch ändert sich auch das entsprechende Tabellenfeld.

 

 

Ende des Inhaltsbereichs