Webinar – TDD mit ABAP® Units

Vielen Dank für Ihre Teilnahme an unserem Webinar!

Unterlagen/Links zum Webinar „TDD mit ABAP Units“

Umfrageergebnisse:

Verwenden Sie ABAP Unit Tests?

umfrage abap untis

Interessante Auszüge aus dem Chat

Frage: Kann man die Unit Tests soweit integrieren, dass ein Transport nur möglich ist wenn keine Fehler auftreten?
Antwort: Ja sicher, über CI (Code Inspector) Prüfungen bei der Freigabe

Info: So ein Update zum falschen Zeitpunkt ist einem Kollegen kurz vor einer Kundenpräsentation unlängst auch passiert. (Anm. Föß: Danke das hilft!)

Info: Ich denke, der Prozess des Übergangs ist schwierig und ein eigenes Webinar wert. (Anm. Föß: Stimmt vollkommen, bereits während der Vorbereitung hab ich mir die gleichen Gedanken gemacht. Ich denke ich greife genau das Thema nochmals auf)

Frage: „Gibt es eigentlich Kennzahlen mit denen man sinnvoll die Einführung von Unit Tests darstellen kann? (Anm. Föß: Ja gibt’s (von Google selber z.B. ), aber leider hab ich von/über SAP da nichts passendes gefunden)

