Auslesen von Datenbanktabellen in ABAP ab SAP NW 7.40

ABAP besitzt den Vorteil, dass es im Gegensatz zu anderen Programmiersprachen SQL direkt integriert (OpenSQL). Dadurch können Datenbank Operationen wesentlich einfacher verwendet werden. In diesen Kapitel wird das SELECT Schlüsselwort für das Auslesen von Datenbanktabellen vorgestellt.
Das SELECT Schlüsselwort dient dazu, Werte direkt aus einer Datenbanktabelle auszulesen.

In diesen Blog stelle ich auch das neue Fluchtsymbol (engl. escape character) „@“ vor. Dieses Symbol wurde ab SAP 7.40 integriert, das Optimierungen für HANA eingeführt hat. Dabei kann man Operationen direkt auf Datenbanken durchführen, die HANA unterstützen.

Inhaltsverzeichnis:

  1. Auslesen einer gesamten Datentabelle in eine interne Tabelle
  2. Einzelne Spalten in eine Tabelle auslesen
  3. WHERE Schlüsselwort (Auslesen von Spalten mit Bedingung)
  4. SELECT SINGLE und WHERE Schlüsselwort (Auslesen eines Wertes bei eindeutigen Zeilenangaben für einzelne Zeilen in eine Struktur)
  5. JOIN Schlüsselwort (Auslesen von Datenbanktabellen bei zwei oder mehr Tabellen)
  6. SELECT SINGLE und JOIN Schlüsselwörter (Auslesen von Datenbanktabellen)
  7. Nutzung des AS Schlüsselworts beim Auslesen von Datenbanktabellen
  8. Abschließendes Beispiel eines SELECTS mit JOIN und AS Schlüsselwörtern

1. Auslesen einer gesamten Tabelle aus einer Datentabelle in eine interne Tabelle

In diesen Beispiel kopieren wir eine gesamte Tabelle in eine interne Tabelle. Dies ist erforderlich, wenn man weitere Operationen auf internen Tabellen durchführen möchte.
Man sollte das Auslesen einer gesamten Tabelle jedoch in der Praxis vermeiden, da es sehr unperformant ist. Stattdessen ist es empfehlenswerter ausgewählte Spalten auszulesen.

Alte Syntax fürs Einfügen in eine Tabelle:

  • Die alte Syntax erfordert, dass die Tabelle vor dem Auslesen explizit deklariert werden muss.

DATA lt_table TYPE TABLE OF sourcetable.

SELECT * FROM sourcetable INTO TABLE lt_table.

Beispiel:

DATA lt_organisation TYPE TABLE OF hrp1000.

SELECT * FROM hrp1000 INTO TABLE lt_organisation.

Neue Syntax fürs Einfügen in eine Tabelle (mit TABLE):

  • Die neue Syntax deklariert die Variable mit dem Fluchtsymbol „@“ Operator inline. @ ist dabei nötig, da die Variable innerhalb eines Selects bearbeitet wird. Dabei sind sich beide Zuweisungen sehr ähnlich und unterscheiden sich nur um einen Ausdruck.
    Der @ Operator deklariert diese als Hostvariable [Fluchtsymbol], das vom Compiler anders behandelt wird. Dadurch kann erst ein typenloser Vergleich durchgeführt werden. Die alte Syntax erfordert die Deklarierung noch nicht, die neue jedoch zwingend.

SELECT * FROM sourcetable INTO TABLE @DATA(lt_table).

Beispiel:

SELECT * FROM hrp1000 INTO TABLE @DATA(lt_organisation).

2. Einzelne Spalten in eine Tabelle auslesen

Mit der Spaltenangabe nach der SELECT Bedingung können einzelne Spalten ausgelesen werden.
In diesem Beispiel führen wir das an 2 Spalten durch.
In der Praxis ist das, wie ich erwähnte, dank der erhöhten Performanz vorzuziehen, da wir so den „*“ Operator (Wildcard) vermeiden können.

Alte Syntax:

  • Hier müssen wir bedenken, dass eine lokale Tabelle generiert wird. Nicht genutzte Felder werden mit leeren Einträgen gefüllt.
  • Die Spaltenangaben werden zudem nur von einem Leerzeichen separiert.

DATA ls_table TYPE TABLE OF sourcetable.

SELECT col1 col2 FROM sourcetable INTO TABLE lt_table.

Beispiel:

DATA lt_organisation TYPE TABLE OF hrp1000.

SELECT objid stext FROM hrp1000 INTO TABLE lt_organisation.

Neue Syntax:

  • Durch die implizite Zuweisung erzeugen wir eine Tabelle, die nur die ausgelesenen Spalten beinhaltet.
  • Die Spaltenangabe wird zudem mit einem Komma separiert.

