Interne Tabelle

From Sapwiki

Jump to: navigation, search

Interne Tabellen sind ein zentrales Konzept der ABAP-Programmierung. Sie dienen der Datenhaltung in Form gleichartiger Zeilen innerhalb eines Programmes.

  • Zeilen stets gleichen Typs (im ggs. Extract)
  • Das EVA-Prinzip

... wenn man zum Beispiel Daten nicht sofort, sondern erst zur Ausgabe nachliest, und anschließend die Anforderung gestellt wird, nach diesem Begriff auch zu sortieren, sind umfangreiche Programmänderungen nötig.

  • Vergleich mit Arays
  • Vergleich mit COBOL
  • Dynamische Speicherverwaltung

Inhaltsverzeichnis

Zugriffsarten

  • Sequentielles Abarbeiten
  • Direktzugriff mit Index
  • Direktzugriff mit Schlüssel

Tabellenschlüssel

  • Explizite Schlüssel
  • Implizite Schlüssel

Arten von Tabellen

Standard

Diese Art erlaubt sozusagen alles. Die Zeilen brauchen auf keine Art sortiert zu sein, es können auch beliebig viele gleiche Zeilen vorhanden sein. Ein Tabellenschlüssel muss nicht angegeben werden.

Der Zugriff kann sequentiell, über Index oder Schlüssel erfolgen.

Das Zufügen von Zeilen kann über APPEND oder INSERT erfolgen.

Sorted

Bei dieser Art ergeben sich Restriktionen beim Zufügen. Sowohl beim APPEND als auch beim INSERT (mit Index) muss sichergestellt sein, dass die Sortierung korrekt bleibt. Ein Tabellenschlüssel muss angegeben werden.

Der Zugriff kann sequentiell, über Index oder Schlüssel erfolgen.

Das Zufügen von Zeilen kann über APPEND oder INSERT erfolgen.

Hash

Dieser Typ dient speziell dem schnellen Zugriff über den Schlüssel. ...................

Zugriff auf Tabellenzeilen

Auf den Rumpf einer internen Tabelle kann nicht direkt zugegriffen werden.

Kopfzeile

Arbeitsbereich

Feldsymbol

Der Glaubenskrieg (;-)

In älteren Programmen findete sich häufig noch der Zusatz with header line, dies sollte vermieden und stattdessen eine explizite workarea benutzt werden. Weiterhin sollte man sich innerhalb eines Projektes auf eine Namenskonvention zu internen Tabellen und den zugehörigen Workareas einigen.

Definition von Tabellen

Deklarationsanweisungen

OCCURS

Die älteste Methode zur Deklaration von Tabellen ist die OCCURS-Klausel der DATA-Anweisung. Durch diese wird auch gleichzeitig die Kopfzeile angelegt.

data: begin of it_example occurs 0,
        mandt type mandt,    
      end of it_example.

Tabellentyp

... TYPE TABLE OF ...

Zeilenstruktur

Interne Tabellen können entweder auf Strukturen des Data Dictionary basieren oder auf selbst definierten Strukturen des Programms. Die erstere Methode ist schneller zu schreiben, allerdings wird dadurch häufig zuviel Speicher verbraucht und zuviele Daten von der Datenbank gelesen.

Tiefe Tabellen

Seit SAP-Release 4.5 (?) kann der Zeilentyp einer internen Tabelle seinerseits interne Tabellen enthalten. Für die dermaßen geschachtelte Tabelle hat SAP den Begriff der tiefen Tabelle geprägt. Für die innenliegendenen Tabellen kann keine Kopfzeile deklariert werden. Deshalb wird seitdem verstärkt empfohlen, immer explizite Arbeitsbereiche zu verwenden.

Eine Anleitung zu Deklaration, Füllung und Abarbeitung tiefer Tabellen gibt es unter Codebeispiel Tiefe Tabelle.

Bei tiefen Tabellen ist der COLLECT-Befehl nicht erlaubt.

Operationen mit Tabellen

CLEAR ([])

REFRESH

APPEND

INSERT

COLLECT (nicht für tiefe Tabellen !!!)

Falls die Daten aus der Datenbank gelesen werden, sollte man prüfen, ob die Summierungen nicht schon von dieser durch SELECT SUM() vorgenommen werden können.

DELETE

Durch diese Anweisung wird eine Zeile aus der internen Tabelle gelöscht. Falls das Löschen in einer LOOP-Schleife erfolgt, muss kein Index angegeben werden, es wird immer die aktuelle Zeile gelöscht. Ansonsten muss immer ein Index angegeben werden.

Durch die Löschoperation verändert sich natürlich die Indexnummer aller Folgezeilen.

WHERE

Mit DELETE ... WHERE ... können gesammelt alle Zeilen gelöscht werden, die der Bedingung genügen.

ADJACENT DUPLICATES

Bei der Datenselektion ist es häufig schwierig, sicherzustellen, dass jede Datenzeile nur ein Mal erscheint. DELETE mit dem Zusatz ADJACENT DUPLCATES bietet eine bequeme Möglichkeit, doppelte Einträge aus einer internen Tabelle zu eliminieren. Mit dem Zusatz COMPARING kann der Vergleich auf die angegeben Felder begrenzt werden. Vor dem Löschen muss ein SORT erfolgen.

SORT (für BINARY SEARCH)

LOOP

LOOP ... WHERE

Durch die WHERE-Klausel wird die Verbeitung während des LOOP auf die Zeilen beschränkt, die der Bedingung genügen. Es werden aber stets alle Zeilen geprüft, was bei wiederholtem Loopen zu Performanceproblemen führen kann.

In Verbindung mit der AT-Klausel können unvorhersehbare Ergebnisse vorkommen.

LOOP ... FROM

AT

SUM

READ

INDEX

WITH KEY

BINARY SEARCH

MODIFY

FREE

Tabellen beschreiben

  • SY-SUBRC abfragen
  • Den RUMPF[] auf initial abfragen
  • DESCRIBE TABLE LINES ...

Tabellen in Zusammenhang mit SQL

Aus Performancegründen sollten Massenoperationen auf der Datenbank mit Hilfe von internen Tabellen erfolgen

  • SELECT ... INTO TABLE ...
  • SELECT ... APPENDING TABLE ...
  • BLOCK SIZE
  • INSERT ... FROM TABLE
  • UPDATE ... FROM TABLE
  • DELETE ... FROM TABLE

Verwendung von Tabellen

  • Programmintern
  • Als Parameter (Form, Funktionsbaustein)

Laufzeithinweise

Generell wirkt sich die intensive Verwendung von IT positiv auf die Performance aus. Gute Änsätze sind:

  • Lesen der Kerndaten mit einem Datenbank-JOIN in eine interne Tabelle.
  • Lesen kleiner Tabellen zu Programmanfang in eine interne Tabelle und späterer Schlüsselzugriff.

Falscher Umgang mit - v.A. großen - Tabellen kann allerdings auch Katastrophen bewirken. Häufige Fehler sind:

  • Verwendung zu umfangreicher Zeilen. Es sollten nur die Felder in die Zeilenstruktur aufgenommen werden, die auch benötigt werden.
  • Zugriff mit Schlüssel ohne BINARY SEARCH. Ohne diesen Zusatz wird die Tabelle bis zum Auffinden des Schlüsselwertes (oder bis zum bitteren Ende) durchsucht.
  • Häufiges LOOP ... WHERE. Hierbei wird jedesmal die gesamte Tabelle durchsucht. Ein Zugriff mit Schlüssel und anschließendes LOOP ... FROM Index unter Prüfung der Abbruchbedingung beschränkt die Anzahl der zu lesenden Zeilen auf das nötige Maß.
  • SUM. Beim SUM-Befehl, der sowohl bei AT NEW also auch bei AT END OF erfolgen kann, wird jedesmal der jeweilige Tabellenbereich durchsucht, und zwar zum Zeitpunkt des AT-Befehls. In jedem Fall also wird alles doppelt durchgegangen. Bei sehr umfangreichen Tabellen sollte daher die Summierung "von Hand" erfolgen, also bei AT NEW die Summenfelder initialisieren, bei AT END auswerten.

Verwandte Themen

Persönliche Werkzeuge