Info: Martin Fowler hat unlängst in einem Blog geschrieben wie schwer es ist als erster mit Unit Tests anzufangen. Da ist es oft notwendig kreativ Lösungen zu finden. (Anm. Föß: Page von Martin Fowler: http://martinfowler.com )

Info: Interfaces ist eine Methode für Datenbankzugriffe, Paul Hardy nennt Unterklassen. Ich nutze manchmal einfach nur If-Statements dafür. (Anm. Föß: Stimmt, ist eine Lösung. In diesem Zusammenhang ein Hinweis auf 7.50 und auf die sogenannten Test seams bzw. Test injections: http://help.sap.com/abapdocu_750/en/index.htm?file=abennews-750-abap_unit.htm )

Info: Working Effectively with Legacy Code““ beschreibt sehr schön wie Tests nachträglich eingeführt werden können. (Anm. Föß: ISBN-13: 978-0131177055)

Bücher:

Nützliche Links

Twitter User denen man folgen sollte:

Bild

Man beachte den rechten Laptop, der war 45 Minuten mit Updates beschäftigt!

20160923_102511

Unsere nächsten Webinare

Webinar – Der SAP® Abkürzungsdschungel

 

Vielen Dank für Ihre Teilnahme an unserem Webinar!

 

Unterlagen/Links zum Webinar „Der SAP Abkürzungsdschungel – Was steckt hinter HCP, S/4, C4C, …“

 
 

Unsere nächsten Webinare

 

Juli

  • Saville – Cadaxo bringt Fiori auf den nächsten Level (Anmeldelink folgt)

August

 
 

Nützliche Links:

 

Webinar – Boost Your ABAP®

 

Vielen Dank für Ihre Teilnahme an unserem Webinar!

 

Unterlagen/Links zum Webinar „Boost Your ABAP – Tipps & Tricks für performance-optimierte Programmierung“

Unser nächstes Webinar

Wichtige Links aus dem Themengebiet „Skills“:

 

Wichtige Links aus dem Themengebiet „Optimize“:

ABAP® CDS Access Control mit DCL

SAP hat mit 7.50 (bzw. die Rede war auch manchmal schon mit 7.40 SP10 – kann ich aber aktuell nicht bestätigen) die CDS Views mit der DCL Data Control Language um die Möglichkeit von impliziten Berechtigungsprüfungen in einem CDS View erweitert. Klingt erstmal etwas trocken ist aber ziemlich genial, denn dadurch können nun Datenbankzugriffe auf Basis der Dateninhalte mit einem Authority-Check versehen werden.

Und das Coole ist, dass dies einfach und schnell erledigt ist!

Nehmen wir an, wir haben eine Tabelle mit ein Feld SOURCE in dem auf der Datenbank die Werte 0001, 0002 und Space vorkommen, im konkreten Fall hab ich einfach die BUT000 genommen wo wir genau solche Einträge vorfinden:

cdsdcl1

Die Idee ist nun, dass wir einen CDS View auf die 4 Felder anlegen und über eine PFCG Rolle steuern dass nur Werte mit der SOURCE 0001 gelesen werden.

CDS View

Zuerst legen wir jetzt mit Eclipse einen neuen CDS View mit der DDL (Data Definition Language) an. Mit den Feldern PARTNER, SOURCE, MC_NAME1 und MC_NAME2:

cdsdcl2

Für jene die noch nicht mit Eclipse gearbeitet haben: DDL und DCL für CDS Views können derzeit nur mit Eclipse bearbeitet werden. Ein persönlicher Tipp: Eclipse wird immer wichtiger. Die CDS Views sind der Anfang. Ohne Eclipse keine CDS Views!

ABAP® CDS Views – 6 Schritte zum Verständnis

DDL Annotations

Natürlich gibt es bei einer DDL Beschreibung viele Annotation-Möglichkeiten, im Hinblick auf eine implizite Berechtigungsprüfung ist auf nachfolgende Annotation zu achten:

@AccessControlauthorizationCheck: #CHECK

die Berechtigungsprüfung durch eine DCL Access Control ermöglicht wird. #CHECK ist der Defaultwert (sprich auch ohne Angabe wäre der Wert auf #CHECK gestellt), weiter Eingabemöglichkeiten sind #NOT_REQUIRED und #NOT_ALLOWED.

  • #CHECK – Eine implizite Berechtigungsprüfung wird vorgenommen. Wenn zu dem View keine DCL existiert, kommt es bei der Syntaxprüfung zu einer Warnung.
  • #NOT_REQUIRED – Gleich wie #CHECK, jedoch ohne Warnung bei der Syntaxprüfung
  • #NOT_ALLOWED – Es wird keine Zugriffskontrolle vorgenommen.

Weitere Informationen zu den DDL Annotations sind bitte der SAP Online Dokumentation zu entnehmen.

PFCG Berechtigungsobjekt

Nun müssen wir ein Berechtigungsobjekt wählen oder neu erstellen. Ich hab ein neues Berechtigungsobjekt ZDEMODCL mit 2 Feldern ZBU_SOURCE und ACTVT erstellt. ZBU_SOURCE steht für den 4stelligen Wert in SOURCE. ACTVT verwende ich um die Aktivität 03 (03 = lesen) abzubilden:

cdsdcl3

DCL Rolle

Als Nächstes erstellen wir mit der DCL (Data Control Language) die Berechtigungsprüfung auf den View. Dazu müssen wir wieder nach Eclipse wechseln und ein DCL Objekt anlegen:

cdsdcl4

Dadurch wird eine DCL Rolle mit dem Namen ZCDSDCLDEMO_NAME definiert. In einer CDS Rolle können eine oder mehrere CDS Entitäten mit CDS Zugriffskontrollen versehen werden. Im konkreten Beispiel wird die CDS Entität ZCDSDEMOENT verwendet. Dies geschieht durch die Angabe GRANT SELECT ON ZCDSDEMOENT.

Nach der Angabe der CDS View muss eine WHERE-Klausel mit der Zugriffsbedingung folgen. Dies kann wiederum als Literalen (z.B. SOURCE = ‘0001‘) bestehen oder wie im obigen Beispiel aus einer PFCG-Bedingung.

PFCG-Bedingung

Eine PFCG-Bedingung wird mit ASPECT PFCG_AUTH ( <authorization_object>, [ field ], [ field ], …. ) definiert. Die Felder der PFCG Bedingung können gemappte Felder aus der WHERE-Klausel oder Literale wie z.B. ‘03‘ sein.

DCL Annotations

Mit der Annotation @MappingRole: true wird die Rolle gegen alle User automatisch geprüft. Weitere Werte sind derzeit hier zum aktuellen Zeitpunkt noch nicht möglich.

Die Annotation @EndUserText.label: ‘zrole_demo‘ ist der übersetzbare Kurztext der Rolle.

Berechtigungszuordnung

Wenn wir die obigen Schritte beendet haben, jedoch noch keine Berechtigungsvergabe an einen User vorgenommen haben, wird dieser bei einem DB Zugriff auf den CDS View – wie erhofft – keinerlei Daten zurückbekommen.

Erst wenn wir dem User eine Berechtigung für das Berechtigungsobjekt Z_DCL_DEMO erteilen werden die erlaubten Daten bei SELECT-Zugriffen zurückgeliefert.

cdsdcl5

SELECT Zugriff auf CDS Entity und CDS DB View

Bei allen ABAP SELECT Zugriffen auf die CDS Entität erfolgt nun die implizite Berechtigungsprüfung. Hingegen bei der obsoleten Möglichkeit des Zugriffs auf den CDS DB View erfolgt diese implizite Prüfung nicht. Aus dem Grund sollten die CDS DB Views auch nicht mehr verwendet werden und wurden von SAP auch als obsolet gekennzeichnet.

Nachfolgend ein Auswertungsergebnis auf ein die CDS Entität (links) und den CDS DB View (rechts). Wie erwartet wurde die Ergebnismenge der CDS Entität implizit auf die SOURCE 0001 gefiltert.

cdsdcl6

Troubleshooting & Testing

Manchmal schlagen sich Änderungen in den DCL Objekten nicht „durch“. Für DCL Analysen kann die Transaktion SACMDCLS verwendet werden. Dort sieht man detaillierte Informationen zu einem DCL Objekt und kann ggf. DCL Artefakte neu generieren.

Weiters ist auch noch die Transaktion SACMSEL interessant. Mit der kann der DCL Zugriff getestet werten.

Weiterführende Informationen

OpenSQL 1×1

OpenSQL ist eine Datenbanksprache mit der man bestimmte Operationen auf der Datenbank durchführen kann. Es stammt von der Firma SAP und wurde von der älteren Datenbanksprache SQL abgeleitet.

SQL, Abkürzung für „Structured Query Language“, wurde von Edgar Codd (IBM), Donald Chamberlin und Raymond Boyce, in den 1970er entworfen.

Es ist eine Sprache zum Abfragen und Bearbeiten von Datenbeständen in relationalen Datenbanken und zur Definition neuer Datenstrukturen.

Es gibt drei Kategorien von SQL Befehlen:

  • DML – Data Manipulation Language
    • Einfügen, Ändern, Löschen und lesender Zugriff
  • DDL – Data Definition Language
    • Definition neuer Datenbankstrukturen (Schemas, Tabellen usw.)
  • DCL – Data Control Language
    • Zur Rechteverwaltung und Transaktionskontrolle

In SAP bildet das ABAP Dictionary die DDL- und DCL-Befehle ab. Open SQL beinhaltet die DML Befehle. Wobei hier noch zu erwähnen ist, dass es nur aus einer Untermenge der Schlüsselwörter des Standard-SQL besteht. Nachfolgend eine Auflistung der Open SQL Schlüsselwörter, die verwendbar sind:

Schlüsselwort Funktion
SELECT Daten aus Datenbanktabellen lesen
INSERT Neue Zeilen in Datenbanktabellen einfügen
UPDATE Zeileninhalte in Datenbanktabellen ändern
MODIFY Neue Zeilen in Datenbanktabellen einfügen oder bestehende Zeileninhalte ändern
DELETE Zeilen aus Datenbanktabellen löschen
OPEN CURSOR,
FETCH,
CLOSE CURSOR
Zeilen von Datenbanktabellen über den Cursor lesen

Bevor wir uns den einzelnen Schlüsselwörtern widmen und diese näher erläutern, trägt der folgende Absatz noch zum besseren Verständnis vom Open SQL und seiner Verwendung in SAP, bei.

Ein SAP System ist ein drei Schichten System, bestehend aus UI, Applikationsserver und einer Datenbank. Die Datenbank kann von unterschiedlichen Datenbankenherstellern, wie MaxDB, DB2, Oracle, MSSQL, usw., verwendet werden. (Hier eine vollständige Auflistung der von der SAP unterstützten Datenbanken: http://help.sap.com/saphelp_nw73/helpdata/de/84/0cb892edfbc34290c1685132006662/content.htm)

Da jede von diesen Datenbanken einen unterschiedlichen SQL-Dialekt besitzt, wurde Open SQL eingeführt.

Denn Open SQL ist eine portable und datenbank-unabhängige Sprache. D.h., von allen Programmen bzw. Entwicklungen, die am Anwendungsserver laufen und Open SQL verwenden, können deren Open SQL Befehle auf jeder beliebigen darunter liegenden Datenbank ausgeführt werden.

Genauer gesagt, setzt die ABAP Laufzeitumgebung die Open SQL Befehle in die entsprechende Native SQL Befehle um. Mit Native SQL bezeichnet man das erwähnte spezifische SQL Dialekt der darunter liegenden Datenbank.

Es ist natürlich auch erlaubt Native SQL im ABAP Programm zu verwenden. Dabei arbeitet man mit datenbankspezifischen SQL Anweisungen. Das erlaubt die Einbindung verschiedener Datenbanktabellen, die nicht vom ABAP Dictionary verwaltet werden. Die Einschränkung jedoch ist, dass solche Programme im Allgemeinen nicht auf verschiedenen Datenbanksystemen laufen können.

 

Widmen wir uns nun den oben erwähnten Open SQL Schlüsselwörtern zu:

Schlüsselwort Funktion
SELECT, ENDSELECT Daten aus Datenbanktabellen lesen
INSERT Neue Zeilen in Datenbanktabellen einfügen
UPDATE Zeileninhalte in Datenbanktabellen ändern
MODIFY Neue Zeilen in Datenbanktabellen einfügen oder bestehende Zeileninhalte ändern
DELETE Zeilen aus Datenbanktabellen löschen
OPEN CURSOR,

FETCH,

CLOSE CURSOR

Zeilen von Datenbanktabellen über den Cursor lesen

Wie schon erwähnt sind diese nur eine Untermenge der Standard-SQL Schlüsselwörter, jedoch auch mit einigen SAP-spezifischen Elementen, wie z.B. der Zusatz FOR ALL ENTRIES, angereichert.

Um Datenbestände abzufragen wird das Schlüsselwort SELECT, am häufigsten verwendet. Das Lesen über den Cursor (OPEN CURSOR, FETCH, CLOSE CURSOR) ist auch möglich, jedoch ziemlich selten benutzt. Der Unterschied ist, dass beim Lesen der Daten über einen Cursor, die INTO-Klausel von der SELECT-Anweisung entkoppelt werden kann. Mit OPEN CURSOR wird ein Cursor für die Select-Anweisung geöffnet und danach können die Zeilen der Selektion einzeln in einen flachen Zielbereich gestellt werden.

 

SELECT

Die SELECT-Anweisung wird zum Lesen von Daten aus Datenbanktabellen verwendet und ist in mehrere elementare Klauseln aufgeteilt:

SELECT result: result definiert die Struktur der zu lesenden Daten. Dabei können einzelne Spalten oder komplette Zeilen mit * angegeben werden.

INTO target: die INTO Klausel bestimmt den Arbeitsbereich innerhalb eines ABAP Programms indem die gelesenen Daten gestellt werden sollen.

FROM source: source gibt die Datenbanktabelle oder View an von der gelesen werden soll. Die FROM-Klausel kann auch vor die INTO-Klausel gestellt werden.

WHERE cond: In der WHERE-Klausel werden Bedingungen bestellt, welche Zeilen gelesen werden sollen.

GROUP BY fields: Hiermit werden Gruppen mehrerer Zeilen zu einzelnen Zeilen zusammengefasst. Eine Gruppe ist ein Satz von Zeilen, die in jeder Spalte auf der Liste fields die gleichen Werte enthalten.

HAVING cond: Mit dieser Klausel werden logischen Bedingungen auf die durch GROUP BY  kombinierten Zeilen gesetzt.

ORDER BY fields: Hiermit gibt man eine Sortierreihenfolge der zu lesenden Zeilen vor.

 

Bei fast jeder dieser Klauseln gibt es Zusätze, wie z.B. SINGLE oder DISTINCT beim SELECT-Statement, CORRESPONDING FIELDS OF TABLE bei der INTO-Klausel, auf die ich hier nicht näher eingehen werde. (bei Bedarf liefert die SAP Onlinedokumentation Hilfe mit weiteren Details und konkreten Beispielen)

 

Aggregatfunktionen

Auf einzelnen Spalten von Datenbanktabellen können Aggregatsfunktionen angewendet werden. Aggregate sind zusammengefasste Daten einzelner Spalten.

S1 steht für einzelne Spaltennamen. Der Ausdruck agg steht für eine der folgenden Aggregatsfunktionen:

MAX: liefert den Maximalwert der Spalte

MIN: liefert den Minimalwert der Spalte

SUM: liefert die Summer der Spalte

AVG: liefert den Durchschnittswert der Spalte

COUNT: zählt Werte oder Zeilen;

COUNT( DISTINCT s ) liefert die Anzahl unterschiedlicher Werte in der Spalte s. Mit DISTINCT werden doppelt vorkommende Werte aus der Berechnung ausgeschlossen.

COUNT( * ) liefert die gesamte Anzahl der Zeilen in der Ergenismenge

Der Zusatz AS kann ein Alias, ein alternativer Spaltenname a1, definiert werden.

Nachfolgend ein Beispiel einer Select-Anweisung mit einer Aggregatsfunktion:

Mit dieser Anweisung erhält man den Geschäftspartner mit der höchsten vergebenen Geschäftspartnernummer.

 

Inner Join und Outer Join

Joins geben die Möglichkeit die Datenmenge über mehrere Datenbanktabellen zu selektieren. Bei einem INNER JOIN erhält man nur die Sätze des Kreuzproduktes, zu denen in allen beteiligten Tabellen ein Eintrag existiert.

Bei einem LEFT [OUTER] JOIN werden dagegen aus der linken Tabelle der Join-Verknüpfung auch Sätze selektiert, selbst wenn kein Eintrag in der anderen Tabelle existiert.

Nachfolgend ein Beispiel eines INNER JOINS:

Als Ergebnis würde man einen Datensatz erhalten, wenn dieser in beiden Tabellen vorhanden ist.

Nachfolgend ein Beispiel eines LEFT [OUTER] JOINS:

Mit LEFT OUTER JOIN wird nicht wie beim INNER JOIN nur dann ein Wert zurückgegeben wenn sich die JOIN Bedingung in beiden Tabellen findet, sondern hier kann als Ergebnis auch nur der Inhalt von Tabelle 1 (in diesem Fall BUT000) geliefert werden.

UP TO x ROWS

Mit diesem Zusatz werden die Anzahl der zu liefernden Zeilen an die Datenbank übergeben.

GROUP BY
Nachfolgend ein Beispiel eines GROUP BY:

SUBQUERIES

Mit Subqueries lassen sich eigene SELECT-Anweisung als Bedingung in der WHERE- oder HAVING- Klausel verschachteln.

Hier ein Beispiel eines Sub-Selects:

 

FOR ALL ENTRIES

Mit diesem Befehl werden alle Partner die sich in der internen ABAP Tabelle lt_partnertab befinden selektiert.

Der OPEN-SQL Zusatz FOR ALL ENTRIES ist bekanntlich eine SAP-spezifische Erweiterung und als solche nicht auf den Datenbanksystemen bekannt. Der DB-Optimizer wandelt solche SELECTS in entsprechende SQL Kommandos der Datenbank um.

 

Der Optimizer

Jedes Datenbanksystem verfügt über einen Optimizer. Die Aufgabe des Optimizers ist es, den Ausführungsplan für ein SQL-Statement zu erstellen (z.B. festlegen, ob ein Index- oder Table Scan durchgeführt wird). Es gibt zwei Ausprägungen von Optimizern:

Rule-based

Ein Rule-Based Optimizer analysiert die Struktur einer SQL-Anweisung (hauptsächlich SELECT und die WHERE-Klausel ohne Werte) und den Index der Tabelle(n). Über einen Bewertungsmechanismus entscheidet der Optimizer welches Vorgehen er anwendet, um den Befehl auszuführen.

Cost-based

Ein Cost-Based Optimizer betrachtet zusätzlich einige Werte in der WHERE-Klausel und die Statistiken der Tabellen. Die Statistiken enthalten Low- und High Values der Felder oder sogar ein Histogramm, das die Verteilung der Daten in der Tabelle enthält. Der Cost-Based Optimizer nutzt mehr Informationen über die Tabellen und führt daher meistens zu einem schnelleren Zugriff. Ein Nachteil beim Cost-Based Optimizer ist, daß die Statistiken periodisch auf den neuesten Stand gebracht werden müssen.

 

Rückgabewerte

Ein OpenSQL Befehl liefert folgende Rückgabewerte:

sy-subrc
Konnte der Befehl erfolgreich abgesetzt werden so enthält sy-subrc immer den Wert 0, ansonsten ungleich 0.

sy-dbcnt
Der Inhalt dieses Systemfelds enhält den Wert der durch den Befehl bearbeiteten Zeilen.

 

Neue Open SQL Features ab ABAP® 7.40, SP8

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:

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:

Ergebnis:

bsp1

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:

Ergebnis:

bsp2

Erklärung: Mit der arithmetischen Funktion CEIL findet eine Aufrundung, mit FLOOR eine Abrundung statt.

Beispiel eines Castings:

Ergebnis:

bsp3

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:

Ergebnis:

bsp4

Erklärung: In der dritten Spalte werden die ersten zwei Zeichenketten zusammen, durch ein Semikolon getrennt, ausgegeben.

Beispiel COALESCE:

Ergebnis:

bsp5

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:

Ergebnis:

bsp6

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:

Ergebnis:

bsp7

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:

cds1

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:

cds2

Zugriff auf die View:

Ergebnis:

cds2_result

Beispiel einer CDS View mit einer Währungskonvertierung:

cds3

Zugriff auf die View:

Ergebnis:

cds3_result

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.

Webinar – ABAP® 7.40 SP5/SP8 Releaseabhängige Änderungen – Unterlagen, Links, …

Unterlagen/Links zum Webinar ABAP 7.40 SP5 SP8 Releaseinformationen

Unsere nächsten Webinar Termine

SAP Online Dokumenation

Videos (Teched, … )

Blogs

Behind the scenes

Hier ein Bild von unserem Webinar. Man beachte, worauf wir die Webcam in der Mitte platziert haben!

20160129_111931

 

 

ABAP® – Das gibt’s ja nicht!

Ich wollte schon länger einmal über ein paar seltsame Dinge in ABAP schreiben. Es gibt nämlich ein paar Sachen in ABAP bei denen man sich einfach nur wundert. Na dann, fangen wir mal an:

BSEG, MARA oder DMBTR

Wer kennt sie nicht, die berühmten SAP ECC Tabellen BSEG oder MARA. Auch die Felder DMBTR oder GSBER sind sicher jedem bekannt.

Aber warum gibt es eigentlich solche komischen Kürzel, haben die Entwickler hier einfach ein paar Buchstabenwürfel verwendet? Natürlich nicht, das sind ganz einfach Relikte
aus R/2. Übrigens, DMBTR steht für „Deutsche Mark Betrag“!dmbtr

In R/2 waren nur 4stellige Tabellennamen und 5stellige Feldnamen erlaubt. SAP hat zwar damals mit R/3 eine völlig neue Technologie geliefert, aber viele ABAP Codes, Tabellen und Prozesse wurden einfach 1:1 übernommen. Und bis dato hat sich bei SAP offensichtlich niemand getraut hier einzugreifen.

Das älteste Programm das ich in einem aktuellen ECC gefunden habe, weißt Kommentare aus dem Jahr 1989 auf!

Bin schon jetzt gespannt, ob wir die Tabellen in S/4 HANA wiederfinden.

 

FOR ALL ENTRIES

Manche ABAP Entwickler schwören auf den FOR ALL ENTRIES Zusatz, manche verteufeln ihn. Ich bin da gespalten denn eigentlich mag ich das Zeug überhaupt nicht, aber andererseits komme auch ich manchmal nicht darum herum.

Aber was ich wirklich – sagen wir mal bescheiden – finde ist, wie ein SELECT mit FOR ALL ENTRIES reagiert, wenn die FOR ALL ENTRIES-Tabelle leer ist. Es werden einfach alle sonstigen Selektionsbedingungen komplett ignoriert und ein kompletter Tablescan durchgeführt. Ohne ersichtlichen Grund.

Hier ein Auszug aus der SAP Online Original Dokumentation:

Before using an internal table itab after FOR ALL ENTRIES, always check that the internal table is not initial. In an initial internal tables, all rows are read from the database regardless of any further conditions specified after WHERE. This is not usually the required behavior.

Nicht zu vergessen ist, dass FOR ALL ENTRIES auf unterschiedlichen Datenbanken teilweise ganz unterschiedlich performant ist. Es gäbe noch viele weitere Argumente (Bufferung, .. ) FOR ALL ENTRIES nicht zu verwenden, aber belassen wir es erst einmal dabei.

Man merke sich jedenfalls: Immer die Größe der FOR ALL ENTRIES Tabelle vor dem SELECT überprüfen – oder noch besser, über Alternativen wie JOINs oder Subselects nachdenken.

 

POOL/Cluster Tabellen

Oh, wie ich diese POOL und CLUSTER Tabellen liebe. Von der Technologie her betrachtet meiner Meinung nach einfach ein ziemlicher Schwachsinn. – Aber auch für diese Technologie gibt es einen triftigen Grund: Wie oben erwähnt waren in R/2 Tabellen nur max. 4stellig. Irgendwann ist SAP dann mit der 4stellen Limitierung einfach an Grenzen gestoßen und hat daher versucht hinter einer Tabelle mehrere Tabellen abzubilden. Das war die Geburt der POOL/CLUSTER Tabellen!

Aber es gibt Hilfe! Wenn wir dann einmal alle auf SAP Hana umstellen bekommen die POOL/CLUSTER Tabellen nach so vielen Jahren endlich ihren verdienten Ruhestand.

Es wäre aber nicht SAP wenn sie für den Vorgang nicht auch einen Namen gefunden hätte: „Depooling/Declustering“.

 

ABAP Open SQL und SQL92

SAP hat mit den aktuellen NetWeaver Releases 7.40 SP5, SP8 und SP12 bzw. NetWeaver 7.50 ein paar wichtige Erweiterungen in das ABAP Open SQL aufgenommen und nähert sich so nach und nach dem Standard SQL92. Manche ABAP Entwickler sind deswegen (SQL Expressions, CDS Views, … ) in heller „Juhu!“ Aufregung!

Liebe Entwickler, bitte vergesst nicht – das 92 hinter SQL Steht für das Jahr! Im Jahr 1992 wurde der Standard definiert. Diese jetzt aufgenommenen Erweiterungen werden von allen namhaften Datenbanken bereits seit Jahrzehnten unterstützt.

Ich meine, eine Erweiterung von ABAP Open SQL war seit Jahren längst überfällig!

 

TCURX

In der TCURX ist gecustomized, wie die Dezimalstelle von Währungen in einem SAP zu interpretieren sind. Wieso das?

Geboren wurde die Tabelle noch im R/2, als auch noch Währungen wie die italienische Lira existiert haben. Die Lira waren teilweise so „groß“ dass die Betragsfelder im R/2 nicht mehr ausgereicht hätten. Also hat man kurzerhand die Kommastellen laut Datenbank außer Kraft gesetzt und dafür die Tabelle TCURX erschaffen. Erst wenn eine Währung nicht in der TCURX enthalten ist, gelten für die Währung die 2 Nachkommastellen.

Im Bereich von Schnittstellen ist das immer wieder ein extra Aufwand – nur um die Betragfelder hin und her zu konvertieren. Beispielswiese für YEN.

Ob man hier nicht irgendwann einmal eine besser Lösung hätte finden können?

 

Jetzt also doch, CODE PUSH DOWN

Jahrelang hat SAP ihren Kunden und uns Entwickler gesagt, DB Nahe Operationen (EXEC SQL, DB Hints, … ) nur in begründeten Fällen und mit Vorsicht zu verwenden. Man verliere so die Unabhängigkeit zur Datenbank oder hat natürlich einen Adaptierungsaufwand wenn gleiches Coding mit verschiedenen Backend-Datenbanken laufen soll.

Nun, da SAP jetzt mit SAP Hana ja eine eigene tolle Datenbank hat, sieht die Sache natürlich etwas anders aus. Jetzt empfiehlt SAP sogar direkter auf der Datenbank „operieren“ um deren Vorteile auch wirklich nutzen zu können. Das Modewort dafür ist „Code Push Down“. Aus ABAP Sicht werden darunter die CDS Views, die AMDB Prozeduren und die SQL Expressions verstanden. Auf der SAP Hana ist darunter z.B. SQL Script zu verstehen.

Nicht falsch verstehen, ich bin ein großer Fan von SAP Hana. Die ist einfach – sorry für den Ausdruck – Sauschnell!

Ich find es halt einfach nur interessant.

 

SAP® CodeJam SAPUI5® hosted von Cadaxo

Am 5. November 2015 veranstalte die Firma Cadaxo gemeinsam mit der SAP die erste SAPUI5 CodeJam in Wien. Zweck dieser CodeJam war es Entwickler zusammenzubringen, um gemeinsam die neue SAP Technologie SAPUI5 kennenzulernen, gemeinsam auszuprobieren, praxisnah zu entwickeln und dabei Spaß haben.

Die SAP Expertin Denise Nepraunig führte diese Veranstaltung und stand den Teilnehmern mit Rat und Tat zur Seite. Nach einer kleinen Einführung in die Materie, dem Kennenlernen des WebIDE, der Entwicklungsumgebung für SAPUI5 Apps, ging es gleich ran an die Tasten.
Sowohl Erfahrene SAPUI5 Entwickler, als auch Beginner befassten sich intensiv mit dem Thema und konnten am Ende des Tages beachtliche, eigens-programmierte SAPUI5 Apps vorweisen.

IMG_0172 IMG_0173

 

Trotz der anstrengenden Arbeit, kam der Spaß nicht zu kurz:

IMG_0189 IMG_0117IMG_0151

Dieses hervorragende Mittagessen haben wir uns redlich verdient:

IMG_0250 IMG_0236 IMG_0248

Nach getaner Arbeit haben wir den Abend bei dem einen oder anderen Glas Bier und Wein, gemütlich ausklingen lassen…

IMG_0264

Wem die Fotos nicht genügen, hier noch ein kurzes Video über die SAPUI5 CodeJam: SAP CodeJam SAPUI5 Wien

Nach so viel positives Feedback, können wir beruhigt sagen, dass es ein gelungenes Event war, bei dem für jeden was dabei war. Ich freue mich schon auf die nächste SAP CodeJam in Wien.

Ich möchte mich auch bei allen Teilnehmern bedanken und natürlich aus bei Denise! CodeJam rocks!