Show TOC Anfang des Inhaltsbereichs

Tabellenzeilen einfügen  Dokument im Navigationsbaum lokalisieren

Mit Hilfe der Anweisung INSERT können eine oder mehrere Zeilen in interne Tabellen eingefügt werden:

Einzelne Zeilen einfügen

Um eine Tabellenzeile in eine beliebige Tabelle einzufügen, verwendet man die Anweisung:

INSERT line INTO TABLE itab.

Dabei ist line entweder ein zum Zeilentyp kompatibler Arbeitsbereich oder der Ausdruck INITIAL LINE. Die Forderung der Kompatibilität des Arbeitsbereichs ergibt sich daraus, dass die Felder des Tabellenschlüssels typgerecht versorgt werden müssen. Mit INITIAL LINE wird eine typgerecht initialisierte Leerzeile eingefügt.

Falls die interne Tabelle einen eindeutigen Schlüssel hat, werden Zeilen, deren Schlüssel in der Tabelle schon vorhanden ist, nicht eingefügt und sy-subrc wird auf 4 gesetzt. Bei erfolgreichem Einfügen ist sy-subrc gleich 0.

Das Einfügen erfolgt für die einzelnen Tabellenarten wie folgt:

·        Standard-Tabellen

Die Zeile wird als letzte Zeile an die interne Tabelle angehängt. Die Anweisung arbeitet wie die spezifische Anweisung APPEND zum Zeilen anhängen.

·        Sortierte Tabellen

Die Zeile wird gemäß Tabellenschlüssel in die Tabelle einsortiert. Bei nicht eindeutigem Schlüssel wird an der obersten Stelle von eventuell vorhandenen Duplikaten eingefügt. Die Laufzeit hängt logarithmisch von der Anzahl bereits vorhandener Tabelleneinträge ab.

·        Hash-Tabellen

Die Zeile wird gemäß Tabellenschlüssel in die interne Hash-Verwaltung der Tabelle eingefügt.

Mehrere Zeilen einfügen

Um mehrere Tabellenzeilen auf einmal in eine beliebige Tabelle einzufügen, verwendet man die Anweisung:

INSERT LINES OF itab1 [FROM n1] [TO n2] INTO TABLE itab2.

Dabei sind itab1 und itab2 Tabellen mit kompatiblem Zeilentyp. Es werden die Zeilen der Tabelle itab1 nach den gleichen Regeln wie beim Einfügen einer einzelnen Zeile hintereinander in die Tabelle itab2 eingefügt.

Falls itab1 eine Index-Tabelle ist, können über n1 und n2 die Indexe der ersten bzw. letzten anzuhängenden Zeile von itab1 angegeben werden.

Die Methode, Zeilen einer Tabelle in eine andere einzufügen kann je nach Größe der Tabellen und an welcher Stelle eingefügt wird um bis zu einen Faktor 20 schneller sein, als in einer Schleife zeilenweise einzufügen.

Beispiele

Beispiel

Einzelne Zeilen einfügen.

REPORT demo_int_tables_insert.

DATA: BEGIN OF line,
        land(3)  TYPE c,
        name(10) TYPE c,
        age      TYPE i,
        weight   TYPE p DECIMALS 2,
      END OF line.

DATA itab LIKE SORTED TABLE OF line
          WITH NON-UNIQUE KEY land name age weight.

line-land = 'G'.   line-name   = 'Hans'.
line-age  = 20.    line-weight = '80.00'.
INSERT line INTO TABLE itab.

line-land = 'USA'. line-name   = 'Nancy'.
line-age  = 35.    line-weight = '45.00'.
INSERT line INTO TABLE itab.

line-land = 'USA'. line-name   = 'Howard'.
line-age  = 40.    line-weight = '95.00'.
INSERT line INTO TABLE itab.

line-land = 'GB'.  line-name   = 'Jenny'.
line-age  = 18.    line-weight = '50.00'.
INSERT line INTO TABLE itab.

line-land = 'F'.   line-name   = 'Michele'.
line-age  = 30.    line-weight = '60.00'.
INSERT line INTO TABLE itab.

line-land = 'G'.   line-name   = 'Karl'.
line-age  = 60.    line-weight = '75.00'.
INSERT line INTO TABLE itab.

LOOP AT itab INTO line.
  WRITE: / line-land, line-name, line-age, line-weight.
ENDLOOP.

Die Listenausgabe ist: :

F   Michele            30             60,00
G   Hans               20             80,00
G   Karl               60             75,00
GB  Jenny              18             50,00
USA Howard             40             95,00
USA Nancy              35             45,00

In eine sortierte interne Tabelle werden einzelne Zeilen eingefügt.

Beispiel

Mehrere Zeilen einfügen

REPORT demo_int_tables_insert_lines.

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

DATA: itab LIKE STANDARD TABLE OF line,
      jtab LIKE SORTED TABLE OF line
           WITH NON-UNIQUE KEY col1 col2.

DO 3 TIMES.
  line-col1 = sy-index. line-col2 = sy-index ** 2.
  APPEND line TO itab.
  line-col1 = sy-index. line-col2 = sy-index ** 3.
  APPEND line TO jtab.
ENDDO.

INSERT LINES OF itab INTO TABLE jtab.

LOOP AT jtab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

Die Listenausgabe ist: :

         1         1          1
         2         1          1
         3         2          4
         4         2          8
         5         3          9
         6         3         27

Es werden zwei interne Tabellen vom gleichen Zeilentyp aber unterschiedlicher Tabellenart angelegt und jeweils mit drei Zeilen gefüllt. Danach wird die gesamte Tabelle itab in die sortierte Tabelle jtabeinsortiert.

