ABAP CDS

Um Performance-Probleme, die durch die Einhaltung der Trennung zwischen Datenbank (Model) und Applikationsebene (Controller ) entstehen zu vermindern, verfolgt SAP seit einiger Zeit die Strategie des „Code push down“. Hierdurch soll so viel Anwendungslogik wie möglich vom Applikationsserver auf die Datenbank verlagert werden. Die Datenbank soll alle rechen- bzw. datenintensive Logik soweit wie möglich übernehmen.

Neue Open SQL Features ab ABAP 7.40, SP8

Mit dem Release 7.40, SP5 und SP8, hat sich bei Open SQL einiges getan. SAP hat nach einem längeren Stillstand endlich an den SQL92-Standard, der aus dem Jahre 1992 stammt, angeknüpft und unterstützt nun Features wie z.B. UNION und CASE.

Neue Syntax

Es gibt 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. Mit Einführung des neuen Parsers wurde openSQL SQL92-konform. Nachfolgend einige der neuen Features:

  • Aufgelistete Spaltennamen können und sollen durch Komma getrennt werden
  • Bei Hostvariablen soll ein @ vorangestellt werden
  • Open SQL Expressionen
    • 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

Im Rahmen der Code Push Down Strategie der SAP, mit der eine Beschleunigung des Daten-Retrievals durch Verarbeitung direkt in der Datenbank erreicht werden soll, sind die CDS-Views entwickelt worden. Diese stellen eine Kapselung bei der Erzeugung von Entitäten dar. In den Views werden datenbankspezifische Anweisungen definiert. CDS-Views wurden zunächst für den Einsatz in der HANA Datenbank entwickelt. Um im ABAP-Stack ebenfalls Code Pushdown verwenden zu können, wurde eine Variante entwickelt, die die Views über das ABAP Dictionary definieren können. In diesen wird statt native-SQL wie in den HANA CDS, Open SQL verwendet, um die Datenbankunabhängigkeit zu gewährleisten.

ABAP CDS können über die ADT (ABAP Development Tools) definiert und gepflegt, sowie in der SE11 eingesehen werden. Obwohl es den Anschein hat, als ob die Datenverarbeitung nach wie vor auf dem Application-Server stattfindet, werden die Anweisungen direkt auf der DB durchgeführt.
Nachdem es bei den traditionellen Datenbank-Views sehr viele Einschränkungen, wie keine Outer Joins, keine komplexen Joins, keine Kommentare, kein Union, keine View auf eine View usw. gibt, hat sich dahingehend mit den CDS Views ein revolutionärer Fortschritt entwickelt.
Es kaum noch Einschränkungen. 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 von SQL und erweitert es um die Möglichkeit sogenannte Annotationen und Assoziationen zu definieren.

In vielen Fällen kann die Ablauflogik eines Service komplett in die Views verlagert werden, so daß auf die Applikations-Ebene verzichtet werden kann und dem View direkt eine Serviceschnittstelle (z.B. OData) mitgegeben werden kann.

Ziele

  • Mit ABAP Development Tools (ADT) einen CDS-View erstellen.
  • Anwenden der ABAP- und SQL-Elemente
    – SELECT-Statement,
    – CASE-Anweisung und
    – WHERE-Clause
    in einem CDS-View.

Schritt 1: Erstellen des CDS-Views

Wählen Sie im Kontextmenü Ihres Pakets Neu und dann Other > ABAP-Repository-Objekt

Wählen Sie Datendefinition und dann Weiter.

Geben Sie die folgenden Werte ein und wählen Sie dann Weiter

NameZ_INVOICE_ITEMS_001
BeschreibungRechnungspositionen

Wählen Sie den Eintrag Define view und dann Fertig stellen

