Integration SAP Build Work Zone : Deployer des apps Fiori dans le Launchpad

Catégorie
Integration
Publié
Auteur
Johannes

SAP Build Work Zone est le point d’entree central pour les applications Fiori sur la SAP Business Technology Platform. Dans cet article, vous apprendrez comment deployer et configurer vos apps Fiori basees sur RAP dans le Launchpad Work Zone.

Qu’est-ce que SAP Build Work Zone ?

SAP Build Work Zone fournit un Launchpad unifie et base sur les roles pour l’acces aux applications Fiori, workflows et contenus metier :

AspectSAP GUI LaunchpadSAP Build Work Zone
PlateformeOn-PremiseBTP (Cloud)
TechnologieABAP BSPCloud Foundry
PersonnalisationLimiteeEtendue
IntegrationInterne SAPMulti-Cloud, paysages hybrides
ContenuTransactionsApps, Workflows, Spaces, Pages
MobileRestreintSupport natif

Editions Work Zone

  • Edition Standard : Fiori Launchpad, Spaces, Pages, Analytics de base
  • Edition Advanced : En plus : Workspaces, Content Federation, integration SAP Jam

Vue d’ensemble de l’architecture

┌─────────────────────────────────────────────────────────────────────┐
│ SAP Build Work Zone │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Spaces │ │ Pages │ │ Roles │ │
│ │ (Espaces) │ │ (Pages) │ │ (Acces) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └────────────────┬┴─────────────────┘ │
│ │ │
│ ┌───────────────────────▼───────────────────────────────────────┐ │
│ │ Launchpad Service │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ Tile 1 │ │ Tile 2 │ │ Tile 3 │ │ Tile 4 │ │ │
│ │ └───┬────┘ └───┬────┘ └───┬────┘ └───┬────┘ │ │
│ │ │ │ │ │ │ │
│ └───────┼───────────┼───────────┼───────────┼────────────────────┘ │
└──────────┼───────────┼───────────┼───────────┼───────────────────────┘
│ │ │ │
┌─────▼──┐ ┌─────▼──┐ ┌─────▼──┐ ┌─────▼──┐
│App ABAP│ │App CAP │ │App UI5 │ │Externe │
│(RAP) │ │(Node) │ │(Custom)│ │(Lien) │
└────────┘ └────────┘ └────────┘ └────────┘

Semantic Objects et Actions

Les Semantic Objects sont des objets metier abstraits pilotes par des Actions. Ils permettent la navigation basee sur les intents entre les applications.

Concept

TermeDescriptionExemple
Semantic ObjectObjet metier abstraitSalesOrder, Customer, Product
ActionOperation sur l’objetdisplay, create, edit, approve
IntentCombinaison Object + ActionSalesOrder-display
ParametersDonnees de contexte pour la navigationSalesOrderID=1000
// Navigation vers une autre app via Intent
sap.ushell.Container.getServiceAsync("CrossApplicationNavigation")
.then(function(oService) {
oService.toExternal({
target: {
semanticObject: "SalesOrder",
action: "display"
},
params: {
SalesOrderID: "1000"
}
});
});

App Descriptor (manifest.json)

Le manifest.json est le coeur de chaque app Fiori et definit toutes les metadonnees pour l’integration Work Zone.

Structure de base

{
"_version": "1.62.0",
"sap.app": {
"id": "com.mycompany.salesorder.manage",
"type": "application",
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"applicationVersion": {
"version": "1.0.0"
},
"dataSources": {
"mainService": {
"uri": "/sap/opu/odata4/sap/zsalesorder_api/srvd_a2x/sap/zsalesorder/0001/",
"type": "OData",
"settings": {
"odataVersion": "4.0"
}
}
},
"crossNavigation": {
"inbounds": {
"SalesOrder-manage": {
"semanticObject": "SalesOrder",
"action": "manage",
"title": "{{flpTitle}}",
"subTitle": "{{flpSubtitle}}",
"signature": {
"parameters": {},
"additionalParameters": "allowed"
}
}
},
"outbounds": {
"displayCustomer": {
"semanticObject": "Customer",
"action": "display"
}
}
}
},
"sap.ui": {
"technology": "UI5",
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
}
},
"sap.ui5": {
"flexEnabled": true,
"dependencies": {
"minUI5Version": "1.120.0",
"libs": {
"sap.m": {},
"sap.ui.core": {},
"sap.fe.templates": {}
}
},
"models": {
"": {
"dataSource": "mainService",
"preload": true,
"settings": {
"synchronizationMode": "None",
"operationMode": "Server",
"autoExpandSelect": true,
"earlyRequests": true
}
},
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "com.mycompany.salesorder.manage.i18n.i18n"
}
}
},
"routing": {
"routes": [
{
"pattern": ":?query:",
"name": "SalesOrderList",
"target": "SalesOrderList"
},
{
"pattern": "SalesOrder({key}):?query:",
"name": "SalesOrderObjectPage",
"target": "SalesOrderObjectPage"
}
],
"targets": {
"SalesOrderList": {
"type": "Component",
"id": "SalesOrderList",
"name": "sap.fe.templates.ListReport",
"options": {
"settings": {
"entitySet": "SalesOrder"
}
}
},
"SalesOrderObjectPage": {
"type": "Component",
"id": "SalesOrderObjectPage",
"name": "sap.fe.templates.ObjectPage",
"options": {
"settings": {
"entitySet": "SalesOrder"
}
}
}
}
}
},
"sap.cloud": {
"public": true,
"service": "com.mycompany.salesorder"
}
}

Configurer la navigation Inbound

La section crossNavigation.inbounds definit comment l’app est accessible dans le Launchpad :

{
"crossNavigation": {
"inbounds": {
"SalesOrder-manage": {
"semanticObject": "SalesOrder",
"action": "manage",
"title": "{{flpTitle}}",
"subTitle": "{{flpSubtitle}}",
"icon": "sap-icon://sales-order",
"signature": {
"parameters": {
"Status": {
"defaultValue": {
"value": "Open",
"format": "plain"
},
"filter": {
"value": "(Open|InProgress)",
"format": "regexp"
},
"required": false
}
},
"additionalParameters": "allowed"
},
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
}
}
}
}
}

Configurer la navigation Outbound

Pour la navigation vers d’autres apps :

{
"crossNavigation": {
"outbounds": {
"displayCustomer": {
"semanticObject": "Customer",
"action": "display",
"parameters": {
"CustomerID": {}
}
},
"displayProduct": {
"semanticObject": "Product",
"action": "display"
}
}
}
}

Configuration du Launchpad

1. Configurer les Spaces et Pages

Les Spaces organisent les applications par theme, les Pages representent le contenu reel.

Creer un Space :

  1. BTP Cockpit -> ouvrir Work Zone Site Manager
  2. Content Manager -> Create -> Space
  3. Attribuer un ID et titre de Space (par ex. “SalesManagement”)

Creer une Page :

  1. Content Manager -> Create -> Page
  2. Associer la Page au Space
  3. Configurer les Sections avec des Tiles

2. Configurer la Business App

┌───────────────────────────────────────────────────────────────┐
│ Content Manager: Business App │
├───────────────────────────────────────────────────────────────┤
│ General: │
│ ├── App ID: com.mycompany.salesorder.manage │
│ ├── Title: Gerer les commandes │
│ └── Subtitle: Sales Order Management │
│ │
│ Navigation: │
│ ├── Semantic Object: SalesOrder │
│ └── Action: manage │
│ │
│ Visualization: │
│ ├── Tile Type: Static │
│ ├── Icon: sap-icon://sales-order │
│ └── Info: Live │
│ │
│ Assignment: │
│ └── Roles: Z_SALES_MANAGER, Z_SALES_ADMIN │
└───────────────────────────────────────────────────────────────┘

3. Affectation des roles

Les apps sont affectees via des roles :

┌─────────────────────────────────────────────────────────────┐
│ Role: Z_SALES_MANAGER │
├─────────────────────────────────────────────────────────────┤
│ Apps affectees : │
│ ├── Gerer les commandes (SalesOrder-manage) │
│ ├── Afficher les commandes (SalesOrder-display) │
│ └── Afficher les clients (Customer-display) │
│ │
│ Spaces affectes : │
│ └── SalesManagement │
│ │
│ Utilisateurs/Groupes affectes : │
│ ├── SALES_MANAGERS (Groupe IDP) │
│ └── [email protected]
└─────────────────────────────────────────────────────────────┘

