Show TOC

Zielbereich angebenLocate this document in the navigation structure

DieINTO -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 muss.

DieSELECT -Klausel bestimmt den Datentyp des Zielbereichs wie folgt:

  • Die Zeilenangabelines derSELECT -Klausel bestimmt die Tiefe des Zielbereichs, also ob er flach oder tabellenartig ist.
  • Die Spaltenangabecols derSELECT -Klausel bestimmt die Struktur (Zeilentyp) des Zielbereichs.

Bei der Selektion einer einzelnen Zeile muss der Zielbereich flach sein. Bei der Selektion mehrerer Zeilen kann der Zielbereich tabellenartig oder flach sein. Bei flachem Zielbereich muss dann eineSELECT -Schleife ausgeführt werden.

Bei der Selektion aller Spalten muss 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 derSELECT -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

Um einen flachen Arbeitsbereich als Zielbereich anzugeben, schreibt man für die INTO -Klausel:

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

Der Arbeitsbereich
wa
muss mindestens genauso groß wie die einzulesende Zeile sein. Beim Einlesen wird der vorhandene Inhalt von wa überschrieben. Nicht betroffene Teile vonwa behalten aber ihren alten Wert.

Bei strukturierten Arbeitsbereichen kann der ZusatzCORRESPONDING 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.

Interne Tabellen angeben

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] ...

Die interne Tabelle wird mit allen Zeilen der Selektion gefüllt. Dabei werden bei Verwendung vonINTO alle bereits vorhandenen Zeilen gelöscht und bei Verwendung vonAPPENDING die neuen Zeilen in die bereits vorhandenen Zeilen eingefügt.

Mit dem ZusatzPACKAGE 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.

Einzelfelder angeben

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

SELECT ... INTO (f1, f2, ...) ...

Es müssen genau so viele Einzelfelder f 1 ,  f 2 , …angegeben werden, wie die Liste in derSELECT -Klausel an Spalten und Aggregatausdrücken enthält. Die Felder derSELECT -Klausel werden von links nach rechts den Einzelfeldern derINTO -Klausel zugewiesen.

Tipp

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 einerSELECT -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 Strukturspfli deklariert, die den gleichen Namen wie die zu lesende Datenbanktabelle hat. In derSELECT -Schleife wird implizit diese Struktur als Zielbereich verwendet. Hier besteht die Gefahr, zu übersehen, dass in der Schleife ein ABAP-Datenobjekt verarbeitet wird und nicht die Datenbank selbst.

Tipp

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:

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

Tipp

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:

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

Bei Verwendung vonAPPENDING stattINTO sähe die Listenausgabe übrigens so aus:

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

Tipp

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:

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

Tipp

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:

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