Tabellenzeilen verdichtet einfügen 

Mit folgender Anweisung lassen sich verdichtete interne Tabellen ohne duplikative Einträge erstellen:

COLLECT <wa> INTO <itab>.

Der Zeilentyp von <itab> muß flach strukturiert und alle nicht zum Tabellenschlüssel gehörigen Felder müssen einen numerischen Typ (F, I, P) haben. Die einzufügende Zeile wird als zum Zeilentyp kompatibler Arbeitsbereich angegeben.

Beim Einfügen wird überprüft ob schon ein zum Tabellenschlüssel passender Tabelleneintrag vorliegt. Wenn nicht, hat die Anweisung COLLECT die gleiche Wirkung wie beim Tabellenzeilen einfügen. Liegt aber schon ein Eintrag vor, fügt COLLECT keine neue Zeile ein, sondern addiert den Inhalt der numerischen Felder des Arbeitsbereichs zum Inhalt der entsprechenden Felder des vorhandenen Eintrags.

Um verdichtete Tabellen zu erstellen sollte ausschließlich mit COLLECT gearbeitet werden um Zeilen einzufügen. Falls dazwischen andere Anweisungen zum Einfügen von Zeilen verwendet werden können doppelte Einträge auftreten.

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

Ist COLLECT die erste Füll-Anweisung für eine Standard-Tabelle, wird intern eine temporäre Hash-Verwaltung generiert, die bereits vorhandene Zeilen lokalisiert. Diese Hash-Verwaltung lebt so lange, bis eine andere Anweisung den Inhalt von Schlüsselfeldern oder die Reihenfolge der Zeilen in der internen Tabelle ändert. Danach werden bereits vorhandene Einträge über eine lineare Suche lokalisiert, deren Laufzeit nicht unabhängig von der Anzahl bereits vorhandener Zeilen ist, sondern linear von ihr abhängt. Das Systemfeld SY-TABIX enthält nach COLLECT den Index der eingefügten bzw. verdichteten Zeile.

Bereits vorhandene Zeilen werden mit binärer Suche lokalisiert. Die Laufzeit hängt logarithmisch von der Anzahl bereits vorhandener Zeilen ab. Das Systemfeld SY-TABIX enthält nach COLLECT den Index der eingefügten bzw. verdichteten Zeile.

Bereits vorhandene Zeilen werden mit dem Hash-Algorithmus der internen Tabelle lokalisiert. Das Systemfeld SY-TABIX enthält nach COLLECT den Wert 0, da Hash-Tabellen keinen linearen Index haben.

REPORT demo_int_tables_collect .

DATA: BEGIN OF line,
        col1(3) TYPE c,
        col2(2) TYPE n,
        col3    TYPE i,
      END OF line.

DATA itab LIKE SORTED TABLE OF line
          WITH NON-UNIQUE KEY col1 col2.

line-col1 = 'abc'. line-col2 = '12'. line-col3 = 3.
COLLECT line INTO itab.
WRITE / sy-tabix.

line-col1 = 'def'. line-col2 = '34'. line-col3 = 5.
COLLECT line INTO itab.
WRITE / sy-tabix.

line-col1 = 'abc'. line-col2 = '12'. line-col3 = 7.
COLLECT line INTO itab.
WRITE / sy-tabix.

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

Die Listenausgabe ist:

         1

         2

         1

abc 12          10

def 34           5

Eine sortierte Tabelle wird verdichtet gefüllt. Die ersten beiden COLLECT-Anweisungen wirken wie normale Füll-Anweisungen. In der dritten COLLECT-Anweisung wird die erste Zeile von ITAB geändert. Die folgende Abbildung verdeutlicht die drei Schritte: