Application RAP avec BAPI – Objectif Clean Core

Traitement en cours…
Terminé ! Vous figurez dans la liste.

Prérequis techniques : environnement S/4 Hana On premise ou S/4 Hana – Private Cloud edition.

Dans ce blog, l’objectif est de créer une application Fiori à l’aide du framework RAP, sur la base d’une BAPI existante, tout en respectant les directives SAP pour atteindre l’objectif « Clean Core ».

Cas d’utilisation : Pour cette présentation, nous allons chercher à savoir si les livraisons ont des unités de manutention existantes. Si c’est le cas, nous devons pouvoir supprimer ces unités de manutention.

En ABAP Standard, nous pouvons utiliser la BAPI : BAPI_HU_DELETE_FROM_DEL.

Nous allons maintenant voir comment intégrer cela dans un objet RAP, en suivant les recommandations de SAP pour le Clean Core.

Je reviendrai également sur l’utilisation du cadre RAP avec l’utilisation d’ABAP Standard, sans objectif de clean core ou de cloud compliance, pour vous montrer quelques différences.

ABAP RAP, dans le contexte d’ABAP CLOUD

Jetons un bref coup d’œil au cadre ABAP RAP et à sa structure pour fournir les principales bases de ce blog, le tout dans le contexte du développement ABAP Cloud.

Je vous recommande toutefois de lire le livre SAPPRESS « ABAP RESTful Application Programming Model – A comprehensive guide » (1), qui explique parfaitement tous les détails de ce framework.

Avant de plonger dans la structure du framework, revenons sur la notion de LUW dans le cloud, car elle aura un impact majeur sur notre développement.

Comme évoqué en détail dans ce Blog SAP (2), s’il était auparavant recommandé d’utiliser IN UPDATE TASK lorsqu’on souhaitait écrire dans la base de données SAP en utilisant le standard ABAP, ce n’est plus le cas avec ABAP ( IN UPDATE TASK permettait entre autres d’éviter d’écrire dans les bases de données lorsqu’il y avait des commits implicites et d’augmenter les performances, mais je vous invite à lire l’article cité ci-dessus) . Ce n’est plus le cas avec ABAP cloud, puisque les performances de la base de données HANA permettent de s’en passer. Cependant, cela implique que les écritures dans la base de données ne se fassent qu’à la fin du SAP LUW (lors de la séquence de sauvegarde, voir plus loin dans l’explication du framework RAP), car en cas de commit implicite, des modifications de la base de données seraient effectuées et nous ne respecterions plus les règles ACID (encore une fois, voir l’article cité plus haut).

C’est là qu’intervient la structure du cadre RAP :

  • Phase d’interaction
  • Phase de sauvegarde

Pendant la phase d’interaction, les données sont placées dans une mémoire tampon, où elles peuvent être enrichies et vérifiées.

Lors de la séquence de sauvegarde, les données de la mémoire tampon ne peuvent plus être modifiées et sont sauvegardées dans la base de données (c’est la fin du SAP LUW).

Telles sont les règles suivies par le cadre RAP dans le cas du développement ABAP cloud :

Les violations suivantes entraîneront toujours une erreur d’exécution dans un contexte RAP (même si ABAP CLOUD est utilisé ou STANDARD ABAP) :

  • Utilisation explicite des instructions COMMIT WORK ou ROLLBACK WORK, car la gestion des transactions et le commit de la base de données sont exclusivement gérés par RAP.
  • Appel de la tâche de mise à jour en arrière-plan (bgPF) dans la phase d’interaction ou la phase de sauvegarde anticipée.

Certaines autres opérations n’entraînent des erreurs d’exécution que si la définition du comportement RAP est mise en œuvre dans ABAP for Cloud Development et que le mode strict est appliqué :

  • L’invocation des contrôles d’autorisation dans la phase de sauvegarde anticipée ou tardive.
  • Modification des opérations de base de données dans la phase d’interaction ou la phase de sauvegarde anticipée.
  • Lancement de business events au cours de la phase d’interaction ou de la phase de sauvegarde anticipée.
  • les validations (implicites ou explicites) de la base de données pour la connexion principale à la base de données dans la phase de sauvegarde tardive.

NOTE POUR L’UTILISATION DE ABAP STANDARD : En regardant ces règles, si vous n’êtes pas dans l’optique du clean core, vous pouvez développer en STANDARD ABAP, et effectuer un commit implicite pendant la phase tardive par exemple, ou utiliser l’instruction IN UPDATE TASK, mais dans mon cas je préfère suivre les règles plus strictes de ABAP RAP FRAMEWORK même si je développe en STANDARD ABAP.

Les 2 scénarios possibles en utilisant le framework RAP

Il existe deux types de scénarios pour la mise en œuvre du processus : managed ou unmanaged.

Dans le scénario managed, le système SAP génère automatiquement les méthodes et l’objet de gestion. Dans le scénario unmanaged, tout doit être développé à la main.

  • Le cas d’utilisation du scénario managed est le suivant : Création d’une nouvelle application à partir de zéro (approche greenfield) – typiquement, les données seront stockées de manière persistante dans de nouvelles tables Z. Il faut ensuite améliorer la norme générée par le biais de validations, de déterminations et d’actions.

Ce n’est pas le cas ici, car nous voulons stocker/modifier nos données dans des tables standard à l’aide d’objets hérités (une BAPI).

  • Le cas d’utilisation du scénario unmanaged est le suivant : Refonte d’une application existante (approche brownfield). L’application existante fournit une API qui peut et doit être utilisée pour l’implémentation de la phase d’interaction et de la séquence de sauvegarde en raison de ses caractéristiques (structure, découplage de la logique métier et des aspects techniques).

Dans ce cas, nous devrions tout développer, de la phase d’interaction à la séquence de sauvegarde. Nous ne sommes pas intéressés par cette implémentation, car nous ne disposons pas d’une API pour gérer la mise en mémoire tampon pour nos besoins, et nous aimerions utiliser le standard SAP pour la partie interaction.

  • Dans ce cas, il existe un troisième scénario : Scénario managed with unmanaged save : Utilisation de parties d’une application existante (par exemple, une BAPI) dans la séquence de sauvegarde UNIQUEMENT.

NOTE : il existe également un scénario managed with additional save : l’ajout d’une logique de mise à jour supplémentaire à la séquence de sauvegarde (par exemple, dans le journal de l’application) qui n’affecte pas l’objet commercial actuel. Mais nous ne l’utiliserons pas.

Comment utiliser la BAPI dans le contexte du ABAP Cloud ?

SAP fournit les objets qu’il souhaite exposer pour le développement dans le cloud en les whitlistant. Si ces objets ne sont pas exposés, SAP peut également proposer leurs successeurs (par exemple, dans le cas des BAPI, si elles ne sont pas exposées, un comportement RAP peut être proposé à la place).

Ceci peut être vérifié soit directement dans l’ADT (3), soit sur GitHub (4).

Dans notre cas, la BAPI souhaitée n’est ni exposée ni remplacée.

Conformément aux directives SAP (5) (6), nous allons créer un wrapper autour de cette BAPI, et whitlister ce wrapper. Lorsque SAP proposera un successeur à cette BAPI, il sera possible de supprimer le wrapper et d’utiliser l’objet successeur à la place.

Pour créer un wrapper autour d’une BAPI, suivez ce tutoriel (7).

Ici, nous avons créé la classe ZCL_WRAP_DEL_HU_FAC (et ZCL_WRAP_DEL_HU en utilisant ZIF_WRAP_BAP_HU_DEL), qui sera utilisée pour supprimer les unités de manutention.

Nous avons publié le wrapper et son interface en tant qu’API whitlisté.

Il peut donc être utilisé dès à présent dans ABAP pour le développement du cloud.

Définition et implémentation de l’objet RAP

Maintenant que nous avons whitlisté notre objet à utiliser dans notre objet rap, nous allons commencer à créer notre objet métier.

Nous avons créé un package qui utilise « ABAP for cloud development ».

1) Création des CDS

  • Nous créons une vue racine CDS qui stocke le numéro de livraison et indique si au moins une unité de manutention est liée à cette livraison. (Nous avons créé la vue CDS privée ZP_HU pour trouver la première ligne de chaque unité de manutention pour une livraison, puis nous joignons cette vue à l’entité racine CDS pour vérifier si au moins une unité de manutention existe).

