SAP Cloud Application Programming Model: OData Implementierung mit CDS

Moin, heute bauen wir ganz einfach einen OData Service in der SAP Cloud Foundry mit Hilfe des SAP Cloud Application Programming Models und Core Data Services (CDS). Groß programmieren müssen wir dafür nicht, es reicht im Grunde zwei Dateien zu editieren.
Die SAP Cloud Platform Business Application fasst die UI, das Datenbankmodell und den OData-Service in einem Projekt zusammen. Wir beschränken uns in diesem Beitrag auf die DB und den Service.

Ich habe ein Beispiel für dich vorbereitet, so dass wir uns den befüllten OData Service am Ende ansehen können.

[0]: Voraussetzungen

Um diesem Beispiel zu folgen benötigst du:

  • einen SAP-User
  • Zugriff auf die Cloud Foundry (die Trial-Version reicht aus)
  • es hilft wenn du mit der WebIDE umgehen kannst

Du hast noch gar nicht mit der SAP Cloud und der Web IDE gearbeitet? Dann guck dir mal diesen Beitrag von uns an, da arbeitest du erstmal mit einem fertigen OData Service und einem UI-Template. Falls du deine Cloud Foundry Trial noch nicht aktiviert hast, gehst du einfach in das Cloud Platform Cockpit (CPC) und klickst dort auf Cloud Foundry .

Bevor es aber richtig los gehen kann müssen wir unsere IDE noch etwas konfigurieren. Dafür gehst du einmal in die Einstellungen der WebIDE.

Die Einstellungen der WebIDE erreicht man über das Zahnrad-Icon
Da verstecken sich die Einstellungen.

Da findest du unter Worspace Preferences > Cloud Foundry die Einstellungen für die Cloud Foundry.

Den Zugang zur Cloud Foundry konfigurieren wir in den Einstellungen.

Über das Drop Down Menü wählst du den ...api.cf.eu10... Endpunkt aus. Die WebIDE fragt dich dann nach deinem Login-Daten. Hier meldest du dich mit der E-Mail und dem Passwort deines SAP-Accounts an.

Und das war es auch schon, jetzt kann es losgehen.

[1]: Projekt anlegen

Wechsel einmal in die Development Ansicht indem du auf das Symbol –> (</>) klickst.
Mit einem Rechtsklick auf Workspace > New > Project from Template. In dem PopUp stellst du die Category auf “All categories” und suchst das SAP Cloud Platform Business Application Template.

Die Template-Suche der Web IDE

In diesem Beispiel möchte ich einen einfachen Online-Shop-Backend erstellen, also gebe ich als Projektname einfach “Shop” ein. In dem nächsten Schritt kannst du die Einstellungen beibehalten.

Projekt erstellen Schritt 2 & 3
Projekt anlegen Schritt 2 & 3

Im letzten Schritt hast du die Wahl zwischen einem Java- oder NodeJS-OData Service. Mit NodeJS bekommst du einen OData Service in Version 4 mit Java Version 2.

Dabei solltest du bedenken, dass nicht alle UI5 Templates V4 unterstützen, wenn du also nach diesem Beitrag noch eine UI hinzufügen möchtest empfehle ich den Java Service.

Ich passe noch den Package-Namen an. Den Rest kannst du so lassen.

OData-Service Konfiguration
OData-Service: Java oder NodeJS.

Achtung! Der OData Service den wir jetzt anlegen läuft ohne Authentifizierung.

Wir müssen nur zwei cds Dateien editieren
Wir müssen nur zwei cds Dateien editieren.

Öffne mal die beiden Dateien die ich rot markiert habe. In der data-model.cds-Datei definieren wir gleich unsere Datenbankstruktur. Und in der cat-service.cds-Datei definieren wir danach unseren OData-Service.

[2]: OData Model & Service mit CDS

Die beiden Dateien sind zu diesem Zeitpunkt bereits mit Beispieldaten befüllt. Du kannst sie dir ruhig noch mal kurz ansehen, denn wir werden sie gleich durch ein etwas komplexeres Beispiel ersetzen.

Trotzdem geht es hier natürlich nicht um das Schema sondern um die Technologie. Wenn dir mein Beispiel also nicht gefällt kannst du auch etwas anderes benutzen.

Ich befülle die data-model.cds jetzt mit dem folgenden Inhalt.

namespace my.shop;

entity Customers {
    key C_ID            : Integer;
    C_Name              : String;
    C_Address           : String;
}

entity Vendors {
    key V_ID            : Integer;
    V_Name              : String;
}

entity Products {
    key P_ID            : Integer;
    P_Name              : String;
    P_Vendor            : Association to Vendors; 
    P_UnitsInStock      : Integer;
    P_Price             : Decimal(10,2); 
    P_EAN               : String;
}

entity Orders {
    key O_ID            : Integer;
    O_Items             : Composition of many OrderItems on O_Items.OI_Order = $self;
    O_Customer          : Association to Customers;
}
entity OrderItems {
    key OI_Order        : Association to Orders;
    OI_Product          : Association to Products; 
    OI_Quantity         : Integer;
}

Bevor du jetzt speicherst, müssen wir noch den Service konfigurieren, dafür passen wir die andere Datei an.

using my.shop as my from '../db/data-model';


service CatalogService {
    entity Customers        as projection on my.Customers;
    entity Vendors          as projection on my.Vendors;
    entity Products         as projection on my.Products;
    entity Orders           as projection on my.Orders;
    entity OrderItems       as projection on my.OrderItems;
}

Diese ist deutlich kürzer und recht übersichtlich oder? Wenn du dir das original Beispiel angesehen hast, dann ist dir bestimmt aufgefallen, dass da noch ein @readonly neben der Entity stand. Und daraus folgt natürlich, dass dieser Service auch Schreibzugriffe zulassen wird.

Wenn du mehr zu der Syntax erfahren willst kannst du mal hier nachlesen. Und das war es auch schon.

Ja wirklich, damit hast du einen OData-Service + Datenbank angelegt. Jetzt speicherst du einmal beide Dateien (Strg+Shift+S).

Jetzt öffnet sich die Konsole und es wird und die CDS Dateien werden kompiliert. Wenn hier ein Fehler auftritt, dann hast du dich vermutlich vertippt.

Über das Menü kann man auch manuell einen CDS Build auslösen.
Wenn das automatische bauen bei dir deaktiviert ist, kannst du es auch selber auslösen.

Hier noch mal der Hinweis, unser Dienst läuft ohne Authentifizierung jeder, der die URL kennt, kann Daten in die Datenbank schreiben.

Bevor wir zum nächsten Schritt gehen, sehen wir uns noch kurz an, was die WebIDE da gebaut hat.

Wirf auch mal einen Blick in /srv/src/resources/edmx/ da liegen zwei Dateien für den Service. Die Inhalte dürften dir bekannt vor kommen, schließlich stammen sie von den beiden Dateien ab, die wir vorher bearbeitet hatten.

[3]: Daten, Deploy und Erkundung

Bevor wir jetzt die DB und den Service in der Cloud deployen. Befüllen wir ihn noch mit Beispieldaten.

Für mein Beispiel habe ich bereits ein paar CSV-Dateien und die nötige Data.hdbtabledata. In einem Git Repository abgelegt, diese kannst du hier als zip-Datei laden.

In der WebIDE dem db Verzeichnis legst du einen neues Verzeichnis csv an. Über Rechtsklick auf csv > Import > File or Project lädst du die import.zip Datei hoch.

Das neue CSV-Verzeichnis.
Das neue CSV-Verzeichnis.

Jetzt musst du noch mal den CDS Build auslösen. Wenn der fertig ist, startest du per Rechtsklick auf das db-Verzeichnis Build > Build den Build-Prozess für die Datenbank.

Build für die Datenbank über Rechtsklick starten
Build für die Datenbank über Rechtsklick starten.

Je nach Auslastung der Cloud kann dieser Prozess ein paar Minuten dauern, steh mal auf und mach dir einen frischen Kaffee.

Der Java OData Service wird gestartet

 

Zum Abschluss starten wir den Java-Service. Wenn der Service gestartet ist, erscheint unten in der Console eine URL zu deinem neuen OData-Service.

URL zum Service

Wenn du die URL öffnest, kannst du dir deinen neuen Service ansehen. Hänge mal /$metadata an die URL damit kannst du die die Metadaten des Services ansehen.

Metadaten unseres OData-Service
Die Metadaten bekommst du, wenn du /$metadata an die URL hängst.

Die Datensätze kannst du dir ansehen, in dem du zum Beispiel /Products an die URL hängst.

Produkte Datensatz
Ein Produkt-Datensatz

Damit ist unser OData Service fertig und du hast wieder etwas gelernt. Wenn du noch Zeit hast, kannst du ja einen anderen Beitrag lesen.

 

Du interessierst dich für Fiori und hast Lust coole Projekte mit uns zu machen? Wir suchen dich! Schau doch mal in unserer Stellenbeschreibung vorbei.

Über den Autor

Benjamin Brahmer

Kommentar verfassen