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:
| Aspekt | SAP GUI Launchpad | SAP Build Work Zone |
|---|---|---|
| Plattform | On-Premise | BTP (Cloud) |
| Technologie | ABAP BSP | Cloud Foundry |
| Personalisierung | Limitiert | Umfangreich |
| Integration | SAP-intern | Multi-Cloud, hybride Landschaften |
| Content | Transaktionen | Apps, Workflows, Spaces, Pages |
| Mobile | Eingeschränkt | Native 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
| Begriff | Beschreibung | Beispiel |
|---|---|---|
| Semantic Object | Abstraktes Geschäftsobjekt | SalesOrder, Customer, Product |
| Action | Operation auf dem Objekt | display, create, edit, approve |
| Intent | Kombination Object + Action | SalesOrder-display |
| Parameters | Kontextdaten für Navigation | SalesOrderID=1000 |
Intent-based Navigation
// Navigation zu einer anderen App via Intentsap.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:
- BTP Cockpit → Work Zone Site Manager öffnen
- Content Manager → Create → Space
- Space-ID und Titel vergeben (z.B. “SalesManagement”)
Page erstellen:
- Content Manager → Create → Page
- Page dem Space zuordnen
- 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:
- Communication Arrangement (SAP_COM_0008)
- Destination im BTP Cockpit
- 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: truedefine 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 App → Create New:
ID: ZTRAVEL_MANAGEDescription: Travel Management ApplicationFiori App ID: com.mycompany.travel.manage
Services:- ZUI_TRAVEL_O4 (OData V4)
UI5 Repository:- com.mycompany.travel.manage5. Business Catalog (ADT)
ID: ZTRAVEL_BCDescription: Travel Management Business Catalog
Apps:- ZTRAVEL_MANAGE- ZTRAVEL_DISPLAY- ZBOOKING_MANAGE
Restrictions (optional):- Read access only for certain fields6. 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 testenDynamic 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 Statusmanifest.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
| Thema | Empfehlung |
|---|---|
| Semantic Objects | Konsistente Namensgebung über alle Apps (CamelCase, singular) |
| Actions | Standard-Actions nutzen: display, create, manage, edit, approve |
| manifest.json | Alle Navigation-relevanten Metadaten vollständig pflegen |
| Lokalisierung | Titel und Beschreibungen in i18n-Dateien auslagern |
| IAM | Pro App ein IAM-Objekt, Gruppierung in Business Catalogs |
| Content Provider | Automatische Synchronisation aktivieren |
| Testing | Launchpad-Integration vor Go-Live in Testumgebung validieren |
| Rollen | Geschäftsrollen-basiert, nicht technisch (Sales Manager statt APP_USER) |
Weiterführende Themen
- RAP Basics - Grundlagen der RAP-Entwicklung
- OData Services - Service Definition und Binding
- Destination Service - Systemverbindungen konfigurieren
- CDS Annotations - UI-Annotationen für Fiori Elements