Les DDIC Tables sont mortes, vive les Table Entities

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

Alors qu’avant nous devions définir la création de nos tables via ADT (ou pire, via la SE11), puis créer leurs CDS entities associées par la suite, il est désormais possible (et recommandé) de créer une table de base de données directement en tant qu’objet CDS.

Et qui dit CDS, dit toutes les fonctionnalités associées, telles que les associations, les annotations et le typage de ses champs avec les CDS simple types et les CDS enumerated types.

Ces objets sont les Tables Entities et font partie des nombreuses nouveautés enthousiasmantes delivrées autour de l’ABAP Cloud !

Pour démontrer leurs fonctionnalités, nous allons partir d’un exemple

Description de l’exemple

Dans cette exemple nous allons définir les Table Entities nécessaires pour la gestion des ventes de pâtisserie d’une boulangerie.

Il y aura 3 Table Entities :

  • ZI_BAKERY_ORDERS : Représente la table entity root (le header) des commandes effectuées
  • ZI_BAKERY_ORDERS_ITEMS : Représente la table des items de chaque commande effectuée
  • ZI_PASTRY : Représente la table des pâtisseries existantes dans la boulangerie

Dans le but de rester dans un exemple simple nous ne créons que ces 3 tables. C’est suffisant pour démontrer les capacités des Table Entities

Création des Tables Entities

  • Clic droit -> New -> Other ABAP Repository Object
  • Core Data Services -> Data Definition
  • Table Entity (Creation)

Voici le code et les explications pour les 3 Table Entities :

1. ZI_BAKERY_ORDERS

@ClientHandling.type: #CLIENT_DEPENDENT
@AbapCatalog.deliveryClass: #APPLICATION_DATA
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Bakery Orders'
define root table entity ZI_BAKERY_ORDERS
{
  key uuid       : uuid;
  deliveryAddress : abap.char( 100 );
  orderDate  : abap.datn;
  //every order is linked to (at least) one or many items 
  _bakeryOrdersItems : composition of exact one to many ZI_BAKERY_ORDERS_ITEMS;
}

Cette Table Entity est l’entête de chaque commande effectuée et contient l’adresse de livraison de la commande.

Chaque entête est reliée a au moins 1 item via la relation de composition effectuée avec la CDS ZI_BAKERY_ORDERS_ITEMS

On pourra également noter l’utilisation de la dernière syntaxe recommandée pour la cardinalité des associations et compositions. En effet, cette nouvelle syntaxe permet d’améliorer la documentation de la CDS et les performances de l’ABAP Engine en précisant la cardinalité source et la cardinalite cible. Pour montrer ce que cela veut dire j’ai commente chaque association et composition pour explique la cardinalité de ces dernières.

NOTE : Pour ce qui est de la syntaxe de la Table entity en elle-même, c’est un savant mélange entre la création d’une table DDIC, et la création d’une CDS.

  • On y définit le type de la table
  • On peut y gérer les autorisations
  • Et préciser si la table est dépendante du mandant ou non

2. ZI_BAKERY_ORDERS_ITEMS

@ClientHandling.type: #CLIENT_DEPENDENT
@AbapCatalog.deliveryClass: #APPLICATION_DATA
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Bakery Orders Items'
define table entity ZI_BAKERY_ORDERS_ITEMS
{
  key uuid       : uuid;
  key item       : abap.numc( 5 );
      @Semantics.quantity.unitOfMeasure: 'unit'
      quantity   : abap.quan( 3, 0 );
      unit       : abap.unit( 3 );
      @Semantics.amount.currencyCode: 'currency'
      amount     : abap.curr( 6, 2 );
      currency   : abap.cuky( 5 );
      pastryid   : uuid;
      //every item is linked to exactly one parent order
      _bakeryOrders: association to parent ZI_BAKERY_ORDERS on $projection.uuid = _bakeryOrders.uuid; 
      //every item is linked to exactly one pastry. And many items can be linked to the same pastry
      _pastry : association of many to exact one ZI_PASTRY on $projection.pastryid = _pastry.uuid; 
}

Cette Table Entity correspond a tous les items compris dans la commande

Elle est reliée a son header via une association to parent (pas de cardinalité nécessaire pour ce type d’association car toujours MANY TO EXCAT ONE).

Également, la Table Entity contient l’id de la pâtisserie de l’item. Cet id permet de créer une association avec la table des pâtisseries de la boulangerie.

Cette Table Entity montre également comment gérer les annotations (de la même manière que dans les CDS) concernant les unités de mesures et les devises relies aux quantités et montants associés.

3. ZI_PASTRY

@ClientHandling.type: #CLIENT_DEPENDENT
@AbapCatalog.deliveryClass: #APPLICATION_DATA
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Pastry'
define table entity ZI_PASTRY
{
  key uuid        : uuid;
      description : abap.char( 50 );
      @Semantics.amount.currencyCode: 'currency'
      unit_amount : abap.curr( 6, 2 );
      currency    : abap.cuky( 5 );
      //A pastry can be linked to many orders (so many orders items) or may not be in any order
      _ordersItems : association of one to many ZI_BAKERY_ORDERS_ITEMS on $projection.uuid = _ordersItems.pastryid; 
}

Cette Table Entity contient toutes les pâtisseries de la boulangerie et est reliée a la Table Entity des Items de commandes via l’association _ordersItems.

Conclusion

Les Tables Entities sont désormais l’avenir (et le présent) pour créer les tables de bases de données et doivent remplacer les DDIC Tables. Selon la documentation SAP, une migration des DDIC Tables vers les CDS table entities sera même proposée.