Anfang des Inhaltsbereichs

Zielbereich angeben Dokument im Navigationsbaum lokalisieren

Die INTO-Klausel definiert den Zielbereich, in den die Selektion der SELECT-Klausel geschrieben wird. Als Zielbereich kommen Variablen in Frage, deren Datentyp kompatibel oder zumindest konvertibel zur Selektion der SELECT-Klausel sein muß.

Die SELECT-Klausel bestimmt den Datentyp des Zielbereichs wie folgt:

Diese Grafik wird im zugehörigen Text erklärt

Bei der Selektion einer einzelnen Zeile muß der Zielbereich flach sein. Bei der Selektion mehrerer Zeilen kann der Zielbereich tabellenartig oder flach sein. Bei flachem Zielbereich muß dann eine SELECT-Schleife ausgeführt werden.

Bei der Selektion aller Spalten muß der Zielbereich eine Struktur oder dazu konvertibel sein. Bei der Selektion einzelner Spalten kann der Zielbereich eine Komponente einer Struktur oder ein Einzelfeld sein.

Die elementaren Datentypen in der Selektion der SELECT-Klausel sind Dictionary Typen. Die Dictionary Typen müssen in die ABAP Datentypen der entsprechenden elementaren Komponenten des Zielbereichs konvertierbar sein. Eine entsprechende Tabelle findet sich unter Datentypen im ABAP Dictionary.

Flachen Arbeitsbereich angeben

Ein flacher Arbeitsbereich kann beim Lesen von Einzelzeilen oder beim Lesen mehrerer Zeilen in einer SELECT-Schleife angegeben werden. Um einen flachen Arbeitsbereich als Zielbereich anzugeben, schreibt man für die INTO-Klausel:

SELECT... INTO [CORRESPONDING FIELDS OF] <wa> ...

Der Arbeitsbereich <wa> muß mindestens genauso groß wie die einzulesende Zeile sein. Sonst gibt es keine Einschränkungen seines Datentyps. Der Datentyp sollte gemäß der Vorgaben in der SELECT-Klausel so gewählt werden, daß die Inhalte der gelesenen Spalten in <wa> adressierbar sind.

Falls bei der Spaltenangabe in der SELECT-Klausel ein Stern (*) für alle Spalten steht, werden die gelesenen Daten linksbündig und gemäß der Struktur der Datenbanktabelle zugewiesen. Die Struktur von <wa> spielt bei dieser Zuweisung keine Rolle. Damit nach der SELECT-Anweisung auf die Werte der einzelnen Spalten zugegriffen werden kann, sollte der Arbeitsbereich die gleiche Struktur wie die Datenbanktabelle haben.

Falls bei der Spaltenangabe in der SELECT-Klausel einzelne Spalten oder Aggregatausdrücke stehen, werden die gelesenen Spalten linksbündig, gemäß der Struktur des Arbeitsbereichs in dessen Komponenten geschrieben.

Beim Einlesen wird der vorhandene Inhalt von <wa> überschrieben. Nicht betroffene Teile von <wa> behalten aber ihren alten Wert.

Bei strukturierten Arbeitsbereichen kann der Zusatz CORRESPONDING FIELDS eingesetzt werden. Mit dem Zusatz werden nur die Inhalte namensgleicher Felder komponentenweise von der Selektion dem Arbeitsbereich zugewiesen. Dabei werden eventuelle alternative Spaltennamen der Selektion berücksichtigt. Der Zusatz CORRESPONDING FIELDS schränkt nicht die von der Datenbank gelesenen Spalten ein, sondern nur welche Daten aus der Selektion in das ABAP-Programm übernommen werden. Die gelesenen Spalten können nur der SELECT-Klausel eingeschränkt werden.

Falls alle Spalten einer einzigen Datenbanktabelle <dbtab> durch einen Stern (*) in der SELECT-Klausel gelesen werden, kann die INTO-Klausel leer sein. Die SELECT-Anweisung schreibt die Daten dann standardmäßig in den Tabellenarbeitsbereich, der den gleichen Namen <dbtab> wie die Datenbanktabelle hat. Der Tabellenarbeitsbereich muß mit der Anweisung TABLES deklariert werden. Die Deklaration eines solchen Arbeitsbereich war vor Release 4.0 notwendig um überhaupt mit Open SQL-Anweisung auf Datenbanktabellen zugreifen zu können und er wurde häufig als impliziter Arbeitsbereich eingesetzt. Heute spielt er noch eine Rolle als Schnittstellen-Arbeitsbereich und sollte nicht mehr als Arbeitsbereich in der SELECT-Anweisung verwendet werden. Wie bei internen Tabellen ohne Kopfzeilen trägt auch hier eine Namenstrennung zwischen Quell- und Zielbereichen zur Klarheit der Programmierung bei.

