Anfang des Inhaltsbereichs

Tabellenzeilen anhängen Dokument im Navigationsbaum lokalisieren

Es gibt mehrere Möglichkeiten, Zeilen an Index-Tabellen anzuhängen. Die folgenden Anweisungen haben keine Entsprechung für beliebige interne Tabellen.

Einzelne Zeilen anhängen

Um eine Tabellenzeile an eine Index-Tabelle anzuhängen verwendet man die Anweisung

APPEND <line> TO <itab>.

Dabei ist <line> entweder ein in den Zeilentyp konvertierbarer Arbeitsbereich <wa> oder der Ausdruck INITIAL LINE. Mit <wa> wird eine neue Zeile an die interne Tabelle <itab> angehängt und mit dem Inhalt des Arbeitsbereichs gefüllt. Mit INITIAL LINE wird eine typgerecht initialisierte Leerzeile angehängt. Nach jeder erfolgreichen APPEND-Anweisung enthält das Systemfeld SY-TABIX den Index der angehängten Zeile.

Bei Standard-Tabellen und sortierten Tabellen mit nicht eindeutigem Schlüssel funktioniert das Anhängen 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 angehängt werden soll. Ebenso kommt es zum Laufzeitfehler, wenn durch das Anhängen die Sortierreihenfolge einer sortierten Tabelle verletzt wird.

Mehrere Zeilen anhängen

Die APPEND-Anweisung erlaubt auch das Anhängen beliebiger interner Tabellen an Index-Tabellen:

APPEND LINES OF <itab1> TO <itab2>.

Diese Anweisung hängt die gesamte Tabelle ITAB1 an ITAB2 an. 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:

APPEND LINES OF <itab1> [FROM <n1>] [TO <n 2>] TO <itab2>.

<n 1 > und <n 2 > geben den Index der ersten bzw. letzten anzuhängenden Zeile von ITAB1 an.

Zeilen einer Tabelle mit APPEND an eine andere interne Tabelle anzuhängen, ist etwa um einen Faktor 3 bis 4 mal schneller, als sie in einer LOOP-Schleife zeilenweise anzuhängen. Nach der APPEND-Anweisung enthält das Systemfeld SY-TABIX den Index der zuletzt angehängten Zeile. Beim Anhängen mehrerer Zeilen an sortierte Tabellen, dürfen eindeutig definierte Tabellenschlüssel und die Sortierreihenfolge nicht verletzt werden, sonst kommt es zu Laufzeitfehlern.

Ranglisten

Mit der APPEND-Anweisung können in Standard-Tabellen Ranglisten erzeugt werden. Dazu beginnt man mit einer leeren Tabelle und verwendet:

APPEND <wa> TO <itab> SORTED BY <f>.

Die neue Zeile wird nicht als letzte Zeile der internen Tabelle <itab> angehängt, sondern die interne Tabelle wird absteigend nach Feld <f> sortiert. Der Arbeitsbereich <wa> muß hier kompatibel zum Zeilentyp der internen Tabelle sein. Der Zusatz SORTED BY ist nicht bei sortierten Tabellen möglich.

Mit dieser Anweisung kann die interne Tabelle maximal die beim Anlegen der Tabelle im Parameter INITIAL SIZE angegebene Anzahl von Zeilen enthalten. Dies ist eine Ausnahme von der allgemeinen Regel. Werden mehr Zeilen als angegeben hinzugefügt, wird die jeweils letzte Zeile verworfen. Dies ist nützlich beim Anlegen von Ranglisten mit begrenzter Länge (z.B. "Top Ten"). Typischerweise verwendet man die APPEND-Anweisung zum Erstellen von Ranglisten die nicht mehr als 100 Einträge enthalten. Für größere Listen empfiehlt es sich aus Performancegründen die Tabellen normal zu sortieren.

Beispiel

DATA: BEGIN OF wa,
        col1(1) TYPE c,
        col2 TYPE i,
      END OF wa.

DATA itab LIKE TABLE OF wa.

DO 3 TIMES.
  APPEND INITIAL LINE TO itab.
  wa-col1 = sy-index. wa-col2 = sy-index ** 2.
  APPEND wa TO itab.
ENDDO.

LOOP AT itab INTO wa.
  WRITE: / wa-col1, wa-col2.