SELECT col1, col2 FROM sourcetable INTO TABLE @DATA(lt_table).

Beispiel:

SELECT objid, stext FROM sourcetable INTO TABLE @DATA(lt_organisation).

3. WHERE Schlüsselwort (Auslesen von Spalten mit Bedingung)

In diesen Beispiel lesen wir eine Spalte direkt über WHERE aus. Das ist performanter, da so keine komplette Tabelle ausgelesen werden muss.

Alte Syntax:

  • Bei der alten Syntax müssen wir die interne Tabelle explizit angeben und diese entspricht dem Typ der Datentabelle. Es ist daher nötig, dass wir die Zielfelder angeben. Ebendies kann implizit über das CORRESPONDING FIELDS Schlüsselwort gemacht werden.

DATA lt_table TYPE TABLE OF sourcetable.

SELECT wcolumn FROM sourcetable INTO CORRESPONDING FIELDS OF TABLE lt_table
WHERE colb1 = lv_cond1 { AND / OR }
{ colb2 = lv_cond2
… } .

Beispiel:

DATA lt_organisation TYPE TABLE OF hrp1000.

SELECT stext FROM hrp1000 INTO CORRESPONDING FIELDS OF TABLE lt_organisation
WHERE objid = 50000010 OR
objid = 50000010.

Neue Syntax:

  • Für diese Operation wird die Tabelle dynamisch nach den auszulesenden Werten aufgebaut. Man erhält daher nur die auszulesenden Spalten. Dies ist performanter, falls man direkt mit den zurückgegebenen Werten arbeiten will.

SELECT wcolumn FROM sourcetable INTO TABLE @DATA(lt_table_wcolumn)
WHERE colb1 = @lv_bedingung1 { AND / OR }
colb2 = @lv_bedingung2
… .

Beispiel:

SELECT stext FROM hrp1000 INTO TABLE @DATA(lt_org_erg)
WHERE objid = 50000010 OR
objid = 50000011.

4. SELECT SINGLE und WHERE Schlüsselwort (Auslesen eines Wertes bei eindeutigen Zeilenangaben für einzelne Zeilen in eine Struktur)

Wenn man einen oder mehrere Werte aus einer Zeile benötigt und bekannt ist, dass diese Werte eindeutig sind (gleicher Wert kommt nur einmal vor), wie es unter anderen auch bei Schlüsselfeldern der Fall ist, wird normal ein SELECT SINGLE verwendet. Dadurch wird die erste gefundene Zeile als Struktur ausgegeben. Bei nicht eindeutigen Werten, ist jedoch zu beachten, dass alle weiteren Zeilen nach der ersten nicht mehr ausgegeben werden.

Dieser unten folgende Beispielcode dient der direkten Ausgabe von Werten aus einer Datenbank Tabelle.

Alte Syntax:

  • Zum Auslesen von Datenbanktabellen müssen wir die ganze Zeile in eine Struktur kopieren. Dann können wir auf einen einzelnen Wert per Trennzeichen ( – ) zugreifen.
  • So ist es möglich, schnell Werte aus einer Tabelle wiederzugeben, falls diese einzigartig vorhanden sind.

TYPES lty_table TYPE sourcetable.
DATA: ls_tablestruct TYPE lty_table,
lv_result TYPE resulttype.

SELECT SINGLE col FROM sourcetable INTO CORRESPONDING FIELDS OF ls_tablestruct
WHERE colbd = lv_cond.

lv_result = ls_tablestruct-col.

Da die Struktur in diesem Beispiel nur einen Wert besitzt geht, sofern der Typ der Variable der Tabellenspalte entspricht, auch folgendes:

SELECT SINGLE col FROM sourcetable INTO CORRESPONDING FIELDS OF lv_result.

Beispiel:

TYPES lty_hrp1000 TYPE hrp1000.
DATA: ls_stelleninfo TYPE lty_hrp1000,
lv_result TYPE string.

SELECT SINGLE stext FROM hrp1000 INTO CORRESPONDING FIELDS OF ls_positioninfo
WHERE objid = 50000010.

lv_result = ls_positioninfo-stext.

Neue Syntax:

  • Die Ausgabe hier ist besonders einfach, da man auf die Spalte direkt zugreift und den Wert in eine implizit generierte Variable kopieren kann.

SELECT SINGLE wcolumnl FROM sourcetable INTO @DATA(lv_result)
WHERE colbd = @lv_cond.

Beispiel:

SELECT SINGLE stext FROM hrp1000 INTO @DATA(lv_result)
WHERE objid = 50000010.

