Création et exécution de requêtes

Objective

After completing this lesson, you will be able to créer et exécuter des requêtes de base de données

Création de requêtes

Dans le sujet précédent, nous avons créé l'action SubmitOrder pour le CatalogService. La mise en œuvre de cette action n'est pas encore terminée, car nous ne savons toujours pas comment accéder aux tables de base de données. Nous l'apprendrons ensuite.

Pour implémenter l'action submitOrder, nous avons besoin des deux accès à la base de données suivants :

  1. Nous voulons nous assurer que le stock actuel pour le livre commandé est supérieur ou égal à la quantité commandée. Pour ce faire, nous devons sélectionner le stock actuel dans la base de données.
  2. S'il y a suffisamment de livres en stock et que l'ordre est donc exécuté, il faut réduire le stock actuel. Cela signifie que nous devons mettre à jour le stock dans la base de données en conséquence.

API courante

Le module cds.ql fournit une API de type SQL pour construire de telles requêtes de base de données. Les requêtes requises pour notre scénario sont présentées dans la figure suivante.

L'API est mise à disposition via les objets globaux SELECT, INSERT, UPSERT, UPDATE et DELETE.

Remarque

Vous pouvez également obtenir ces objets à partir de cds.ql comme suit :
JavaScript
12
const cds = require('@sap/cds'); const { SELECT, INSERT, UPSERT, UPDATE, DELETE } = cds.ql;
En outre, des méthodes pratiques sont disponibles pour créer des objets de requête cds.ql. Vous trouverez des détails sur cette API de type CRUD avec des méthodes telles que read(), insert(), upsert(), update() et delete() dans la documentation CAP.

L'API disponible via les objets CLAS répertoriés est conçue comme une API fluide. Cela signifie que les méthodes disponibles sur ces objets renvoient des objets du même type. Les propriétés disponibles - telles que la propriété .one de l'objet SELECT utilisé dans l'exemple présenté - ont également des objets du même type que leur valeur. Cela permet le chaînage, ce qui rend le codage intuitif et lisible.

Remarque

Vous trouverez des détails sur les méthodes utilisées dans l'exemple présenté et les variantes de syntaxe disponibles dans la documentation CAP.

Pour identifier la table de base de données à laquelle accéder, nous utilisons la définition CSN de l'entité Pages dans l'exemple présenté. Il s'agit de l'approche recommandée.

API courante avec modèles marqués

Comme alternative aux appels de méthode classiques indiqués ci-dessus, l'API courante peut également être utilisée avec des modèles balisés. La figure suivante montre comment les requêtes créées ci-dessus à l'aide d'appels de méthode classiques peuvent être créées à l'aide de modèles marqués. Le résultat est le même dans les deux cas.

Remarque

Les modèles marqués sont une fonctionnalité JavaScript. Il permet d'analyser et de transformer les littéraux de modèle - c'est-à-dire les littéraux délimités par des caractères rétroactifs (`) - à l'aide d'une fonction. Un modèle marqué ressemble à un appel de fonction dans lequel le nom de la fonction est placé directement avant un littéral de modèle sans parenthèses, par exemple .where`ID=${book}`.

Exécution de requêtes

Dans la section précédente, nous avons expliqué comment les objets de requête sont créés. Cependant, les requêtes créées ne sont pas exécutées automatiquement. Ils doivent encore être explicitement envoyés à la base de données pour exécution. Nous allons maintenant examiner comment cela est réalisé.

Remarque

Bien que l'API courante de cds.ql ressemble à la syntaxe SQL, les objets de requête construits ne sont pas verrouillés dans SQL. Cela signifie que les requêtes créées peuvent être envoyées à tout type de service pour exécution, c'est-à-dire non seulement aux bases de données, mais aussi à d'autres services locaux ou distants. Par exemple, si une requête est envoyée à un service OData, elle est traduite en une requête OData envoyée via HTTP.

Dans ce qui suit, nous allons examiner comment les requêtes peuvent être exécutées dans la base de données. Dans ce contexte, peu importe que les objets de requête aient été créés via des appels de méthode classiques ou via des modèles marqués. Dans les exemples suivants, nous allons utiliser des appels de méthode classiques pour la construction de requêtes.

Exécution de requêtes dans la base de données

Les requêtes sont exécutées dans la base de données en les transmettant à la méthode cds.db.run() (voir figure suivante). Cela s'applique non seulement aux requêtes SELECT, comme illustré dans l'exemple, mais également à l'écriture de requêtes de base de données telles qu'une mise à jour.

Dans l'exemple, l'opérateur await est utilisé pour attendre le résultat de la requête SELECT.one. Ce résultat est affecté à la constante b. Au moment de l'exécution, la constante est donc un objet avec une propriété appelée stock. La valeur de cette propriété est le stock sélectionné dans la base de données pour le livre qui a été spécifié à l'aide de la méthode where() . Si un dossier avec l'ID indiqué est introuvable dans la table de base de données, la constante b reçoit la valeur undefined.

Remarque

L'opérateur await ne peut être utilisé qu'à l'intérieur d'une fonction async ou au niveau supérieur d'un module. Nous avons donc déclaré la méthode reduceStock() comme async.

En attente de requêtes

Comme alternative à l'approche ci-dessus, vous pouvez également simplement await une requête créée. La requête est alors transmise par défaut à la méthode cds.db.run() . Cela signifie que l'exemple suivant et l'exemple précédent sont équivalents en ce qui concerne la requête SELECT :

L'exemple montre également comment la mise à jour est exécutée dans la base de données.

Suite à la mise à jour, un objet est retourné à l'appelant conformément au type de réponse de l'action submitOrder. Cet objet a un stock de propriété dont la valeur est le stock mis à jour pour le livre commandé.

Dans la partie d'exercice de ce sujet, vous trouverez l'implémentation complète de la méthode Réduction du stock(). Dans cette implémentation, un message d'erreur est émis si l'ID de dossier transféré n'existe pas dans la base de données (c'est-à-dire si la constante b a la valeur undefined). Un message d'erreur est également édité si le stock du livre est inférieur à la quantité commandée.

Démonstration et exercice : utiliser des requêtes dans la mise en œuvre des services CAP

Remarque

Dans l'exercice, suivez les instructions étape par étape de la démonstration suivante dans SAP Business Application Studio.

Comme point de départ de l'exercice, utilisez le résultat de l'exercice précédent Définition et implémentation d'une action personnalisée si vous avez réussi. Vous pouvez également utiliser la branche 13_custom_action à partir du référentiel GitHub suivant comme point de départ :

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

L'implémentation complète de la simulation se trouve dans la branche 14_queries du référentiel GitHub.

Vous trouverez ici des informations détaillées sur le contenu du référentiel et son utilisation.

Regardez la vidéo pour voir comment utiliser des requêtes dans l'implémentation des services CAP.