ENDLOOP.

Die Listenausgabe ist:

          0
1         1
          0
2         4
          0
3         9

Es wird eine interne Tabelle ITAB mit zwei Spalten angelegt und in der DO-Schleife gefüllt. Bei jedem Schleifendurchgang wird erst eine Zeile mit Initialwerten angehängt, dann wird der Tabellenarbeitsbereich mit dem Schleifenindex und dem Quadrat des Schleifenindexes gefüllt und angehängt.

Beispiel

DATA: BEGIN OF line1,
        col1(3) TYPE c,
        col2(2) TYPE n,
        col3    TYPE i,
      END OF line1,
      tab1 LIKE TABLE OF line1.

DATA: BEGIN OF line2,
        field1(1)  TYPE c,
        field2     LIKE tab1,
      END OF line2,
      tab2 LIKE TABLE OF line2.

line1-col1 = 'abc'. line1-col2 = '12'. line1-col3 = 3.
APPEND line1 TO tab1.

line1-col1 = 'def'. line1-col2 = '34'. line1-col3 = 5.
APPEND line1 TO tab1.

line2-field1 = 'A'. line2-field2 = tab1.
APPEND line2 TO tab2.

REFRESH tab1.

line1-col1 = 'ghi'. line1-col2 = '56'. line1-col3 = 7.
APPEND line1 TO tab1.

line1-col1 = 'jkl'. line1-col2 = '78'. line1-col3 = 9.
APPEND line1 TO tab1.

line2-field1 = 'B'. line2-field2 = tab1.
APPEND line2 TO tab2.

LOOP AT tab2 INTO line2.
  WRITE: / line2-field1.
  LOOP AT line2-field2 INTO line1.
    WRITE: / line1-col1, line1-col2, line1-col3.
  ENDLOOP.
ENDLOOP.

Die Listenausgabe ist:

A
abc 12          3
def 34          5
B
ghi 56          7
jkl 78          9

Es werden zwei interne Tabellen TAB1 und TAB2 angelegt. TAB2 hat eine tiefe Struktur, da die zweite Komponente von LINE2 den Datentyp der Tabelle TAB1 hat. LINE1 wird gefüllt und an TAB1 angehängt. Anschließend wird LINE2 gefüllt und an TAB2 angehängt. Nachdem TAB1 mit der Anweisung REFRESH initialisiert wurde, wird der gleiche Vorgang wiederholt.

Beispiel

DATA: BEGIN OF line,
        col1(1) TYPE c,
        col2 TYPE i,
      END OF line.

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

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

APPEND LINES OF jtab FROM 2 TO 3 TO itab1.

LOOP AT itab1 INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

Die Listenausgabe ist:

1         1
2         4
3         9
2         8
3        27

Es werden zwei interne Tabellen gleichen Typs, ITAB und JTAB, angelegt. In der DO-Schleife wird ITAB mit einer Liste von Quadratzahlen, JTAB mit einer Liste von Kubikzahlen gefüllt. Anschließend werden die letzten beiden Zeilen von JTAB an ITAB angehängt.

Beispiel

DATA: BEGIN OF line3,
        col1 TYPE i,
        col2 TYPE i,
        col3 TYPE i,
       END OF line3.

DATA itab2 LIKE TABLE OF line3 INITIAL SIZE 2.

line3-col1 = 1. line3-col2 = 2. line3-col3 = 3.
APPEND line3 TO itab2 SORTED BY col2.

line3-col1 = 4. line3-col2 = 5. line3-col3 = 6.
APPEND line3 TO itab2 SORTED BY col2.

line3-col1 = 7. line3-col2 = 8. line3-col3 = 9.
APPEND line3 TO itab2 SORTED BY col2.

LOOP AT itab2 INTO line3.
  WRITE: / line3-col2.
ENDLOOP.

Die Listenausgabe ist:

         8
         5

Es werden drei Zeilen mit der Anweisung APPEND und dem Zusatz SORTED BY einer internen Tabelle ITAB hinzugefügt. Die Zeile mit dem kleinsten Wert des Felds COL2 fällt weg, da die Anzahl der Zeilen für diese APPEND-Anweisung mit INITIAL SIZE auf zwei festgelegt ist.

 

 

Ende des Inhaltsbereichs