Aktionen und Funktionen bereitstellen

Objective

After completing this lesson, you will be able to domänenspezifische kundendefinierte Operationen deklarieren und implementieren

Aktionen und Funktionen in CDS modellieren

Zuvor wurden Beispiele für Before- und After-Event-Handler besprochen. Sehen wir uns nun einen Anwendungsfall für On-Handler an.

Ein On-Handler erfüllt tatsächlich Anforderungen, z.B. durch Lesen oder Schreiben von Daten aus oder in Datenbanken. In unserem Beispiel möchten wir einen On-Handler verwenden, um eine domänenspezifische kundendefinierte Operation zu implementieren.

Sehen Sie sich das Video an, um zu sehen, wie CAP die Implementierung domänenspezifischer kundendefinierter Operationen unterstützt.

Notiz

SAP empfiehlt, ungebundene Aktionen/Funktionen zu bevorzugen, da diese viel einfacher zu implementieren und aufzurufen sind.

Als Beispiel möchten wir eine ungebundene Aktion namens submitOrder für den CatalogService implementieren. Es wird verwendet, um Bestellungen aufzugeben (in sehr vereinfachter Weise). Wir deklarieren diese Aktion innerhalb der Service-Definition wie in der folgenden Abbildung dargestellt.

Die Aktion submitOrder hat zwei Eingangsparameter. Der erste Parameter namens book wird verwendet, um die zu bestellende Dokumentenmappe zu identifizieren. Der Parameter wird mit dem Datentyp des ID-Elements aus der im importierten Domänenmodell definierten Dokumentenmappenentität eingegeben.

Der zweite Parameter quantity ist vom Typ Integer und gibt die Anzahl der zu bestellenden Positionen an.

Als Reaktionsart wird ein Objekt mit der Eigenschaft Bestand definiert. Diese Eigenschaft wird mit dem Datentyp des Bestandselements aus der Domänenmodellentität Dokumentenmappen eingegeben. Der Wert der Eigenschaft sollte der junge Bestand für das Buch sein, nachdem der Auftrag ausgeführt wurde.

Notiz

Weitere Beispiele für die Definition ungebundener und gebundener Aktionen und Funktionen in CDS-Modellen finden Sie in der CAP-Dokumentation.

Schauen wir uns nun an, wie die deklarierte submitOrder-Aktion implementiert wird.

Aktionen/Funktionen implementieren

Aktionen und Funktionen können wie auf Ereignisbehandler implementiert werden. Die Handler für Aktionen und Funktionen sind den Ereignisbehandlern, die wir bereits für CRUD-Ereignisse verwendet haben, sehr ähnlich.

Wir registrieren den On-Handler für unsere ungebundene submitOrder-Aktion in der Methode init() der Implementierungsklasse für den CatalogService (siehe folgende Abbildung). Dazu rufen wir die geerbte Methode on() über this.on()auf.

Im gezeigten Beispiel registrieren wir die benannte Funktion this.redueStock als Implementierung für die submitOrder-Aktion. Dazu wird der Name der Aktion als erster Parameter an die Methode on() und als zweiter Parameter die Funktion übergeben. Die Implementierung der ReduceStock-Funktionalität wird im nächsten Abschnitt näher erläutert.

Notiz

Informationen zur Registrierung von Handlern für gebundene Aktionen/Funktionen finden Sie in der CAP-Dokumentation.

Vormethodenimplementierung

Die Idee für die Implementierung der Methode redueStock lautet wie folgt.

Wir aktualisieren den Bestand des bestellten Buchs entsprechend der übergebenen Menge in der Datenbank und geben den aktualisierten Bestand über den Rückgabeparameter der Aktion zurück.

Folgende Validierungen sollen durchgeführt werden:

  • Die übergebene Menge muss größer oder gleich 1 sein.
  • Die übergebene Mappen-ID muss in der Datenbank vorhanden sein.
  • Der Bestand für das Buch muss größer oder gleich der bestellten Menge sein.

Wenn eine dieser Validierungen fehlschlägt, sollte eine Fehlermeldung ausgegeben werden.

