CDS Simple et Enumerated Types : Les Successeurs des DDIC Data Elements et Domains

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

Dans notre dernier article, nous avions vu qu’il était possible d’utiliser, au sein des CDS Table Entities, des CDS Simple Types et des CDS Enumerated Types. Ces types peuvent également avoir d’autres usage que nous allons étudier.

Tout le code est disponible sur notre Gitlab.

1. CDS Simple Types

  • Les CDS SImple Types sont utilisés pour typer les éléments ou les paramètres d’une CDS.

Pour démontrer ce cas la, nous allons repartir de l’exemple de la boulangerie créé dans notre dernier article. Et principalement de cette CDS :

@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;
}

Ici, nous voyons que nous utilisons le type abap.char( 100 ) pour définir l’adresse, mais ce n’est pas très parlant. Également, la description du champs ce basant sur le data Element, il faudra ajouter une annotations manuelle dans la CDS du type @EndUserText.label, pour définir l’affichage sur l’UI (en Fiori par exemple) car aucun label n’est défini sur le type abap.char.

Nous allons donc remplacer abap.char par un CDS Simple Type que nous allons créer.

Pour cela, rechercher dans Core Data Services : « Types »

Puis lui donner un nom et une description. Ensuite, nous pouvons attribuer un elementary data type (ici toujours abap.char) a notre type ZCUSTOMER_ADDRESS.

Nous définissons également les labels pour une meilleure compréhension pour l’utilisateur lors de l’affichage.

@EndUserText.label: 'Customer Address' // Human-readable text to be displayed on UIs 
@EndUserText.quickInfo: 'Delivery Address of the customer' // Provides additional information compared to the label text.
@EndUserText.heading: 'Customer Address' //Human-readable text that is displayed as column headers
define type ZCUSTOMER_ADDRESS: abap.char( 100 )

Puis nous pouvons utiliser ce Type dans dans notre CDS :

@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 : ZCUSTOMER_ADDRESS;
  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;
}
  • Ensuite, il est important de noter qu’un CDS Simple Type peut heriter d’un autre CDS Simple Type.

Dans ce cas la, le nouveau CDS Simple Type conserve toutes les caractéristiques techniques, ainsi que les annotations, a la différence que les annotations peuvent être remplacées si nous le souhaitons.
Cela permet par exemple de définir un CDS SImple Type « de base », qui définirai techniquement le Type, et qui serait ensuite utiliser par d’autres CDS Simple Type partageant ces caractéristiques techniques. Ainsi, si un changement est nécessaire ( Par exemple, passer de abap.char( 100 ), a abap.char( 150 ) ), il suffit de le faire a un seul endroit.

Par exemple ici, nous pouvons hériter du CDS Simple Type ZCUSTOMER_ADDRESS et l’utiliser pour définir d’autres CDS Simple Types qui partagerai la même base technique.

ZPASTRY_CUSTOMER_ADDRESS pour l’adresse des consommateurs de la boulangerie

@EndUserText.label: 'Pastry Customer Address' // Human-readable text to be displayed on UIs 
@EndUserText.quickInfo: 'Delivery Address of the pastry customer' // Provides additional information compared to the label text.
@EndUserText.heading: 'Pastry Customer Address' //Human-readable text that is displayed as column headers
define type ZPASTRY_CUSTOMER_ADDRESS: ZCUSTOMER_ADDRESS //abap.char( 100 )

ZSTORE_CUSTOMER pour l’adresse des consommateurs d’un magasin

@EndUserText.label: 'Store Customer Address'
@EndUserText.quickInfo: 'Delivery Address of the store customer'
@EndUserText.heading: 'Store Customer Address'
define type ZSTORE_CUSTOMER: ZCUSTOMER_ADDRESS

Et comme ça, nous pouvons remplacer les annotations pour que le label soit plus précis, mais nous conservons les caractéristiques technique liées au type de ZCUSTOMER_ADDRESS.

Ce qui donne finalement :

@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 : ZPASTRY_CUSTOMER_ADDRESS;
  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;
}
  • Également, en ABAP, les CDS Simple Types peuvent être utilisés après l’expression « TYPE’ pour définir le type d’une variable.
DATA cds_simple_type TYPE ZPASTRY_CUSTOMER_ADDRESS.
cds_simple_type = '370 rue Léon Gambetta'.

2. CDS Enumerated Types

Les CDS Enumerated Types permettent de limiter et contrôler les valeurs transmises aux CDS Elements ou CDS Paramters.

  • Les CDS Enumerated Types sont utilisés pour typer les éléments ou les paramètres d’une CDS.

Créons ici un CDS Enumerated Types, permettant de lister les différents type de préparation autorisées par la boulangerie :

@EndUserText.label: 'Preparation type'
@EndUserText.quickInfo: 'Preparation type of the product'
@EndUserText.heading: 'Preparation type'
define type ZPREPARATION_TYPE: abap.int1 enum 
{  
  @EndUserText.label: 'Pastry' 
  PASTRY =    initial; 
  @EndUserText.label: 'Bakery' 
  BAKERY =    1; 
  @EndUserText.label: 'Sandwich' 
  SANDWICH =  2; 
} 

Puis nous l’ajoutons a la CDS ZI_PASTRY, qui définit les produits disponibles dans la boulangerie.

@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 );
      type       : ZPREPARATION_TYPE;
      @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; 
}
  • En ABAP, un CDS Enumerated Type peut être directement utilisé pour le typage des variables.
DATA cds_enum_type   TYPE ZPREPARATION_TYPE.
cds_enum_type = ZPREPARATION_TYPE-bakery.

Conclusion

Dans cet article, nous avons pu voir quelles sont les nouvelles techniques pour typer des CDS Elements ou Parameters. Et que cela peut également etre utilisé directement en ABAP.