Notez ici que nous utilisons des CDS publiées par SAP, qui remplace les tables standards de type vekp).

  • Nous créons la vue de projection associée, qui sera utilisée pour créer le service web. La vue de projection réduit l’objet métier à l’usage simple qui en sera fait dans l’application Fiori, alors que le cds ZI_DELIV_HU pourrait être réutilisé par d’autres applications.

(Ici, il n’y a pas de différences entre les 2 cds, mais il aurait pu y en avoir).

NOTE : nous aurions pu créer des cd pour une valeur ajoutée supplémentaire.

2) Nous créons la définition du comportement

  • Nous spécifions d’abord le mode strict pour toutes les vérifications syntaxiques nécessaires, et la méthode d’autorisation utilisée (vérification de l’autorisation).
  • Ensuite, nous spécifions les opérations qui peuvent être utilisées : dans ce cas, nous souhaitons seulement mettre à jour notre objet de gestion pour supprimer le drapeau d’affectation HU, donc nous spécifions « update ». (nous reviendrons sur l’interne).
  • Ensuite, nous enrichissons la norme générée automatiquement en ajoutant une validation dans laquelle nous utilisons la BAPI en mode test pour vérifier que tout se passe bien.
  • Nous enrichissons également la norme d’une action « unassign » qui supprimera le drapeau HUs attribué au CDS. Cette action utilisera l’opération UPDATE en interne pour modifier l’entité, et l’utilisateur ne devrait pas être en mesure de modifier lui-même l’indicateur : il doit utiliser le bouton « unassign » (l’explication de la raison pour laquelle interne est spécifiée dans la définition : UPDATE ne pourrait être utilisé qu’en interne, dans l’implémentation de l’objet d’entreprise RAP).
  • enfin, nous spécifions Unmanaged save pour utiliser la BAPI dans la séquence de sauvegarde et sauvegarder les données dans la base de données.

3) Créer l’implémentation

  • Création de l’action

L’EML est utilisé pour mettre à jour l’objet en supprimant l’indicateur de validité. Si l’utilisateur tente de supprimer le témoin d’un objet déjà dépourvu de témoin (sans UM), un message d’erreur s’affiche.

  • Création de la validation (au moment de la sauvegarde)

Exécutez l’interface BAPI en mode test pour vérifier que tout va bien. Si ce n’est pas le cas, un message d’erreur s’affiche.

  • Création d’une séquence de sauvegarde :

La BAPI est appelée dans la dernière phase, à la fin du SAP LUW. Une fois la séquence de sauvegarde terminée, le cadre RAP se charge de la valider.

4) Nous créons une définition de consommation de comportement pour réduire les opérations CRUD à l’application si nécessaire (ici je crée la consommation mais elle est identique à ZI_DELIV_HU ).

5) Nous créons les metadata, en ajoutant le bouton supplémentaire pour les unités de manutention non attribuées.

6) Créer le service de définition

7) créer le service binding

8) Il ne reste plus qu’à créer l’application Fiori avec VS Code ou SAP BAS (8) en utilisant les éléments SAP Fiori.

Conclusion

Voici comment je crée des applications Fiori à l’aide du framework Rap, en tenant compte des directives SAP pour le cloud.

(1) Learn the ABAP RESTful Application Programming Model | – by SAP PRESS (sap-press.com)

(2) https://blogs.sap.com/2022/12/05/the-sap-luw-in-abap-cloud/

(3) https://blogs.sap.com/2023/08/15/smooth-transition-to-abap-for-cloud-developmentcheat-sheet/comment-…

(4) https://raw.githubusercontent.com/SAP/abap-atc-cr-cv-s4hc/main/src/objectReleaseInfo_PCE2022.json

(5) https://www.sap.com/documents/2023/05/b0bd8ae6-747e-0010-bca6-c68f7e60039b.html

(6) https://blogs.sap.com/2022/10/25/how-to-use-embedded-steampunk-in-sap-s-4hana-cloud-private-edition-…

(7) https://developers.sap.com/tutorials/abap-s4hanacloud-purchasereq-create-wrapper.html

(8) https://blogs.sap.com/2022/10/31/fiori-development-with-vscode-and-nodejs/

Laisser un commentaire