Benutzer:Dr. Gert Blazejewski:ABAP/ Datenbankzugriffe
Der Zugriff auf die Daten des Repository ist ein entscheidener Punkt, bei der Programmierung in ABAP. Man sollte unterscheiden zwischen den direkten Zugriff auf die Datenbank, und den Zugriff auf die Daten innerhalb des ablaufenden Programmes. Die Bedeutung liegt in der Art und Weise wie man die Daten handhabt. Wenn man die zu selektierenden Daten stets direkt aus der Datenbank liest, dann wird es über kurz oder lang zu einem Perfomance Problem kommen. Die meisten Beispiele für den Einstieg tun aber gerade das, was man nie machen sollte.
Es gibt demnach zwei unterschiedliche Varianten. Die sogenannten internen Tabellen und die Tabellen der Datenbank. Aus diesem Grund gibt es auch jeweils unterschiedliche Befehle, bzw. gleichlautende Befehle die sich in den nachfolgenden Parametern unterscheiden (manchmal ist selbst das nicht direkt erkennbar) und sich damit erst erkennbar an interne Tabellen oder eben an eine Datenbank Tabelle richtet.
Interne Tabellen
[Bearbeiten]Eine interne Tabelle muss deklariert werden, um darauf zugreifen zu können. Dies geschieht mit einem DATA und anschliessendem Typ Zuweisung.
DATA: lt_tabelle1 TYPE Standard Table of TABELLE1.
Wir haben hier die Deklaration einer internen Tabelle (Standard) mit dem Namen lt_tabelle1 vom Typ TABELLE1. Ein Tipp und zugleich ungeschriebenes Gesetzt: Der Prefix lt_ sollte immer verwendet werden, wenn man eine lokale interne Tabelle benutzt.
Der Typ ist hier eine Tabelle, die damit einfach eine Beschreibung der Struktur darstellt (es gibt übrigens auch eine Variante die selbst keine Tabelle ist, sondern einfach nur eine Struktur.). Damit ist es erstmal möglich Tabellen zu erstellen. Aber noch kann man garnichts damit anfangen. Also benötigen wir noch einen Zugriffsmechanismus.
Das Problem liegt darin, dass mit der definierten Tabelle nicht eine einzelne Zeile separiert werden kann. Dies stellt nur die Gesamtheit der Tabelle dar. Es gibt keine, wie aus der objektorientierten Programmierung bekannten Klassenmethoden. Man nicht sagen 'Tabelle1.readRow(1)...'. In ABAP funktioniert das etwas anders.
Als erstes muss man eine sogeannte 'Work-Area' deklarieren.
DATA: ls_tabelle1 TYPE TABELLE1.
Der Unterschied ist deutlich sichtbar. Hier wird nicht eine Tabelle (Standard table of) deklariert, sondern nur eine einzelne Arbeitszeile (Work-Area). Damit haben wir das zweier Gespann fertig. Alles weitere ergibt sich anhand der jeweilgen Problematik.
Wie schon oben erwähnt wurde sollte man nicht ständig auf die Datenbank zugreifen, weil ansonsten (und das geht recht schnell!) die Perfomance in den Keller geht. Man muss sich vor Augen halten, daß es durchaus einige Hundertausend bis in die Millionen Datensätze in den einzelnen Tabellen geben kann (alleine die Abbildungen der Geschäfte mancher Banken sprengen das Übliche). Wenn dann noch die jeweiligen Abteilungen auf die gleichen Daten zugreifen müssen ergibt sich recht schnell ein Stau. Von daher ist es Sinnvoll sich die Daten erst in den internen Bereich zu kopieren. Ein Beispiel soll dies veranschaulichen.
DATA: lt_tab TYPE standard table of TAB.
DATA: ls_tab TYPE TAB.
...
Die Definition einer Tabelle (intern) und die passenden Work-Area.
SELECT * FROM TAB INTO lt_tab.
Dies ist der einzige Zugriff auf die Datenbank. Der Code ist relativ Simpel gehalten. Nur soviel zunächst, es sind noch Bedingungen möglich, um die Auswahl weiter einzuschränken. Man kann es sich schon denken, es wird die komplette Tabelle TAB eingelesen aus der Datenbank. Abgelegt werden die Datenzeilen in die internen Tabelle lt_tab.
Autorenverweis
[Bearbeiten]Gnushi, Chrhilgert, Worker, Cneuhaus.