Interne Tabellen angeben

Eine interne Tabelle kann beim Lesen mehrerer Zeilen angegeben werden. Um eine interne Tabelle als Zielbereich anzugeben, schreibt man für die INTO-Klausel:

SELECT... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE <itab>
                          [PACKAGE SIZE <n>]
...

Für den Zeilentyp der internen Tabelle <itab>, die Art und Weise, wie die Daten einer Zeile der Selektion einer Tabellenzeile zugewiesen werden, und für den Zusatz CORRESPONDING FIELDS gilt das gleiche wie für flache Arbeitsbereiche (siehe oben).

Die interne Tabelle wird mit allen Zeilen der Selektion gefüllt. Dabei werden bei Verwendung von INTO alle bereits vorhandenen Zeilen gelöscht und bei Verwendung von APPENDING die neuen Zeilen in die bereits vorhandenen Zeilen eingefügt. Das Einfügen von Zeilen bei APPENDING erfolgt typgerecht für jede Tabellenart. Nicht betroffene Felder der internen Tabelle werden mit typgerechten Initialwerten gefüllt.

Mit dem Zusatz PACKAGE SIZE werden die Zeilen der Selektion nicht auf einmal, sondern paketweise in die interne Tabelle geschrieben. Es können Pakete von <n> Zeilen definiert werden, die eines nach dem anderen in die Tabelle geschrieben werden. Bei der Verwendung von INTO ersetzt ein Paket jeweils das vorherige. Bei der Verwendung von APPENDING werden die Pakete nacheinander eingefügt. Dies kann nur in einer Schleife geschehen, die mit ENDSELECT abgeschlossen werden muß. Der Inhalt einer paketweise gefüllten internen Tabelle ist außerhalb der SELECT-Schleife nicht festgelegt. Die Verarbeitung der gelesenen Zeilen muß innerhalb der Schleife programmiert werden.

Einzelfelder angeben

Falls in der SELECT-Klausel einzelne Spalten oder Aggregatausdrücke als Spaltenangabe gemacht sind, können Einzelfelder beim Lesen von Einzelzeilen oder beim Lesen mehrerer Zeilen in einer SELECT-Schleife angegeben werden. Um Einzelfelder als Zielbereich anzugeben, schreibt man für die INTO-Klausel:

SELECT... INTO (<f 1>, <f 2>,...) ...

Es müssen genau so viele Einzelfelder <fi> angegeben werden, wie die Liste in der SELECT-Klausel an Spalten und Aggregatausdrücken enthält. Die Felder der SELECT-Klausel werden von links nach rechts den Einzelfeldern der INTO-Klausel zugewiesen.

Falls mit einer Liste in der SELECT-Klausel gearbeitet wird, muß nicht unbedingt eine Liste von Einzelfeldern angegeben werden, sondern es kann auch mit dem Zusatz CORRESPONDING FIELDS mit flachen Arbeitsbereichen oder internen Tabellen gearbeitet werden. Dann muß der Zielbereich nicht unbedingt gleich viele Elemente enthalten wie die Liste in der SELECT-Klausel.

Beispiel

Flache Strukturen als Zielbereich

DATA wa TYPE spfli.

SELECT *
  INTO wa
  FROM spfli.

  WRITE: / wa-carrid...

ENDSELECT.

Es wird eine flache Struktur des gleichen Datentyps wie die Datenbanktabelle SPFLI als Zielbereich einer SELECT-Schleife verwendet. Innerhalb der Schleife kann typgerecht auf den Inhalt der einzelnen Spalten zu gegriffen werden.

DATA spfli TYPE spfli.

SELECT  *
  FROM  spfli.

  WRITE: / spfli-carrid...

ENDSELECT.

