Auslesen von Datenbanktabellen für Anfänger ab SAP NW 7.40

Auslesen von Datenbanktabellen

ABAP besitzt den Vorteil, dass es SQL anders als in anderen Programmiersprachen direkt integriert (OpenSQL). Dadurch können Datenbankoperationen 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 wird auch das neue Fluchtsymbol (engl. escape character) „@“ vorgestellt. Dieses wurde ab SAP 7.40 eingeführt, welches Optimierungen für HANA einführt. Dabei können Operationen direkt auf Datenbanken durchgeführt werden, welche 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 wird eine gesamte Tabelle in eine interne Tabelle kopiert. Dies ist erforderlich, wenn man weitere Operationen auf internen Tabellen durchführen will.
Das Auslesen einer gesamten Tabelle sollte jedoch in der Praxis vermieden werden, da es sehr unperformant ist. Empfehlenswert ist es, selektive 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. Beide Zuweisungen sind dabei sehr ähnlich und unterscheiden sich nur um einen Ausdruck.
    Der @ Operator deklariert diese als Hostvariable [Fluchtsymbol], welches 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 wird dies an 2 Spalten durchgeführt.
In der Praxis ist dies wie erwähnt dank der Performance vorzuziehen, da so der * Operator (Wildcard) vermieden wird.

Alte Syntax:

  • Hier ist zu bedenken, dass eine komplett 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 wird eine Tabelle erzeugt, welche 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 wird eine Spalte über WHERE direkt ausgelesen. Dies ist performanter, da so keine komplette Tabelle ausgelesen werden muss.

Alte Syntax:

  • Bei der alten Syntax muss die interne Tabelle explizit angegeben werden und entspricht dem Typ der Datentabelle. Es ist daher nötig, die Zielfelder anzugeben. Dies kann implizit über den 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 (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 Beispielcode dient der direkten Ausgabe von Werten aus einer Datenbank Tabelle.

Alte Syntax:

  • Zum Auslesen von Datenbanktabellen muss die ganze Zeile in eine Struktur kopiert werden. Dann kann auf einen einzelnen Wert per Trennzeichen ( – ) zugegriffen werden.
  • 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 in diesem Beispiel die Struktur nur einen Wert besitzt, geht falls der Typ der Variable der Tabellenspalte entspricht auch:

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 man 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 dem Join Operation ist es möglich, 2 Tabellen zu verbinden um gemeinsame Operationen auf ihnen durchzuführen. Die 2 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 Performanceeinbruch und kann das System stark blockieren.

Syntax:

  • In der neuen Syntax übernimmt die implizite Datendeklarierung einen die Arbeit, 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, 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, welche Bedingungen die tabellenübergreifend sind einschließt.

Syntax:

  • Hier wird über die Bedingung des Join Werts einer Tabelle, direkt ein Ergebnis aus der Tabelle eines anderen Wertes ausgegeben.
    Hier sollte man jedoch darauf achten, falls das Ergebnis eindeutig sein soll. Sonst 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 und dynamisch umbenannt werden können. Dies 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 so weit 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:

Keine Kommentare

Schreibe einen Kommentar

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