3.5 Datenbanktabelle lesen und ausgeben 

Wenn Sie in einem Report mit Datenbanktabellen arbeiten möchten, müssen Sie in dem Report eine Workarea deklarieren, d. h. einen Arbeitsbereich einrichten, in dem Sie die Daten aus der Tabelle bearbeiten können Für unsere Tabelle ZTEILNEHMER erreichen Sie dies über folgende Anweisung:
DATA wa_zteilnehmer TYPE zteilnehmer.
Mit der DATA-Anweisung wird eine gleichnamige Struktur im Programm angelegt, die den gleichen Datentyp wie die Datenbanktabelle besitzt, die Workarea.
Alle Felder der Struktur haben die gleichen Namen und Datentypen wie die Felder der Datenbanktabelle. So können Sie beim Lesen der Datensätze aus der Datenbanktabelle Satz für Satz in die Struktur stellen und anschließend weiterverarbeiten.
[ ! ] Obsolete TABLES-Anweisung
In älteren Programmen finden Sie auch die obsolete Anweisung TABLES, mit der ein Tabellenbereich oder auch Tabellenarbeitsbereich deklariert wird. Dieser erzeugt für die referenzierte Datenbanktabelle eine gleichnamige Datenstruktur in Ihrem Programm.
Einige Kommandos für Datenbankzugriffe besitzen eine Kurzform ohne Angabe der Workarea, bei der implizit der Arbeitsbereich mit dem Namen der Tabelle verwendet wird. Unter bestimmten Umständen wird die Verwendung solcher obsoleter Anweisungen von der Programmierumgebung als Fehler betrachtet – Sie sollten sich ihre Verwendung daher gar nicht erst angewöhnen, auch wenn sie Ihnen gewiss oft in alten Programmen begegnen werden.
[ ! ] Bindestrich
Die Felder der Struktur sprechen Sie dabei mit dem Namen der Workarea und ihrem Feldnamen an: das Feld TNAME der Workarea WA_ZTEILNEHMER beispielsweise mit WA_ZTEILNEHMER-TNAME. Der erste Namensbestandteil ist der Strukturname, der zweite der Feldname. Beachten Sie den Bindestrich zwischen diesen beiden Teilen: Er trennt die Namensbestandteile ohne Leerzeichen. Merken Sie sich für das weitere Arbeiten auch, dass Sie den Bindestrich nur für diesen Zweck verwenden; benutzen Sie ihn z. B. nie bei Variablennamen.
Selbstverständlich merkt sich niemand bei allen Feldern der verwendeten Datenbanktabellen die Typdeklarationen. Falls es nötig ist nachzulesen, wechseln Sie per Vorwärtsnavigation, d. h. mit einem Doppelklick auf den Tabellennamen, in das ABAP Dictionary. Hier können Sie auf der Registerkarte Felder die erforderlichen Informationen zu den Feldern ablesen. Anschließend kehren Sie mit dem Zurück-Button () in den ABAP Editor zurück.
Dies ist die einfachste Form, die Zeilen einer Datenbanktabelle satzweise in einer Liste auszugeben:
SELECT * FROM zteilnehmer INTO wa_zteilnehmer.
WRITE / wa_zteilnehmer.
ENDSELECT.
Die SELECT-Anweisung bedeutet umgangssprachlich, dass die Sätze aus der Tabelle ZTEILNEHMER Satz für Satz in die Workarea übertragen werden. Das Sternchen (*) bewirkt, dass alle Felder eines Satzes übertragen werden. Möchten Sie stattdessen nur einen Teil der Felder übertragen, müssten Sie statt des Sternchens die Felder als Feldliste angeben.
Die folgenden Zeilen zeigen, wie Sie die zu übertragenden Felder gezielt benennen und auch den Zielfeldern der Workarea ausdrücklich zuordnen können. Wir werden aber im Folgenden nicht weiter auf Feldlisten eingehen, da es sich eher um eine Technik zur Optimierung handelt, die Sie beim Einstieg in ABAP noch nicht konsequent verwenden müssen.
SELECT tgeburtsdatum tname
FROM zteilnehmer
INTO (wa_zteilnehmer-tgeburtsdatum, wa_zteilnehmer-tname)
ORDER BY PRIMARY KEY.
...
ENDSELECT.
[ ! ] Feldliste oder Sternchen
Wenn Sie das Sternchen verwenden und viele Felder in die Workarea übertragen, die Sie gar nicht wirklich benötigen, kann dies bei großen Tabellen negative Auswirkungen auf die Programmlaufzeit haben.
Als Faustregel können Sie sich merken: Wenn Sie fast alle Felder auch benötigen, verwenden Sie getrost das Sternchen. Wenn Sie die Hälfte oder weniger der Tabellenfelder benötigen, geben Sie die Felder als Feldliste an.
Das Kommando SELECT entspricht in dieser Form einer Schleifenverarbeitung. Alle Sätze der Datenbanktabelle werden Satz für Satz in die Programmstruktur übertragen. Die Struktur der Schleife beginnt mit der Anweisung SELECT und endet mit der Anweisung ENDSELECT.
Um die Zeilen Ihrer Datenbanktabelle sortiert nach dem Primärschlüssel (in unserem Beispiel nach der Teilnehmernummer) Zeile für Zeile in einer Liste auszugeben, modifizieren Sie die Anweisung mit dem Zusatz ORDER BY PRIMARY KEY:
SELECT * FROM zteilnehmer INTO wa_zteilnehmer
ORDER BY PRIMARY KEY.
WRITE / wa_zteilnehmer.
ENDSELECT.
[ ! ] Sortierung der Datensätze
Die Datensätze, die von einer SELECT-Anweisung zurückgegeben werden, werden von Hause aus nicht in einer bestimmten Reihenfolge sortiert. Es gibt jedoch verschiedene Zusätze zu der SELECT-Anweisung, mit denen Sie eine Sortierreihenfolge festlegen können. Solange diese Zusätze nicht verwendet werden, bleibt es der Datenbank überlassen, in welcher Reihenfolge die Ergebnissätze angeordnet werden. Selbst eine zufällige, bei jedem Aufruf wechselnde Sortierung wäre denkbar. Tatsächlich sortieren aber die meisten Datenbanken die Ergebnissätze »freiwillig« nach dem Primärschlüssel der jeweiligen Datenbanktabelle. Viele Programmierer haben sich daher angewöhnt, dieses Verhalten der Datenbank fest vorauszusetzen und ihre Programmlogik darauf aufzubauen.
Wird in Ihrem Unternehmen die In-Memory-Datenbank SAP HANA eingeführt, kann diese Gewohnheit viele Probleme verursachen, denn SAP HANA liefert die Ergebnissätze nicht mehr automatisch nach dem Primärschlüssel sortiert zurück, sondern benötigt dazu eine ausdrückliche Aufforderung in Form des Zusatzes ORDER BY PRIMARY KEY. In den folgenden Programmbeispielen in diesem Buch verwenden wir diesen Zusatz manchmal und manchmal nicht. Als Faustregel haben wir dabei gelten lassen: Wenn die Programmlogik von aufsteigenden Schlüsseln ausgeht, ist eine Sortierung erforderlich. Sollen Listen mit Teilnehmernummern o. Ä. ausgegeben werden, sortieren wir ebenfalls nach dem Schlüssel, weil eine sortierte Liste für den Anwender intuitiver ist.