Es wird eine Struktur SPFLI deklariert, die den gleichen Namen wie die zu lesende Datenbanktabelle hat. In der SELECT-Schleife wird implizit diese Struktur als Zielbereich verwendet. Hier besteht die Gefahr, zu übersehen, daß in der Schleife ein ABAP-Datenobjekt verarbeitet wird und nicht die Datenbank selbst.

Beispiel

Interne Tabelle als Zielbereich

REPORT demo_select_into_table.

DATA: BEGIN OF wa,
         carrid   TYPE spfli-carrid,
         connid   TYPE spfli-connid,
         cityfrom TYPE spfli-cityfrom,
         cityto   TYPE spfli-cityto,
      END OF wa,
      itab LIKE SORTED TABLE OF wa
                WITH NON-UNIQUE KEY cityfrom cityto.

SELECT carrid connid cityfrom cityto
  INTO CORRESPONDING FIELDS OF TABLE itab
  FROM spfli.

IF sy-subrc EQ 0.
  WRITE: / sy-dbcnt, 'Connections'.
  SKIP.
  LOOP AT itab INTO wa.
    WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto.
  ENDLOOP.
ENDIF.

Die Listenausgabe ist:

Diese Grafik wird im zugehörigen Text erklärt

Es wird eine sortierte Tabelle ITAB, die vier Felder mit gleichem Namen und gleichem Datentyp wie die Datenbanktabelle SPFLI hat als Zielbereich verwendet. Durch den Zusatz CORRESPONDING FIELDS werden die Spalten der SELECT-Klausel in die richtigen Felder der Tabelle übertragen und gleichzeitig nach dem Tabellenschlüssel von ITAB sortiert.

Beispiel

Einlesen von Paketen in interne Tabellen

REPORT demo_select_into_package.

DATA: wa   TYPE spfli,
      itab TYPE SORTED TABLE OF spfli
                WITH UNIQUE KEY carrid connid.

SELECT carrid connid
  FROM spfli
  INTO CORRESPONDING FIELDS OF TABLE itab
       PACKAGE SIZE 3.

  LOOP AT itab INTO wa.
    WRITE: / wa-carrid, wa-connid.
  ENDLOOP.

  SKIP 1.

ENDSELECT.

Die Listenausgabe ist:

Diese Grafik wird im zugehörigen Text erklärt

Es werden Pakete von je 3 Zeilen in die sortierte Tabelle ITAB gelesen. Innerhalb jedes Durchgangs der SELECT-Schleife hat die interne Tabelle einen anderen sortierten Inhalt.

Bei Verwendung von APPENDING statt INTO sähe die Listenausgabe übrigens so aus:

Diese Grafik wird im zugehörigen Text erklärt

Bei jedem Schleifendurchgang wird ein weiteres Paket in die interne Tabelle einsortiert.

Beispiel

Einzelfelder als Zielbereich.

REPORT demo_select_single_fields.

DATA:   average TYPE p DECIMALS 2,
        sum     TYPE p DECIMALS 2.

SELECT AVG( luggweight ) SUM( luggweight )
  INTO (average, sum)
  FROM sbook.

WRITE: / 'Average:', average,
       / 'Sum    :', sum.

Die Listenausgabe ist:

Diese Grafik wird im zugehörigen Text erklärt

In der SELECT-Klausel sind zwei Aggregatausdrücke zur Berechnung von Durchschnittswert und Summe der Felder LUGGWEIGHT in der Datenbanktabelle SBOOK angegeben. Die beiden Felder AVERAGE und SUM werden als Zielbereich verwendet.

Beispiel

Alternativnamen verwenden.

REPORT demo_select_as.

DATA: BEGIN OF luggage,
        average TYPE p DECIMALS 2,
        sum     TYPE p DECIMALS 2,
      END OF luggage.

SELECT AVG( luggweight ) AS average SUM( luggweight ) AS sum
  INTO CORRESPONDING FIELDS OF luggage
  FROM sbook.

WRITE: / 'Average:', luggage-average,
       / 'Sum    :', luggage-sum.

Die Listenausgabe ist:

Diese Grafik wird im zugehörigen Text erklärt

Das Beispiel hat die gleiche Funktionalität wie vorhergehendes, nur daß hier statt einer Liste von Einzelfeldern eine Struktur als Zielbereich angegeben wird und daß die Namen der Strukturkomponenten als Alternativnamen in der SELECT-Klausel verwendet werden.

 

 

Ende des Inhaltsbereichs