5. JOIN Schlüsselwort (Auslesen von Datenbanktabellen bei zwei oder mehr Tabellen)

Mit der Join Operation ist es möglich zwei Tabellen zu verbinden, um gemeinsame Operationen auf ihnen durchzuführen. Die beiden Tabellen wirken dann wie eine einzige Tabelle.
Für die JOIN Operation sollte immer ein WHERE genutzt werden, da sonst Beziehungen zwischen allen Spalten der Tabelle abgefragt werden. Dies sorgt vor allem bei großen Tabellen für einen massiven Performanz Einbruch und kann das System blockieren.

Syntax:

  • In der neuen Syntax übernimmt die implizite Datendeklarierung die Aufgabe die neue Tabelle zu erzeugen.
  • Ein weiterer Vorteil ist hier, dass einzelne Spalten ausgelesen werden können. So ist es auf einfache Weise möglich verschiedenste Tabellen zu erzeugen.
  • In dem Beispiel erzeugen wir die Tabelle selbst, was ein großer Vorteil sein kann. Alternativ kann eine Tabelle über eine selbst erstellte Struktur aufgebaut werden.

SELECT table1~col1, table2~col2 … FROM table1 JOIN table2 ON table1~cond1 = table2~cond2
INTO TABLE @DATA(lt_targettable).
WHERE table2~col2 = @cond.

Beispiel:

SELECT hrp1000~plvar, hrp1000~otype, hrp1000~otjid, hrp1000~short, hrp1001~sclas, hrp1001~sobid FROM hrp1000 JOIN hrp1001 ON hrp1000~objid = hrp1001~objid
INTO TABLE @DATA(lt_organisation).
WHERE hrp1001~sobid = ‚50000012‘.

6. SELECT SINGLE und JOIN Schlüsselwörter (Auslesen von Datenbanktabellen)

Per Select Single und Join Schlüsselwörter ist es möglich direkt ein speziellen Wert aus einer Tabelle wiederzugeben, die tabellenübergreifende Bedingungen einschließt.

Syntax:

  • Hier wird über die Bedingung des Join Werts einer Tabelle, direkt ein Ergebnis aus der Tabelle eines anderen Wertes ausgegeben.
    Hierauf sollte man jedoch achten, sofern das Ergebnis eindeutig sein soll. Ansonst wird nur der erste Wert zurückgegeben.

SELECT SINGLE table1~col1 FROM table1
JOIN table2 ON table1~bedingung1 = table2~bedingung2
INTO TABLE @DATA(lt_targettable)
WHERE table2~col2 = @cond.

Beispiel:

SELECT SINGLE hrp1000~stext FROM hrp1000
JOIN hrp1001 ON hrp1000~objid = hrp1001~objid
INTO @DATA(lv_erg)
WHERE hrp1001~sobid = ‚50000012‘.

7. Nutzung des AS Schlüsselworts beim Auslesen von Datenbanktabellen

Das AS Schlüsselwort ermöglicht es, dass Tabellenspalten direkt im Programmcode dynamisch umbenannt werden können. Das hat folgende Vorteile:

  • Eine lange Variable kann ein Alias zugewiesen werden, welcher ein einfacheren Aufruf ermöglicht.
  • Einem Spaltenname kann ein Alias zugewiesen werden, weshalb es möglich ist besser lesbare Spaltennamen zu generieren oder auch gleichnamige oder ähnlich namige Spalten beim Join besser zu unterscheiden.

Codebeispiel:

SELECT tb~column1 AS new_column1_name FROM table AS new_table_name
INTO TABLE @DATA(lt_table)

8. Abschließendes Beispiel eines SELECTS mit JOIN und AS Schlüsselwörtern

Wird JOIN und AS kombiniert, dann können Tabellen mit neuen und spezifischen Bezeichnungen festgelegt werden. Dadurch ist es einfacher, längere Abfrageketten aufzubauen.

Codebeispiel:

SELECT a~column1 AS column1_newname, b~column2 AS column2_newname FROM table1 AS a
JOIN table2 AS b ON a~join_column1 = b~join_column2
INTO TABLE @DATA(lt_jointableAB)
WHERE cond = @cond.

Beispiel:

SELECT a~stext AS Position FROM hrp1000 AS a
JOIN hrp1001 AS b ON a~objid = b~objid
INTO TABLE @DATA(lt_positions)
WHERE hrp1001~sobid = ‚50000012‘.

Quellenangaben:

Old and new ABAP syntax – overview sheet (Von Blog SAP auf English)
Neues ABAP (ab Release 7.40) (Von Berater Wiki auf Deutsch)

Kategorie:

Tags:

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert