Mit dem Release 7.40, SP5 und SP8, hat sich im Open SQL einiges getan. SAP hat nach einem längeren Stillstand bei Open SQL endlich an den SQL92-Standard, der aus dem Jahre 1992 stammt, angeknüpft und unterstützt nun Features, wie UNION und CASE.
Neue Syntax
Mit 7.40, SP5 gibt es einen neuen SQL Parser im ABAP Kernel und somit auch eine neue SQL Syntax. Das Verwenden dieser neuen Syntax ist auf jeden Fall ein Muss, wenn man die neuen SQL Features nutzen möchte.
Hier die zwei wichtigsten Punkte davon:
- Aufgelistete Spaltennamen können und sollen durch Komma getrennt werden
- Bei Hostvariablen soll ein @ vorangestellt werden
Nachfolgend ein Beispiel mit der neuen SQL Syntax:
1 2 3 4 5 6 7 |
DATA: l_hugo TYPE C LENGTH 10. SELECT mc_name1, @l_hugo AS hugo, @sy-uname AS userid, ‘X‘ AS true FROM TABLE BUT000 INTO @ls_result. |
Open SQL Expressionen
Die Open SQL Expressionen werden in der Spaltenliste nach dem SELECT Befehl verwendet. Das Ergebnis dieser Expression wird direkt auf der Datenbank berechnet und in die entsprechende Spalte geschrieben. Dabei kann man sowohl andere Spalten, als auch Hostvariablen für die Berechnung verwenden.
Dabei ist hier das Stichwort „Code push down“. Diese Strategie ist in letzter Zeit in aller Munde. Ursprünglich wurde es immer nur mit der SAP HANA in Verbindung gebracht. Doch spätestens jetzt, mit diesen neuen Open SQL Features, eröffnen sich ganz neue Möglichkeiten für Entwickler, auch mit einer traditionellen Datenbank darunter.
Mit „Code push down“ soll so viel Anwendungslogik wie möglich, vom Applikationsserver auf die Datenbank verlagert werden. D.h., dass alle rechen- bzw. daten-intensive Logik, die die Datenbank berechnen kann – es auch tut.
Es liegt natürlich im Ermessen des Entwicklers, die Logik sinnvoll auszulagern. In Anbetracht der Performance lässt sich definitiv eine Verbesserung erzielen.
Hier eine Auflistung der Open SQL Expressions
- Verwenden von Festwerten
- Arithmetische Kalkulationen (+,-,*,/)
- Arithmetische Funktionen (ABS, CEIL, FLOOR, DIV, MOD)
- Verketten von Zeichenketten mit &&
- Typanpassung mit CAST (momentan nur von DEC zu FLTP)
- COALESCE Funktion
- Fallunterscheidung mit CASE
Es können auch mehrere SQL Expressionen miteinander kombiniert und durch Verwendung von runden Klammern, auch priorisiert werden.
Nachfolgend einige Beispiele der SQL Expressionen:
Zu Demozwecken wurde eine eigene DB-Tabelle ‚ZDATENTYPEN‘ verwendet, deren Spaltennamen, nach den Datentypen der jeweiligen Spalte, vergeben wurden.
Beispiel einer arithmetischen Kalkulation:
1 2 3 4 5 |
SELECT INT1 AS I1, INT2 AS I2, INT4 AS I4, 100 + INT4 AS I4CALC FROM zdatentypen. |
Ergebnis:
Erklärung: Beispiel einer einfachen Addition. Sie ersten drei Spalten werden direkt ausgegeben. Die vierte Ausgabespalte zweigt den Wert der dritten Spalte + 100. Der Spaltennamen der vierten Spalte lautet „I4CALC“.
Beispiel einer arithmetischen Funktion:
Hier ein Beispiel einer Auf- und Abrundung:
1 2 3 4 5 |
SELECT DBKEY, DEC8_2, CEIL( DEC8_2 ) AS ceil, FLOOR( DEC8_2 ) AS floor FROM zdatentypen. |
Ergebnis:
Erklärung: Mit der arithmetischen Funktion CEIL findet eine Aufrundung, mit FLOOR eine Abrundung statt.
Beispiel eines Castings:
1 2 3 |
SELECT dec8_2, CAST( dec8_2 as FLTP ) AS cast FROM zdatentypen. |
Ergebnis:
Erklärung: In der zweiten Spalte wurde das Feld, das einen dezimalen Datentypen hat, als Float ausgegeben.
!! Achtung: mit SP8 ist der CAST nur von DEC auf FLTP möglich !!
Beispiel Verketten von Zeichenketten:
1 2 3 4 |
SELECT char10, char20, char10 && ';' && char20 as concatenate FROM zdatentypen. |
Ergebnis:
Erklärung: In der dritten Spalte werden die ersten zwei Zeichenketten zusammen, durch ein Semikolon getrennt, ausgegeben.
Beispiel COALESCE:
1 2 3 4 5 |
SELECT partner~partner, COALESCE( b~addrnumber, 'NO ADDRESS' ) AS addrnr FROM but000 AS partner LEFT OUTER JOIN but020 AS addresslink OF addresslink~partner = partner~partner. |
Ergebnis:
Erklärung: Liefert die Join-Verknüpfung ein Ergebnis aus der BUT020, wird die Adressnummer in die zweite Spalte geschrieben, ansonsten wird der Wert „NO ADDRESS“ hineingeschrieben.
Beispiel einer Fallunterscheidung mit CASE:
1 2 3 4 5 6 |
SELECT type, CASE WHEN type = '1' THEN 'Person' WHEN type = '2' THEN 'Unternehmen' ELSE 'Unbekannt' AND AS type_desc, mc_name1 FROM but000. |
Ergebnis:
Erklärung: In der zweite Spalte, vom Namen TYPE_DESC, wird je nach TYPE = 1, der Wert „Person“ und bei TYPE = 2, „Unternehmen“ hineingeschrieben. Bei allen anderen Werten, wird „Unbekannt“ ausgegeben.
Beispiel einer Kombination:
1 2 3 4 5 6 |
SELECT type, CASE WHEN type = '1' THEN ( 'Person' && '/' && type ) WHEN type = '2' THEN ( 'Unternehmen' && '/' && type ) ELSE 'Unbekannt' AND AS type_desc, mc_name1 FROM but000. |
Ergebnis:
Erklärung: Hier wurde einer Fallunterscheidung mit CASE und eine Verkettung vom Zeichenketten miteinander kombiniert.
CDS – Core Data Services
Bei den CDS handelt es sich um eine neue Art der View-Definition in SAP. Nachdem es bei den traditionellen Datenbank-Views sehr viele Einschränkungen gibt, wie keine Outer Joins, keine komplexen Joins, keine Kommentare, kein Union, keine View auf eine View usw. , hat sich dahingehend mit den CDS Views ein revolutionärer Fortschritt entwickelt. Es gibt keine Einschränkungen mehr. Mittels Datenbank-unabhängigen DDL statements (Data Definition Language) sind der Kreativität und Komplexität fast keine Grenzen mehr gesetzt.
DDL umfasst die komplette Data Definition Language vom SQL und erweitert es um die Möglichkeit sogenannte Annotationen und Assoziationen zu definieren. Hier eine Auflistung der Möglichkeiten:
- SQL Funktionen (ABS, CEIL, DIV, DIVISION, CONCAT, COALESCE,…)
- Parameter
- Fallunterscheidung mit CASE
- CASTING
- Built-In Funktionen (Konvertierungsfunktionen für Währungen und Einheiten)
- UNION, UNION ALL
- Associations
- …
Die CDS Views sich vollständig im ABAP integriert. Sowohl im ABAP Dictionary sichtbar, als auch mit den SAP Transportmanagement-Tool transportierbar.
Die Pflege erfolgt mit den ADT (ABAP Development Tools) im Eclipse.
Hier ein kleines, einfaches Beispiel einer CDS View:
Auch die CDS Views tragen zur „Code push down“ Strategie bei. Sogar mehr als die SQL Expressionen, da es hier durchaus mehr Möglichkeiten gibt.
Der Zugriff auf CDS Views erfolgt mittels Open SQL. Nachfolgend ein paar Beispiele von CDS Views.
Beispiel einer CDS View mit UNION ALL:
Zugriff auf die View:
1 2 3 4 |
SELECT partner, type, mc_name1, mc_name2 FROM zcdsunion WHERE type <> '3' ORDER BY mc_name1 ASCENDING. |
Ergebnis:
Beispiel einer CDS View mit einer Währungskonvertierung:
Zugriff auf die View:
1 2 |
SELECT * FROM ZCDSCURR( exc_date = @sy-datum, to_curr = 'USD' ) WHERE currency <> 'USD'. |
Ergebnis:
ABAP Managed Database Procedures
Als dritter Newcomer und „Code push down“-Vertreter, darf ich AMDP vorstellen. ABAP Managed Database Procedures (AMDP) sind sogenannte Prozeduren, auch bekannt als „Stored procedures“. Diese sind in nativer Datenbank-Sprache implementiert. Momentan ist SAP HANA, die einzige Datenbank, die AMDPs unterstützt.
Dazu gibt es ein klassenbasiertes Framework, mit dem sich AMDP Prozeduren verwalten und aufrufen lassen. Eine AMDP Klasse implementiert das spezielle Interface (IF_AMDP_MARKER_HDB). Bei der Methodenimplementierung muss die Datenbank und die entsprechende Datenbank-Sprache angegeben werden. Momentan sind nur SQL-Script und die SAP HANA möglich.
Die Pflege von AMDPs erfolgt nur mit ADT (ABAP Development Tools) in Eclipse.