Der neu angelegte View wird im Editor angezeigt.
Passen Sie den Namen des SQL-Views an (z.B. Z_ITEMS_001).
Legen Sie die Datenquelle des Views fest (sepm_sddl_so_invoice_item).
Hinweis : Sie können über die Code-Vervollständigung Vorschläge für die Datenquelle erhalten, indem Sie einige Zeichen eingeben und dann die Tastenkombination STRG + LEERTASTE verwenden.

Der Name der SQL-View (Z_ITEMS_001) ist der interne/technische Name der View, der in der Datenbank erstellt wird. Z_INVOICE_ITEMS_001 ist der Name der CDS-View, die erweiterte Funktionen zum Erstellen von Views in ABAP bietet.
Im ABAP verwenden Sie immer den Namen des CDS-Views.

Schritt 3: Bearbeiten der SELECT-Anweisung

Ausgabefelder für die SELECT-Anweisung
(select from sepm_sddl_so_invoice_item)
werden als Auflistung in den Body View geschrieben.
Hinweis : Sie können über die Code-Vervollständigung
Vorschläge für Datenfelder erhalten, indem Sie einige Zeichen eingeben und dann die Tastenkombination STRG + LEERTASTE verwenden.
Sie können über den Eintrag Alle Elemente einfügen sämtliche Felder der Tabelle einfügen.
Wir wollen hier lediglich die Felder
– sepm_sddl_so_invoice_item.currency_code
– sepm_sddl_so_invoice_item.gross_amount
einfügen.

Schritt 4: CDS-Assoziationen anzeigen.

Wir modellieren nun Beziehungen zwischen Datenquellen mithilfe vorhandener CDS-Zuordnungen.Man kann auf Elemente (Felder und Assoziationen) in durch Assoziationen verbundenen Datenquellen zugreifen, ohne JOIN-Bedingungen angeben zu müssen.
Im unteren Bereich der Auswahlliste werden assoziierte Datenquellen, auf die zugegriffen werden kann, angezeigt.Um Details zur Zieldatenquelle des Zuordnungsheaders anzuzeigen, wählen Sie in unserem Fall den Hyperlink sepm_sddl_so_invoice_header.

Schritt 5: Hinzufügen von Feldern aus vorhandenen Assoziationen

Wir werden nun Felder assoziierter Datenquellen zur SELECT-Liste unserer View Z_Invoice_Items hinzufügen.

Dazu muss dem View die Zieldatenquelle der Assoziation bekannt gemacht werden. Ausserdem muss das Schlüsselfeld, über das die Viewtabelle mit der assoziierten Tabelle verbunden ist, in der Feldliste vorhanden sein.
Wir fügen also zunächst das Feld sepm_sddl_so_invoice_item.sales_order_invoice_key zur Feldliste hinzu. Danach fügen wir nach der Feldliste (am Besten hinter einem Kommentar) den Namen der Assoziation header hinzu.

Anschließend können wir die assoziierten Felder in Pfadnotation (header.payment_status und header.buyer.company_name) an der passenden Stelle einfügen.

Schritt 6: Ein CASE-Statement hinzufügen

CDS-Views erlauben auch die Verwendung einiger Statements zur Ablaufsteuerung (CASE-Anweisungen).Damit kann man zum Beispiel Ausgabewerte in Abhängigkeit von Zuständen steuern.Wir werden den Zahlungsstatus auf ‚X‘, wenn die Rechnung bezahlt wurde, und ansonsten auf blank ‚ ‚ setzen.
Wir werden dazu einen CASE-Ausdruck implementieren und dem Ausdruck den Alias payment_status zuweisen. Wir entfernen Sie die vorhandene Deklaration header.payment_status und ersetzen Sie sie durch den folgenden Code.

case header.payment_status
   when 'P' then 'X';
   else ' ';
end as payment_status,

Schritt 7: Eine Where-Clause implementieren

Where-Clauses wirken als Filter auf Ergebnisse. In userem Beispiel möchten wir nur Rechnungspositionen mit dem Währungscode = ‚EUR‘ abrufen. Dazu fügen wir eine WHERE-Klausel hinzu :