Tabellenzeilen über den Index einfügen

Die Anweisung INSERT, die auch zum Einfügen von Zeilen in beliebige Tabellen dient, erlaubt auch das Ändern über den Zeilenindex. Es können eine oder mehrere Zeilen über den Index in Index-Tabellen eingefügt werden:

Einzelne Zeilen einfügen

Um eine Tabellenzeile in eine Index-Tabelle einzufügen verwendet man die Anweisung:

INSERT line INTO itab [INDEX idx].

Dabei ist line entweder ein in den Zeilentyp konvertierbarer Arbeitsbereich wa oder der Ausdruck INITIAL LINE. Mit wa wird eine neue Zeile in die interne Tabelle itab eingefügt und mit dem Inhalt des Arbeitsbereichs gefüllt. Mit INITIAL LINE wird eine typgerecht initialisierte Leerzeile eingefügt.

Bei Verwendung der Option INDEX, wird die neue Zeile vor der Zeile mit dem Index idx eingefügt. Die neue Zeile erhält den Index idx und der Index aller folgenden Zeilen wird um 1 erhöht. Besteht die Tabelle aus idx - 1 Zeilen, wird die neue Zeile hinter der letzten Zeile angehängt. Hat die Tabelle weniger als idx - 1 Zeilen, kann die neue Zeile nicht eingefügt werden und sy-subrc wird auf 4 gesetzt. Bei erfolgreichem Einfügen ist sy-subrc gleich 0.

Ohne den Zusatz INDEX kann obige Anweisung nur innerhalb einer LOOP-Schleife verwendet werden. Dann wird die neue Zeile vor der aktuellen Zeile eingefügt. idx wird also implizit auf sy-tabixgesetzt.

Bei Standard-Tabellen und sortierten Tabellen mit nicht-eindeutigem Schlüssel funktioniert das Einfügen unabhängig davon, ob schon eine Zeile mit dem gleichen Tabellenschlüssel existiert oder nicht. Es kann zu doppelten Einträgen kommen. Bei sortierten Tabellen mit eindeutigem Schlüssel wird ein Laufzeitfehler erzeugt, wenn eine bereits vorhandene Zeile nochmals eingefügt werden soll. Ebenso kommt es zum Laufzeitfehler, wenn durch das Einfügen die Sortierreihenfolge einer sortierten Tabelle verletzt wird.

Mehrere Zeilen einfügen

Um mehrere Tabellenzeilen auf einmal in ein Index-Tabelle einzufügen verwendet man die Anweisung:

INSERT LINES OF itab1 INTO itab2 [INDEX idx].

Diese Anweisung fügt die Zeilen der gesamten Tabelle itab1 nach den gleichen Regeln wie beim Einfügen einer einzelnen Zeile hintereinander in itab2 ein. Die Tabellenart von itab1 ist beliebig. Der Zeilentyp von itab1 muss in den Zeilentyp von itab2 konvertierbar sein.

Wenn eine Index-Tabelle an eine andere Index-Tabelle angehängt wird, können die anzuhängenden Zeilen spezifiziert werden:

INSERT LINES OF itab1 [FROM n1] [TO n2] INTO itab2
                      [INDEX idx].

n1 und n2 geben den Index der ersten bzw. letzten einzufügenden Zeile von itab1 an

Die Methode, Zeilen einer Tabelle in eine andere einzufügen kann je nach Größe der Tabellen und an welcher Stelle eingefügt wird um bis zu einen Faktor 20 schneller sein, als in einer Schleife zeilenweise einzufügen.

Beispiel

REPORT demo_int_tables_insert_ind_1.

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

DATA itab LIKE TABLE OF line.

DO 2 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.

line-col1 = 11. line-col2 = 22.
INSERT line INTO itab INDEX 2.

INSERT INITIAL LINE INTO itab INDEX 1.

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

Die Listenausgabe ist:

         1          0          0
         2          1          1
         3         11         22
         4          2          4

Es wird eine interne Tabelle itab angelegt und mit zwei Zeilen gefüllt. Eine neue Zeile wird vor der zweiten Zeile eingefügt. Eine Zeile mit Initialwerten wird vor der ersten Zeile eingefügt.

BeispielMehrere Zeilen über Index einfügen

REPORT demo_int_tables_insert_ind_2.

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

DATA itab LIKE TABLE OF line.

DO 2 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.

LOOP AT itab INTO line.
  line-col1 = 3 * sy-tabix. line-col2 = 5 * sy-tabix.
  INSERT line INTO itab.
ENDLOOP.

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

Die Listenausgabe ist:

         1         3          5
         2         1          1
         3         9         15
         4         2          4

Es wird eine interne Tabelle itab angelegt und mit zwei Zeilen gefüllt. In einer LOOP-Schleife wird vor jeder vorhandenen Zeile eine neue Zeile eingefügt.

Beispiel

REPORT demo_int_tables_insert_ind_3.

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

DATA: itab LIKE TABLE OF line,
      jtab LIKE itab.

DO 3 TIMES.
  line-col1 = sy-index. line-col2 = sy-index ** 2.
  APPEND line TO itab.
  line-col1 = sy-index. line-col2 = sy-index ** 3.
  APPEND line TO jtab.
ENDDO.

INSERT LINES OF itab INTO jtab INDEX 1.

LOOP AT jtab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

Die Listenausgabe ist: :

         1         1          1
         2         2          4
         3         3          9
         4         1          1
         5         2          8
         6         3         27

Es werden zwei interne Tabellen vom gleichen Typ angelegt und jeweils mit drei Zeilen gefüllt. Danach wird die gesamte Tabelle itab vor der ersten Zeile von jtab eingefügt.

Ende des Inhaltsbereichs