Um diese Logik zu implementieren, müssen wir auf die Datenbank zugreifen. Wir werden aber erst in der nächsten Lektion lernen, wie das geht. Daher beschränken wir uns hier auf eine unvollständige, vorläufige Einführung der Methode ReduceStock (siehe folgende Abbildung).

Zunächst ordnen wir die CSN-Definition der Entität Bücher der Konstante Bücher über eine Destrukturierungszuordnung zu. Diese Konstante wird später für den Zugriff auf die Datenbank verwendet.

Auf Behandlern wird unter anderem eine Instanz von cds.Request als Argument empfangen. Im gezeigten Beispiel haben wir dieses Argument req genannt. Die Dateneigenschaft des req -Objekts wird verwendet, um auf die Werte der Parameter book und quantity der Aktion zuzugreifen. Hier erfolgt die Zuordnung der übergebenen Werte zu den Konstanten book und quantity über eine Destrukturierungszuordnung.

Wenn die übergebene Menge kleiner als 1 ist, wird eine entsprechende Fehlermeldung mit der Methode req.error() ausgegeben.

Vorerst geben wir einfach 10 als aktualisierten Bestand zurück. Wir werden dies später entsprechend anpassen.

Notiz

Alternativ zur Registrierung eines On-Handlers können Aktionen und Funktionen auch als herkömmliche JavaScript-Methoden auf einer Service-Implementierungsklasse implementiert werden. Der Methodenname muss dann mit dem Namen der Aktion/Funktion übereinstimmen. Die Implementierung für unsere submitOrder-Aktion würde dann wie folgt aussehen:

JavaScript
1234567891011121314
class CatalogService extends cds.ApplicationService { submitOrder(book, quantity) { const { Books } = this.entities; if (quantity < 1) { return req.error('The quantity must be at least 1.'); } let stock = 10; return { stock }; } }

Eine solche methodische Implementierung einer Aktion/Funktion ist in der Methode init() nicht registriert.

Aktionen/Funktionen aufrufen

Programmatische Nutzung über APIs

Aktionen und Funktionen können innerhalb des Codings aufgerufen werden. CAP bietet zwei verschiedene Optionen für diese programmatische Verwendung: ein generisches API und ein typisiertes API. Für Letzteres stattet Node.js generierte Serviceinstanzen mit bestimmten Methoden aus, deren Namen und Parameter der Deklaration der Aktionen/Funktionen im Servicemodell entsprechen. Diese automatisch generierten Methoden bieten eine bequeme Möglichkeit, Aktionen/Funktionen aufzurufen.

Notiz

Beispiele für die programmatische Verwendung von Aktionen/Funktionen finden Sie in der CAP-Dokumentation.

HTTP-Requests

Aktionen und Funktionen können auch direkt über HTTP-Requests aufgerufen werden. Funktionen werden über GET-Requests aufgerufen, während Aktionen über POST-Requests adressiert werden.

Ein HTTP-Request zum Aufrufen unserer unbound submitOrder-Aktion könnte beispielsweise wie folgt aussehen:

Code Snippet
1234567
POST <service_url>/submitOrder Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 2 }

Notiz

Weitere Beispiele für HTTP-Requests zum Aufruf von ungebundenen und gebundenen Aktionen/Funktionen finden Sie in der CAP-Dokumentation.

Demonstration und Übung: Benutzerdefinierte Aktion definieren und implementieren

Notiz

Führen Sie als Übung die Schritt-für-Schritt-Anleitung in der folgenden Demonstration selbst im SAP Business Application Studio durch.

Verwenden Sie als Ausgangspunkt für die Übung das Ergebnis der vorherigen Übung Geben Sie einen Ereignisbehandler an, wenn Sie ihn erfolgreich abgeschlossen haben. Alternativ können Sie auch den Branch 12_.after_event_handler aus dem folgenden GitHub-Repository als Ausgangspunkt verwenden:

https://github.com/SAP-samples/cap-development-learning-journey

Die vollständige Implementierung der Simulation finden Sie im Zweig 13_custom_action des GitHub-Repositorys.

Detaillierte Informationen zum Inhalt des Repositorys und dessen Verwendung finden Sie hier.

Sehen Sie sich das Video an, um zu sehen, wie Sie eine benutzerdefinierte Aktion definieren und implementieren.