Integration avec les IAM Apps

Dans le systeme ABAP, les IAM Business Catalogs et IAM Apps sont utilises pour le controle des autorisations.

Creer une IAM App

" IAM App: ZSALESORDER_MANAGE
" Description: Application Sales Order Management
"
" Services associes :
" - ZC_SALESORDER_CDS (Service OData V4)
" - ZUI_SALESORDER_O4 (Service UI)
"
" Objets d'autorisation :
" - S_SERVICE (Services RFC/HTTP)
" - ZAUTH_SO (Autorisation personnalisee)

Creer un Business Catalog

┌─────────────────────────────────────────────────────────────┐
│ Business Catalog: ZSALES_BC │
├─────────────────────────────────────────────────────────────┤
│ Description: Sales Business Catalog │
│ │
│ IAM Apps affectees : │
│ ├── ZSALESORDER_MANAGE │
│ ├── ZSALESORDER_DISPLAY │
│ └── ZCUSTOMER_DISPLAY │
│ │
│ Services affectes : │
│ ├── /sap/opu/odata4/sap/zsalesorder_api/... │
│ └── /sap/opu/odata4/sap/zcustomer_api/... │
└─────────────────────────────────────────────────────────────┘

Liaison BTP et systeme ABAP

La connexion entre les roles Work Zone et l’IAM ABAP s’effectue via :

  1. Communication Arrangement (SAP_COM_0008)
  2. Destination dans le BTP Cockpit
  3. Content Provider dans Work Zone
┌─────────────────┐ Destination ┌─────────────────┐
│ SAP Build │◄─────────────────►│ Systeme ABAP │
│ Work Zone │ │ (BTP/On-Prem) │
│ │ SAP_COM_0008 │ │
│ - Roles │◄─────────────────►│ - IAM Apps │
│ - Tiles │ │ - Bus. Catalog │
│ - Navigation │ Content │ - Services │
│ │◄─────────────────►│ │
└─────────────────┘ Federation └─────────────────┘

Configurer le Content Provider

{
"name": "ABAP_S4HANA",
"description": "Systeme S/4HANA ABAP",
"contentProviderType": "sap_abap",
"connection": {
"destination": "S4HANA_ABAP",
"path": "/sap/bc/ui2/cdm3/",
"authenticationType": "OAuth2SAMLBearerAssertion"
},
"runtime": {
"destination": "S4HANA_RUNTIME",
"path": ""
}
}

Exemple complet : Deploiement d’une Travel App

1. Creer le service RAP

@EndUserText.label: 'Travel Projection View"
@AccessControl.authorizationCheck: #CHECK
@Metadata.allowExtensions: true
define root view entity ZC_Travel
provider contract transactional_query
as projection on ZI_Travel
{
key TravelUUID,
TravelID,
Description,
CustomerID,
BeginDate,
EndDate,
TotalPrice,
CurrencyCode,
Status,
/* Associations */
_Customer,
_Booking : redirected to composition child ZC_Booking
}

2. Definition du service

@EndUserText.label: 'Travel Service"
define service ZUI_Travel_O4 {
expose ZC_Travel as Travel;
expose ZC_Booking as Booking;
expose ZC_Customer as Customer;
}

3. manifest.json pour Fiori Elements

{
"_version": "1.62.0",
"sap.app": {
"id": "com.mycompany.travel.manage",
"type": "application",
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"ach": "MM-PUR",
"applicationVersion": {
"version": "1.0.0"
},
"dataSources": {
"mainService": {
"uri": "/sap/opu/odata4/sap/zui_travel_o4/srvd_a2x/sap/zui_travel_o4/0001/",
"type": "OData",
"settings": {
"odataVersion": "4.0"
}
}
},
"crossNavigation": {
"inbounds": {
"Travel-manage": {
"semanticObject": "Travel",
"action": "manage",
"title": "{{flpTitle}}",
"subTitle": "{{flpSubtitle}}",
"icon": "sap-icon://flight",
"signature": {
"parameters": {},
"additionalParameters": "allowed"
}
}
},
"outbounds": {
"displayCustomer": {
"semanticObject": "Customer",
"action": "display"
},
"displayBooking": {
"semanticObject": "Booking",
"action": "display"
}
}
}
},
"sap.ui5": {
"flexEnabled": true,
"dependencies": {
"minUI5Version": "1.120.0",
"libs": {
"sap.m": {},
"sap.fe.templates": {}
}
},
"models": {
"": {
"dataSource": "mainService",
"preload": true,
"settings": {
"synchronizationMode": "None",
"operationMode": "Server",
"autoExpandSelect": true
}
}
},
"routing": {
"routes": [
{
"pattern": ":?query:",
"name": "TravelList",
"target": "TravelList"
},
{
"pattern": "Travel({key}):?query:",
"name": "TravelObjectPage",
"target": "TravelObjectPage"
}
],
"targets": {
"TravelList": {
"type": "Component",
"id": "TravelList",
"name": "sap.fe.templates.ListReport",
"options": {
"settings": {
"entitySet": "Travel",
"variantManagement": "Page",
"initialLoad": "Enabled"
}
}
},
"TravelObjectPage": {
"type": "Component",
"id": "TravelObjectPage",
"name": "sap.fe.templates.ObjectPage",
"options": {
"settings": {
"entitySet": "Travel",
"editableHeaderContent": false,
"sectionLayout": "Tabs"
}
}
}
}
}
},
"sap.cloud": {
"public": true,
"service": "com.mycompany.travel"
},
"sap.fiori": {
"registrationIds": ["F1234"],
"archeType": "transactional"
}
}

4. Definition IAM App (ADT)

Dans Eclipse ADT sous IAM App -> Create New :

ID: ZTRAVEL_MANAGE
Description: Application Travel Management
Fiori App ID: com.mycompany.travel.manage
Services:
- ZUI_TRAVEL_O4 (OData V4)
UI5 Repository:
- com.mycompany.travel.manage

5. Business Catalog (ADT)

ID: ZTRAVEL_BC
Description: Travel Management Business Catalog
Apps:
- ZTRAVEL_MANAGE
- ZTRAVEL_DISPLAY
- ZBOOKING_MANAGE
Restrictions (optionnel):
- Acces en lecture seule pour certains champs

6. Configuration dans Work Zone Site Manager

1. Ajouter le Content Provider
└── Source: S4HANA_ABAP_DESTINATION
2. Recuperer le contenu du Provider
└── Apps/Catalogs sont synchronises
3. Creer le role : Z_TRAVEL_MANAGER
├── Affecter les apps : Travel-manage
└── Affecter le Space : TravelManagement
4. Ajouter utilisateurs/groupes au role
└── TRAVEL_MANAGERS (Groupe IDP)
5. Activer le site et tester

Tiles dynamiques avec KPIs

Les Tiles dynamiques affichent des indicateurs actuels directement dans le Launchpad.

Service OData pour les donnees Tile

@EndUserText.label: 'Travel KPI View"
define root view entity ZI_TravelKPI
as select from ZI_Travel
{
key 1 as DummyKey,
@Aggregation.default: #SUM
count(*) as TotalCount,
@Aggregation.default: #SUM
sum( case Status when 'O' then 1 else 0 end ) as OpenCount,
@Aggregation.default: #SUM
sum( case Status when 'A' then 1 else 0 end ) as ApprovedCount
}
group by Status

manifest.json pour Tile dynamique

{
"crossNavigation": {
"inbounds": {
"Travel-manage": {
"semanticObject": "Travel",
"action": "manage",
"title": "{{flpTitle}}",
"subTitle": "{{flpSubtitle}}",
"icon": "sap-icon://flight",
"indicatorDataSource": {
"dataSource": "mainService",
"path": "TravelKPI",
"refresh": 300
},
"signature": {
"parameters": {},
"additionalParameters": "allowed"
}
}
}
}
}

Bonnes pratiques

ThemeRecommandation
Semantic ObjectsNommage coherent sur toutes les apps (CamelCase, singulier)
ActionsUtiliser les actions standard : display, create, manage, edit, approve
manifest.jsonRemplir completement toutes les metadonnees de navigation
LocalisationExternaliser titres et descriptions dans les fichiers i18n
IAMUn objet IAM par app, regroupement en Business Catalogs
Content ProviderActiver la synchronisation automatique
TestsValider l’integration Launchpad en environnement de test avant Go-Live
RolesBases sur les roles metier, pas techniques (Sales Manager au lieu de APP_USER)

Sujets connexes