Nach Speichern (Strg + S) und Aktivieren (Strg + F3) der View, können wir die Ergebnisliste durch Ausführen (F8) im Data Preview sehen.
Wir erhalten folgendes Ergebnis :

Ziele

  • Verwendung der CDS-View im SAP List Viewer (ALV) mit integriertem Datenzugriff (IDA).
  • Verbesserung des ALV Erscheinungsbildes durch Verwendung eines Datenelements und einer CASE-Anweisung.

Schritt 1: Wählen Sie entweder Programme > Z_INVOICE_ITEMS_EURO

oder wählen Sie ABAP-Entwicklungsobjekt öffnen
(Strg + Umschalt + A) und geben Sie den Programmnamen Z_INVOICE_ITEMS_EURO in das Suchfeld ein

Schritt 2: Duplizieren Sie das ABAP-Programm

Wählen Sie das Programm aus und wählen Sie Duplizieren aus dem Kontextmenü.

Geben Sie das richtige Paket und einen Namen für Ihr dupliziertes Programm ein und wählen Sie dann Weiter.

Schritt 3: Fügen Sie der Methodenimplementierung ein ALV-Grid hinzu

2. Erstellen Sie nun einen ALV mit IDA für Ihre CDS-Ansicht Z_Invoice_Items_001 und zeigen Sie den ALV im Vollbildmodus an:
cl_salv_gui_table_ida => create_for_cds_view (‚Z_Invoice_Items_001‘) -> fullscreen () -> display ()

Der Name des CDS-Views ist derjenige, der im Statement define view des CDS-Views definiert ist

3. Wählen Sie Speichern (Strg + S) und Aktivieren (Strg + F3).
4. Führen Sie Ihr Programm aus, indem Sie Ausführen (F8) wählen.
Die Rechnungspositionen werden in ALV mit IDA angezeigt.

Schritt 4: Tooltip-Informationen über Annotation erzeugen

Wir werden versuchen, Tooltip-Informationen für die Spalte „Paid“ anzuzeigen, wenn wir den Cursor auf die Spaltenüberschrift positionieren. Wir können dieses Verhalten im CDS-View mit einer Annotation erzeugen.

Nach dem Speichern (Strg-S) und Aktivieren (Strg-F3) führen Sie das Programm erneut aus. Das Erbenis sollte wie folgt aussehen:

Schritt 5: Spaltenbeschriftung im ALV ändern

Wir haben einen Tooltip für die Spalte „Paid“ erstellt, aber es gibt noch keine Überschrift für die Spalte.
Wir können dies dadurch beheben, dass wir den Typ des transformierten Zahlungsstatus mithilfe einer CAST-Anweisung in ein Datenelement ( zso_invoice_payment_status ) umwandeln.

5.1. Datenelement erzeugen

Erstellen Sie das Datenelement zso_invoice_payment_status :
Wählen Sie 
File > New… > Other… > Data… > Dictionary > Data element und geben Sie Folgendes ein:

Geben Sie folgende Werte ein:

Paketz. B. Z001_Tutorial
Namezso_invoice_payment_status
Descriptionzso_invoice_payment_status

Wählen Sie Fertig stellen.

Geben Sie folgende Werte ein:

Typ NameFlag
Feldbezeichnungen: shortPaid
Feldbezeichnungen, andereInvoice Paid

5.2. CAST-Anweisung hinzufügen

Fügen Sie nun die CAST-Anweisung hinzu.

cast(
   case header.payment_status
      when 'P' then 'X';
      else ' ';
   end
as zso_invoice_payment_status )

as payment_status,

Speichern (Strg-S) und Aktivieren (Strg-F3) Sie den CDS-View. Wenn Sie das Programm jetzt ausführen, sollte Ihr SAP List Viewer folgendermaßen aussehen: