Queries aufbauen und ausführen

Objective

After completing this lesson, you will be able to datenbankabfragen erstellen und ausführen

Queries aufbauen

In der vorherigen Lektion haben wir die Aktion submitOrder für den CatalogService angelegt. Die Implementierung dieser Aktion ist noch nicht abgeschlossen, da wir noch nicht wissen, wie auf Datenbanktabellen zugegriffen werden kann. Wir werden das als nächstes lernen.

Um die Aktion submitOrder zu implementieren, benötigen wir die folgenden beiden Datenbankzugriffe:

  1. Wir möchten sicherstellen, dass der aktuelle Bestand für das bestellte Buch größer oder gleich der bestellten Menge ist. Dazu müssen wir den aktuellen Bestand aus der Datenbank auswählen.
  2. Wenn genügend Bücher auf Lager sind und der Auftrag daher ausgeführt wird, müssen wir den aktuellen Bestand reduzieren. Das bedeutet, dass der Bestand in der Datenbank entsprechend aktualisiert werden muss.

Fließende API

Das Modul cds.ql stellt ein SQL-ähnliches API zum Erstellen solcher Datenbankabfragen bereit. Die für unser Szenario erforderlichen Querys sind in der folgenden Abbildung dargestellt.

Die API wird über die globalen Objekte SELECT, INSERT, UPSERT, UPDATE und DELETE zur Verfügung gestellt.

Notiz

Alternativ können Sie diese Objekte wie folgt von cds.ql beziehen:
JavaScript
12
const cds = require('@sap/cds'); const { SELECT, INSERT, UPSERT, UPDATE, DELETE } = cds.ql;
Darüber hinaus stehen Komfort-Methoden zum Erstellen von cds.ql-Abfrageobjekten zur Verfügung. Details zu diesem CRUD-artigen API mit Methoden wie read(), insert(), upsert(), update() und delete() finden Sie in der CAP-Dokumentation.

Das über die aufgelisteten CRUD-Objekte verfügbare API ist als fließendes API konzipiert. Das bedeutet, dass die Methoden, die für diese Objekte verfügbar sind, Objekte desselben Typs zurückgeben. Verfügbare Eigenschaften, wie z.B. die Eigenschaft .one des im gezeigten Beispiel verwendeten SELECT-Objekts, haben auch Objekte desselben Typs wie ihr Wert. Dies ermöglicht eine Verkettung, wodurch die Kodierung intuitiv und lesbar wird.

Notiz

Details zu den im gezeigten Beispiel verwendeten Methoden und den verfügbaren Syntaxvarianten finden Sie in der CAP-Dokumentation.

Um die Datenbanktabelle zu identifizieren, auf die zugegriffen werden soll, verwenden wir die CSN-Definition der Entität Bücher im gezeigten Beispiel. Dies ist der empfohlene Ansatz.

Fließende API mit getaggten Vorlagen

Alternativ zu den oben gezeigten klassischen Methodenaufrufen kann das fließende API auch mit getaggten Vorlagen verwendet werden. Die folgende Abbildung zeigt, wie die oben mit klassischen Methodenaufrufen konstruierten Queries mit getaggten Vorlagen angelegt werden können. Das Ergebnis ist in beiden Fällen gleich.

Notiz

Getaggte Vorlagen sind eine JavaScript-Funktion. Sie ermöglicht das Parsen und Transformieren von Template-Literalen, d.h. Literale, die mit Backtick-Zeichen (`) abgegrenzt sind, über eine Funktion. Eine getaggte Vorlage sieht wie ein Funktionsaufruf aus, bei dem der Funktionsname direkt vor einem Template-Literal ohne Klammern steht, z.B. .where`ID=${book}`.

Abfragen ausführen

Im vorherigen Abschnitt wurde erläutert, wie Query-Objekte angelegt werden. Die konstruierten Queries werden jedoch nicht automatisch ausgeführt. Sie müssen noch explizit zur Ausführung an die Datenbank gesendet werden. Wir werden nun untersuchen, wie dies erreicht wird.

Notiz

Obwohl die fließende API von cds.ql der SQL-Syntax ähnelt, werden die konstruierten Abfrageobjekte nicht in SQL gesperrt. Das bedeutet, dass die erstellten Abfragen zur Ausführung an jede Art von Dienst gesendet werden können, d.h. nicht nur an Datenbanken, sondern auch an andere lokale oder Remote-Services. Wenn beispielsweise eine Abfrage an einen OData-Service gesendet wird, wird sie in einen OData-Request übersetzt, der über HTTP gesendet wird.

Im Folgenden wird untersucht, wie Abfragen auf der Datenbank ausgeführt werden können. Dabei spielt es keine Rolle, ob die Query-Objekte über klassische Methodenaufrufe oder über getaggte Templates angelegt wurden. In den folgenden Beispielen verwenden wir klassische Methodenaufrufe für den Query-Aufbau.

Abfragen auf der Datenbank ausführen

Queries werden auf der Datenbank ausgeführt, indem sie an die Methode cds.db.run() übergeben werden (siehe folgende Abbildung). Dies gilt nicht nur für SELECT-Abfragen, wie im Beispiel gezeigt, sondern auch für das Schreiben von Datenbankabfragen wie einem UPDATE.

Im Beispiel wird der Operator await verwendet, um auf das Ergebnis der Abfrage SELECT.one zu warten. Dieses Ergebnis wird der Konstante b zugeordnet. Zur Laufzeit ist die Konstante also ein Objekt mit einer Eigenschaft namens stock. Der Wert dieser Eigenschaft ist der in der Datenbank für das Buch ausgewählte Bestand, der mit der Methode where() angegeben wurde. Wenn eine Dokumentenmappe mit der angegebenen ID nicht in der Datenbanktabelle gefunden werden kann, erhält die Konstante b den Wert undefined.

Notiz

Der Operator await kann nur innerhalb einer asynchronen Funktion oder auf der obersten Ebene eines Moduls verwendet werden. Daher haben wir die Methode redueStock() als asyncdeklariert.

Warten auf Abfragen

Alternativ zum obigen Ansatz können Sie auch einfach eine konstruierte Query await . Dadurch wird die Abfrage standardmäßig an die Methode cds.db.run() übergeben. Das bedeutet, dass das folgende und das vorherige Beispiel in Bezug auf die SELECT-Abfrage äquivalent sind:

Das Beispiel zeigt auch, wie die Aktualisierung auf der Datenbank ausgeführt wird.

Nach dem Update wird ein Objekt entsprechend der Antwortart der submitOrder Aktion an den Aufrufer zurückgegeben. Dieses Objekt hat einen Grundstücksbestand, dessen Wert der aktualisierte Bestand für das bestellte Buch ist.

Im Übungsteil dieser Lektion finden Sie die vollständige Implementierung für die Methode redueStock(). In dieser Implementierung wird eine Fehlermeldung ausgegeben, wenn die übergebene Buch-ID nicht in der Datenbank vorhanden ist (d.h. wenn die Konstante b den Wert undefinedhat). Eine Fehlermeldung wird auch ausgegeben, wenn der Bestand des Buchs kleiner als die bestellte Menge ist.

Demonstration & Übung: Queries in der Implementierung von CAP-Services verwenden

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 Benutzerdefinierte Aktion definieren und implementieren, wenn Sie sie erfolgreich abgeschlossen haben. Alternativ können Sie auch den Branch 13_custom_action 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 14_queries des GitHub-Repositorys.

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

Sehen Sie sich das Video an, um zu erfahren, wie Sie Abfragen in der Implementierung von CAP-Services verwenden.