Introduction
Application des techniques et concepts de base
Utilisation des classes locales
Lecture des données de la base de données
Utilisation d'objets de données structurés
Utilisation de tables internes complexes
Implémentation de mises à jour de base de données à l'aide d'objets de gestion
Description du modèle de programmation d'applications ABAP RESTful

Utilisation du langage de manipulation d'entité

Objective

After completing this lesson, you will be able to implémentez une instruction EML.

Entity Manipulation Language (EML)

EML se compose d'instructions que vous pouvez utiliser pour manipuler les données d'un objet de gestion. Vous utilisez l'instruction READ ENTITIES pour lire les données ; pour toutes les autres opérations, vous utilisez l'instruction MODIFY ENTITIES avec l'option correspondante UPDATE, CREATE ou DELETE.

Remarque

Vous pouvez utiliser les opérations CREATE, UPDATE et DELETE uniquement si la définition de comportement de l'interface d'objet de gestion contient la directive use create, use update ou use delete correspondante. Tenter d'utiliser une opération interdite entraîne une erreur de syntaxe.

Pour lire les données d'un objet de gestion, vous utilisez l'instruction READ ENTITIES. L'instruction comporte deux paramètres importants : une table interne contenant les clés des données que vous voulez lire et une autre contenant les résultats de la requête.

Ces tables internes ont des types de données spéciaux appelés types de définition de comportement dérivés. Le système les crée automatiquement lorsqu'un développeur crée une définition de comportement qui contient une partie ou la totalité des zones de l'objet de gestion ainsi que d'autres zones qui pilotent la manière dont le système traite une demande particulière. Vous déclarez les tables internes à l'aide de la nouvelle option TYPE TABLE FOR <operation> dans l'instruction DATA.

Le type TABLE FOR READ IMPORT contient la ou les zones clés de l'objet de gestion. La structure %control est une structure générée qui indique les zones de l'objet de gestion réellement utilisées dans l'opération en cours. Dans notre exemple, le système remplit automatiquement la structure et vous n'avez pas à vous en soucier.

Le typeTABLE FOR READ RESULT contient toutes les zones de l'objet de gestion. Cette table contient l'ensemble de résultats après l'exécution de l'instruction de lecture.

La table d'importation de lecture contient une colonne pour chaque zone clé de l'objet de gestion, dans ce cas, l'ID de l'agence. Pour lire une agence particulière, vous ajoutez une ligne à la table interne contenant sa clé. Outre la ou les zones clés, la table contient les colonnes %is_draft et %control. Avec %is_draft, vous pouvez indiquer si vous voulez lire les données préliminaires ou les données actives. La structure de contrôle %control est utilisée pour indiquer les zones à lire.

Remarque

Dans notre exemple, nous lisons uniquement les données actives et la structure %control est renseignée par la structure, en fonction de la liste de zones après l'ajout FIELDS.

Lorsque vous traitez un objet métier à l'aide de l'instruction READ ENTITIES OF ou MODIFY ENTITIES OF, vous devez d'abord indiquer le nom de la définition de comportement. Il est suivi du mot-clé ENTITY et du nom de l'entité avec laquelle vous voulez travailler. Si l'entité a un nom d'alias, vous devez l'utiliser ici.

Remarque

Vous ne pouvez pas utiliser le nom d'alias après l'ajout de FO. En effet, d'un point de vue technique, vous indiquez le nom de la définition de comportement à ce stade, et non le nom de l'entité.

L'instruction READ ENTITIES lit les données d'objet de gestion en fonction des clés que vous transmettez dans l'option WITH. Il renvoie le résultat dans la table interne de l'option RESULT. Dans l'instruction, vous pouvez également indiquer les zones de l'objet de gestion dont vous avez besoin. Dans cet exemple, nous avons utilisé l'option ALL FIELDS pour renvoyer toutes les zones. Cependant, si vous n'avez besoin que d'un sous-ensemble des zones, vous pouvez utiliser la variante FIELDS (zone1zone2 …) pour limiter la quantité de données lues.

Remarque

Contrairement à une instruction SELECT, la liste de zones n'est pas séparée par des virgules.

La table de résultats contient toutes les zones de l'objet de gestion, ainsi que la zone de pilotage %is_draft. Si votre instruction READ ENTITIES contient la variante ALL FIELDS, le système fournit les valeurs de toutes les zones. Si vous utilisez la variante FIELDS ( f1fn ), seules les zones que vous avez demandées seront renseignées.

Remarque

Les zones clés sont toujours renseignées, même si elles ne sont pas indiquées dans la variante FIELDS ( f1fn ).

Si vous voulez mettre à jour des données, vous déclarez une table interne avec TYPE TABLE FOR UPDATE. Il contient toutes les zones de l'objet de gestion ainsi que la structure de contrôle %control. Dans notre variante de l'instruction MODIFY ENTITIES, le système renseigne automatiquement la structure %control.

L'instruction MODIFY ENTITIES met à jour les données dans la mémoire tampon transactionnelle. Dans l'option FIELDS, vous indiquez les zones à modifier. Dans l'option WITH, vous transférez la table interne contenant les données que vous voulez mettre à jour.

Lorsque vous utilisez EML en dehors de l'objet de gestion, vous devez utiliser l'instruction COMMIT ENTITIES pour déclencher la séquence de sauvegarde et rendre les données persistantes dans la base de données.

Remarque

Plus tard dans ce cours, nous utiliserons EML dans l'implémentation de comportement de l'objet de gestion. Dans l'implémentation du comportement, il n'est ni nécessaire ni autorisé de déclencher le commit avec ENTITÉS DE COMMIT.

Implémentation d'une instruction EML

Modifier les données à l'aide d'EML

Dans cet exercice, vous utilisez EML pour effectuer la mise à jour d'opération standard pour l'entité racine de l'objet de gestion /DMO/R_AGENCYTP. Pour éviter des incohérences ultérieures, vous n'accédez pas directement à l'objet de gestion, mais via son interface stable validée /DMO/I_AGENCYTP.

Modèle :

  • Aucune

Solution :

  • /LRN/CL_S4D400_BOS_EML (classe globale)

Tâche 1: Analyse des données actuelles

Utilisez l'outil Aperçu des données pour vérifier le nom actuel de l'agence de voyages avec l'ID "0700##", où ## correspond à votre numéro de groupe.

Étapes

  1. Ouvrez la définition de l'entité de vue CDS /DMO/I_AgencyTP.

    1. Si vous avez encore ouvert la définition de données /DMO/I_AGENCYTP de l'exercice précédent, passez à l'onglet correspondant. Sinon, appuyez sur Ctrl + Maj + A pour ouvrir l'objet de développement ABAP.

  2. Ouvrez l'outil Aperçu des données.

    1. Cliquez avec le bouton droit de la souris n'importe où dans le code source pour ouvrir le menu contextuel.

    2. Dans le menu contextuel, sélectionnez Ouvrir avecaperçu des données.

  3. Vérifiez le nom actuel de l'agence de voyages avec l'ID "0700##", où ## correspond à votre numéro de groupe.

    1. Faites défiler vers le bas jusqu'à l'entrée avec la valeur "0700##" dans la colonne ID agence et notez la valeur dans la colonne Nom.

Tâche 2: Créer une classe globale

Dans votre propre package, créez une nouvelle classe ABAP.

Étapes

  1. Créez une nouvelle classe ABAP appelée ZCL_##_EML, où ## représente votre numéro de groupe. Assurez-vous que la classe implémente l'interface IF_OO_ADT_CLASSRUN.

    1. Sélectionnez FichierNouvelleclasse ABAP.

    2. Saisissez le nom de votre package dans la zone Package. Dans la zone Nom, saisissez le nom ZCL_##_EML, où ## est votre numéro de groupe. Saisissez une description.

    3. Dans le cadre Interfaces, sélectionnez Ajouter.

    4. Saisissez IF_OO_ADT_CLASSRUN. Lorsque l'interface apparaît dans la liste des occurrences, double-cliquez dessus pour l'ajouter à la définition de classe.

    5. Cliquez sur Next.

    6. Sélectionnez votre ordre de transport et cliquez sur Terminer.

Tâche 3: Mettre à jour les données

Implémentez une instruction EML pour modifier le nom de l'agence de voyages avec l'ID "0700##" (## correspond à votre numéro de groupe).

Étapes

  1. Dans la méthode IF_OO_ADT_CLASSRUN~MAIN, déclarez une table interne avec le type dérivé correct pour une mise à jour EML de l'entité /DMO/I_AgencyTP (nom suggéré : agencies_upd).

    1. Ajoutez le code suivant :

      Code Snippet
      123
      DATA agencies_upd TYPE TABLE FOR UPDATE /DMO/I_AgencyTP.
  2. Renseignez la table interne avec une seule ligne contenant "0700##" comme valeur pour la colonne AGENCYID (où ## représente votre numéro de groupe) et toute nouvelle valeur pour la colonne NOM.

    1. Après la déclaration de données, ajoutez un code similaire au code suivant :

      Code Snippet
      123
      agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ).
  3. Implémentez une instruction EML MODIFY ENTITIES pour l'interface d'objet de gestion /DMO/I_AgencyTP. Mettez à jour les données de l'entité racine, en veillant à ce que seule la zone NOM soit modifiée.

    Astuce

    N'oubliez pas que le comportement de l'interface définit le nom d'alias /DMO/Agency pour l'entité racine /DMO/I_AgencyTP.
    1. À la fin de la méthode, ajoutez le code suivant :

      Code Snippet
      123456
      MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd.
  4. Pour obtenir un résultat visible de l'application, écrivez un littéral de texte dans la console à l'aide de la méthode out->write.

    1. Après l'instruction MODIFY ENTITIES, ajoutez le code suivant :

      Code Snippet
      123
      out->write( `Method execution finished!` ).
  5. Activez et testez la classe.

    1. Appuyez sur Ctrl + F3 pour activer la classe.

    2. Appuyez sur F9 pour exécuter la classe.

  6. Vérifiez si le nouveau nom a été écrit dans la base de données.

    1. Retournez à l'aperçu des données pour l'entité de vue CDS /DMO/I_AgencyTP.

    2. Dans la barre d'outils de l'onglet Aperçu des données, sélectionnez Actualiser.

  7. Ajoutez l'instruction COMMIT ENTITIES à votre code pour valider les modifications.

    1. Revenez à la méthode IF_OO_ADT_CLASSRUN~MAIN dans votre classe globale ZCL_##_EML.

    2. Adaptez le code comme suit :

      Code Snippet
      123456789101112131415161718
      METHOD if_oo_adt_classrun~main. DATA agencies_upd TYPE TABLE FOR UPDATE /dmo/i_agencytp. agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ). MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd. COMMIT ENTITIES. out->write( `Method execution finished!` ). ENDMETHOD.
  8. Activez et testez à nouveau la classe. Confirmez que les modifications sont maintenant dans la base de données.

    1. Appuyez sur Ctrl + F3 pour activer la classe.

    2. Appuyez sur F9 pour exécuter la classe.

    3. Retournez à l'aperçu des données pour l'entité de vue CDS /DMO/I_AgencyTP.

    4. Dans la barre d'outils de l'onglet Aperçu des données, sélectionnez Actualiser.