Anfang des InhaltsbereichsTabellenzeilen über den Index einfügen Dokument im Navigationsbaum lokalisieren

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-TABIX gesetzt.

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 muß 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 <n 2>] INTO <itab2>
                        [INDEX <idx>].

<n 1 > und <n 2 > 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.

Beispiel

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