Mit Hilfe der Anweisung INSERT können eine oder mehrere Zeilen in interne Tabellen eingefügt werden:
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.
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.
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.
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.
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:
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.
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.
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.
Mehrere 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.
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.