SAP Build Work Zone Integration: Fiori Apps im Launchpad bereitstellen

kategorie
Integration
Veröffentlicht
autor
Johannes

SAP Build Work Zone ist der zentrale Einstiegspunkt für Fiori-Anwendungen auf der SAP Business Technology Platform. In diesem Artikel lernst du, wie du deine RAP-basierten Fiori Apps im Work Zone Launchpad bereitstellst und konfigurierst.

Was ist SAP Build Work Zone?

SAP Build Work Zone bietet ein einheitliches, rollenbasiertes Launchpad für den Zugriff auf Fiori-Anwendungen, Workflows und Business Content:

AspektSAP GUI LaunchpadSAP Build Work Zone
PlattformOn-PremiseBTP (Cloud)
TechnologieABAP BSPCloud Foundry
PersonalisierungLimitiertUmfangreich
IntegrationSAP-internMulti-Cloud, hybride Landschaften
ContentTransaktionenApps, Workflows, Spaces, Pages
MobileEingeschränktNative Unterstützung

Work Zone Editionen

  • Standard Edition: Fiori Launchpad, Spaces, Pages, Basic Analytics
  • Advanced Edition: Zusätzlich Workspaces, Content Federation, SAP Jam Integration

Architektur-Übersicht

┌─────────────────────────────────────────────────────────────────────┐
│ SAP Build Work Zone │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Spaces │ │ Pages │ │ Roles │ │
│ │ (Bereiche) │ │ (Seiten) │ │ (Zugriff) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └────────────────┬┴─────────────────┘ │
│ │ │
│ ┌───────────────────────▼───────────────────────────────────────┐ │
│ │ Launchpad Service │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ Tile 1 │ │ Tile 2 │ │ Tile 3 │ │ Tile 4 │ │ │
│ │ └───┬────┘ └───┬────┘ └───┬────┘ └───┬────┘ │ │
│ │ │ │ │ │ │ │
│ └───────┼───────────┼───────────┼───────────┼────────────────────┘ │
└──────────┼───────────┼───────────┼───────────┼───────────────────────┘
│ │ │ │
┌─────▼──┐ ┌─────▼──┐ ┌─────▼──┐ ┌─────▼──┐
│ABAP App│ │CAP App │ │UI5 App │ │Extern │
│(RAP) │ │(Node) │ │(Custom)│ │(Link) │
└────────┘ └────────┘ └────────┘ └────────┘

Semantic Objects und Actions

Semantic Objects sind abstrakte Geschäftsobjekte, die über Actions angesteuert werden. Sie ermöglichen Intent-based Navigation zwischen Anwendungen.

Konzept

BegriffBeschreibungBeispiel
Semantic ObjectAbstraktes GeschäftsobjektSalesOrder, Customer, Product
ActionOperation auf dem Objektdisplay, create, edit, approve
IntentKombination Object + ActionSalesOrder-display
ParametersKontextdaten für NavigationSalesOrderID=1000

Intent-based Navigation

// Navigation zu einer anderen 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)

Die manifest.json ist das Herzstück jeder Fiori-App und definiert alle Metadaten für die Work Zone Integration.

Grundstruktur

{
"_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"
}
}

Inbound Navigation konfigurieren

Die crossNavigation.inbounds-Sektion definiert, wie die App im Launchpad erreichbar ist:

{
"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
}
}
}
}
}

Outbound Navigation konfigurieren

Für Navigation zu anderen Apps:

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

Launchpad-Konfiguration

1. Spaces und Pages einrichten

Spaces organisieren Anwendungen thematisch, Pages stellen die eigentlichen Inhalte dar.

Space erstellen:

  1. BTP Cockpit → Work Zone Site Manager öffnen
  2. Content Manager → Create → Space
  3. Space-ID und Titel vergeben (z.B. “SalesManagement”)

Page erstellen:

  1. Content Manager → Create → Page
  2. Page dem Space zuordnen
  3. Sections mit Tiles konfigurieren

2. Business App konfigurieren

┌───────────────────────────────────────────────────────────────┐
│ Content Manager: Business App │
├───────────────────────────────────────────────────────────────┤
│ General: │
│ ├── App ID: com.mycompany.salesorder.manage │
│ ├── Title: Aufträge verwalten │
│ └── 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. Role Assignment

Apps werden über Rollen zugewiesen:

┌─────────────────────────────────────────────────────────────┐
│ Role: Z_SALES_MANAGER │
├─────────────────────────────────────────────────────────────┤
│ Assigned Apps: │
│ ├── Aufträge verwalten (SalesOrder-manage) │
│ ├── Aufträge anzeigen (SalesOrder-display) │
│ └── Kunden anzeigen (Customer-display) │
│ │
│ Assigned Spaces: │
│ └── SalesManagement │
│ │
│ Assigned Users/Groups: │
│ ├── SALES_MANAGERS (IDP Group) │
│ └── [email protected]
└─────────────────────────────────────────────────────────────┘

Integration mit IAM-Apps

Im ABAP-System werden IAM Business Catalogs und IAM Apps für die Berechtigungssteuerung verwendet.

IAM App erstellen

" IAM App: ZSALESORDER_MANAGE
" Beschreibung: Sales Order Management Application
"
" Zugeordnete Services:
" - ZC_SALESORDER_CDS (OData V4 Service)
" - ZUI_SALESORDER_O4 (UI Service)
"
" Berechtigungsobjekte:
" - S_SERVICE (RFC/HTTP Dienste)
" - ZAUTH_SO (Custom Authorization)

Business Catalog erstellen

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

Verknüpfung BTP und ABAP System

Die Verbindung zwischen Work Zone Rollen und ABAP IAM erfolgt über:

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

Content Provider einrichten

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

Vollständiges Beispiel: Travel App Deployment

1. RAP Service erstellen

@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. Service Definition

@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 für 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. IAM App Definition (ADT)

In Eclipse ADT unter IAM AppCreate New:

ID: ZTRAVEL_MANAGE
Description: Travel Management Application
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 (optional):
- Read access only for certain fields

6. Work Zone Site Manager Konfiguration

1. Content Provider hinzufügen
└── Source: S4HANA_ABAP_DESTINATION
2. Content von Provider abrufen
└── Apps/Catalogs werden synchronisiert
3. Rolle erstellen: Z_TRAVEL_MANAGER
├── Apps zuweisen: Travel-manage
└── Space zuweisen: TravelManagement
4. Benutzer/Gruppen zur Rolle hinzufügen
└── TRAVEL_MANAGERS (IDP Group)
5. Site aktivieren und testen

Dynamic Tiles mit KPIs

Dynamic Tiles zeigen aktuelle Kennzahlen direkt im Launchpad an.

OData Service für Tile-Daten

@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 für Dynamic Tile

{
"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"
}
}
}
}
}

Best Practices

ThemaEmpfehlung
Semantic ObjectsKonsistente Namensgebung über alle Apps (CamelCase, singular)
ActionsStandard-Actions nutzen: display, create, manage, edit, approve
manifest.jsonAlle Navigation-relevanten Metadaten vollständig pflegen
LokalisierungTitel und Beschreibungen in i18n-Dateien auslagern
IAMPro App ein IAM-Objekt, Gruppierung in Business Catalogs
Content ProviderAutomatische Synchronisation aktivieren
TestingLaunchpad-Integration vor Go-Live in Testumgebung validieren
RollenGeschäftsrollen-basiert, nicht technisch (Sales Manager statt APP_USER)

Weiterführende Themen