SAP Analytics Cloud (SAC) Embedded ermöglicht dir, interaktive Dashboards und Visualisierungen direkt in Fiori-Anwendungen einzubetten. Anstatt zwischen verschiedenen Tools zu wechseln, sehen Benutzer Analytics-Inhalte im Kontext ihrer täglichen Arbeit.
Was ist SAP Analytics Cloud Embedded?
SAC Embedded bezeichnet die Integration von SAP Analytics Cloud Stories in SAP-Anwendungen. Dabei werden Dashboards, Charts und KPIs direkt in die Fiori-Oberfläche eingebettet:
| Aspekt | Standalone SAC | Embedded SAC |
|---|---|---|
| Zugriff | Separates Portal | Innerhalb Fiori App |
| Kontext | Unabhängig | Geschäftsobjekt-bezogen |
| Navigation | Eigenständig | Teil des Workflows |
| Filter | Manuell | Automatisch aus App |
| Lizenz | SAC Lizenz | Embedded in BTP |
Anwendungsfälle
- Object Page Analytics: Kennzahlen zum aktuellen Geschäftsobjekt
- Overview Page: KPI-Kacheln mit Drill-Down
- Custom Sections: Analytische Bereiche in Fiori Apps
- Management Dashboards: Eingebettet in Transaktionsanwendungen
Architektur und Komponenten
Die Integration basiert auf mehreren Komponenten:
┌─────────────────────────────────────────────────────┐│ Fiori App ││ ┌───────────────────────────────────────────────┐ ││ │ SAC Story (iframe) │ ││ │ ┌─────────────────────────────────────────┐ │ ││ │ │ Charts, Tables, KPIs │ │ ││ │ └─────────────────────────────────────────┘ │ ││ └───────────────────────────────────────────────┘ │└──────────────────────┬──────────────────────────────┘ │ Filter-Kontext┌──────────────────────▼──────────────────────────────┐│ SAP Analytics Cloud ││ ┌───────────────────────────────────────────────┐ ││ │ Story / Model / Connection │ ││ └───────────────────────────────────────────────┘ │└──────────────────────┬──────────────────────────────┘ │ Live Data Connection┌──────────────────────▼──────────────────────────────┐│ ABAP Cloud System ││ ┌───────────────────────────────────────────────┐ ││ │ Analytical CDS Views │ ││ │ (Cube, Dimensions, Queries) │ ││ └───────────────────────────────────────────────┘ │└─────────────────────────────────────────────────────┘Analytische CDS Views für SAC
Die Basis für SAC-Integration sind analytische CDS Views. Diese müssen speziell für den Zugriff durch SAC annotiert sein.
Dimension View
Dimensionen sind Gruppierungsmerkmale wie Kunde, Produkt oder Zeit:
@Analytics.dataCategory: #DIMENSION@ObjectModel.representativeKey: 'CustomerId'@EndUserText.label: 'Kunden Dimension'define view entity ZI_CustomerDimension as select from zcustomer association [0..1] to I_Country as _Country on $projection.CountryCode = _Country.Country{ @ObjectModel.text.element: ['CustomerName'] key customer_id as CustomerId,
customer_name as CustomerName, customer_group as CustomerGroup,
@ObjectModel.foreignKey.association: '_Country' country_code as CountryCode,
city as City, region as Region,
_Country}Cube View für SAC
Der Cube enthält Measures und verknüpft Dimensionen:
@Analytics.dataCategory: #CUBE@Analytics.internalName: #LOCAL@ObjectModel.supportedCapabilities: [#ANALYTICAL_QUERY, #SQL_DATA_SOURCE]
@EndUserText.label: 'Sales Cube für SAC'define view entity ZI_SalesCubeSAC as select from zsales_data as Sales association [0..1] to ZI_CustomerDimension as _Customer on $projection.CustomerId = _Customer.CustomerId association [0..1] to ZI_ProductDimension as _Product on $projection.ProductId = _Product.ProductId association [0..1] to I_CalendarMonth as _CalendarMonth on $projection.CalendarMonth = _CalendarMonth.CalendarMonth{ -- Dimensionen @Analytics.dimension: true @ObjectModel.foreignKey.association: '_Customer' Sales.customer_id as CustomerId,
@Analytics.dimension: true @ObjectModel.foreignKey.association: '_Product' Sales.product_id as ProductId,
@Analytics.dimension: true @Semantics.calendar.yearMonth: true @ObjectModel.foreignKey.association: '_CalendarMonth' Sales.calendar_month as CalendarMonth,
@Analytics.dimension: true Sales.sales_org as SalesOrganization,
@Analytics.dimension: true Sales.distribution_ch as DistributionChannel,
-- Measures @Aggregation.default: #SUM @Semantics.amount.currencyCode: 'Currency' @EndUserText.label: 'Umsatz' Sales.revenue as Revenue,
@Aggregation.default: #SUM @Semantics.quantity.unitOfMeasure: 'Unit' @EndUserText.label: 'Menge' Sales.quantity as Quantity,
@Aggregation.default: #SUM @EndUserText.label: 'Anzahl Aufträge' cast(1 as abap.int4) as OrderCount,
@Semantics.currencyCode: true Sales.currency as Currency,
@Semantics.unitOfMeasure: true Sales.unit as Unit,
-- Assoziationen _Customer, _Product, _CalendarMonth}Query View für SAC
Die Query definiert die analytische Auswertung:
@Analytics.query: true@VDM.viewType: #CONSUMPTION@EndUserText.label: 'Sales Analytics Query'
-- Wichtig für SAC-Zugriff@ObjectModel.usageType: { serviceQuality: #D, sizeCategory: #XXL, dataClass: #MIXED}
define view entity ZC_SalesAnalyticsSAC as projection on ZI_SalesCubeSAC{ -- Freie Merkmale (frei wählbar in SAC) @AnalyticsDetails.query.display: #KEY_TEXT @AnalyticsDetails.query.axis: #FREE CustomerId,
@AnalyticsDetails.query.axis: #FREE ProductId,
@AnalyticsDetails.query.axis: #ROWS CalendarMonth,
@AnalyticsDetails.query.axis: #FREE SalesOrganization,
@AnalyticsDetails.query.axis: #FREE DistributionChannel,
-- Kennzahlen @AnalyticsDetails.query.axis: #COLUMNS Revenue,
@AnalyticsDetails.query.axis: #COLUMNS Quantity,
@AnalyticsDetails.query.axis: #COLUMNS OrderCount,
Currency, Unit,
-- Berechnete Kennzahl: Durchschnittlicher Auftragswert @EndUserText.label: 'Durchschn. Auftragswert' @AnalyticsDetails.query.axis: #COLUMNS division(Revenue, OrderCount, 2) as AverageOrderValue,
_Customer, _Product, _CalendarMonth}Live Data Connection einrichten
Die Live Data Connection verbindet SAC direkt mit dem ABAP Cloud System.
Schritt 1: Communication Arrangement erstellen
Im ABAP Cloud System wird ein Communication Arrangement für den SAC-Zugriff benötigt:
Communication Scenario: SAP_COM_0065 (InA - Information Access)Communication System: SAC_SYSTEMCommunication User: SAC_TECHNICAL_USERSchritt 2: Connection in SAC anlegen
In SAP Analytics Cloud unter Connections → Add Connection:
| Einstellung | Wert |
|---|---|
| Connection Type | SAP S/4HANA |
| Host | abap-system.cloud.sap |
| Port | 443 |
| Authentication | OAuth 2.0 SAML Bearer |
| Token URL | /sap/bc/sec/oauth2/token |
Schritt 3: Model erstellen
Das SAC Model basiert auf der CDS Query:
Model Type: Live DataConnection: ABAP_CLOUD_SYSTEMData Source: ZC_SALESANALYTICSSACInA Service Aktivierung
Der InA (Information Access) Service muss im System aktiviert sein:
-- CDS View muss InA-fähig sein@Analytics.query: true@ObjectModel.supportedCapabilities: [#ANALYTICAL_QUERY]
-- Diese Annotation ist wichtig für Live Data@Analytics.internalName: #LOCALStory in Fiori App einbetten
Die Einbettung erfolgt über das SAC Widget oder einen Custom Controller.
Option 1: SAC Widget in Object Page
Für Fiori Elements Apps wird ein Custom Section mit SAC Widget verwendet:
manifest.json Anpassung:
{ "sap.ui5": { "routing": { "targets": { "ObjectPage": { "options": { "settings": { "content": { "body": { "sections": { "analyticsSection": { "template": "sap.fe.templates.ObjectPage.AnalyticsSection", "title": "Verkaufsanalyse", "storyId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" } } } } } } } } } }}Option 2: Freestyle UI5 mit sac-embed
Für Freestyle Apps wird die sac-embed Library verwendet:
sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/sac/df/embed/SACEmbedding"], function (Controller, SACEmbedding) { "use strict";
return Controller.extend("com.example.app.controller.Analytics", { onInit: function () { this._initSACEmbed(); },
_initSACEmbed: function () { var oContainer = this.byId("sacContainer");
var oEmbedding = new SACEmbedding({ url: "https://your-sac-tenant.sapanalytics.cloud", storyId: "STORY_ID", pageId: "PAGE_ID", tenantId: "TENANT_ID" });
oEmbedding.embed(oContainer.getDomRef()); } });});Option 3: iFrame-Einbettung
Die einfachste Variante nutzt einen iFrame:
<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:html="http://www.w3.org/1999/xhtml"> <html:iframe id="sacFrame" src="{path: 'StoryUrl'}" width="100%" height="600px" frameborder="0"/></mvc:View>Filter-Kontext zwischen App und SAC
Der Filter-Kontext synchronisiert Auswahlen zwischen Fiori App und SAC Story.
URL-Parameter für Filter
Filter werden über URL-Parameter an die Story übergeben:
_buildSACUrl: function (sStoryId, oFilters) { var sBaseUrl = "https://tenant.sapanalytics.cloud/sap/fpa/ui/app.html"; var sParams = "#/story/" + sStoryId;
// Filter als URL-Parameter if (oFilters.CustomerId) { sParams += "?filter=CustomerId eq '" + oFilters.CustomerId + "'"; } if (oFilters.CalendarMonth) { sParams += "&filter=CalendarMonth eq '" + oFilters.CalendarMonth + "'"; }
return sBaseUrl + sParams;}postMessage API für dynamische Filter
Für bidirektionale Kommunikation wird die postMessage API verwendet:
// Filter an SAC Story senden_applyFilterToSAC: function (oFilter) { var oIframe = this.byId("sacFrame").getDomRef();
var oMessage = { type: "setFilter", dimension: oFilter.dimension, values: oFilter.values, operator: "IN" };
oIframe.contentWindow.postMessage(oMessage, "https://tenant.sapanalytics.cloud");},
// Filter-Events von SAC empfangen_initFilterListener: function () { var that = this; window.addEventListener("message", function (event) { if (event.origin !== "https://tenant.sapanalytics.cloud") { return; }
if (event.data.type === "filterChanged") { that._onSACFilterChanged(event.data.filter); } });}Kontext-Übergabe bei Object Page
Bei Object Pages wird der Kontext des aktuellen Objekts automatisch gefiltert:
_embedSACWithContext: function () { var oBindingContext = this.getView().getBindingContext(); var sCustomerId = oBindingContext.getProperty("CustomerId");
// Story mit Filter für aktuellen Kunden laden var sStoryUrl = this._buildSACUrl("STORY_ID", { CustomerId: sCustomerId });
this.byId("sacFrame").setSrc(sStoryUrl);}Filter-Modell für Synchronisation
// Filter-Modell für bidirektionale Synchronisationvar oFilterModel = new JSONModel({ CustomerId: "", SalesOrganization: "", CalendarMonth: "", syncEnabled: true});this.getView().setModel(oFilterModel, "filter");
// Bei Änderung in Fiori AppoFilterModel.attachPropertyChange(function (oEvent) { if (oFilterModel.getProperty("/syncEnabled")) { this._applyFilterToSAC({ dimension: oEvent.getParameter("path").substring(1), values: [oEvent.getParameter("value")] }); }}.bind(this));Best Practices für Performance
CDS View Optimierung
-- Aggregations-Annotation für effiziente Verdichtung@Aggregation.default: #SUMRevenue,
-- Nur benötigte Dimensionen exponieren@Analytics.dimension: true@AnalyticsDetails.query.axis: #ROWS -- In Zeilen vorselektiertCalendarMonth,
-- Text-Assoziationen für schnellen Zugriff@ObjectModel.text.association: '_CustomerText'CustomerId,Datenvolumen reduzieren
| Maßnahme | Beschreibung |
|---|---|
| Aggregation | Voraggregierte Views verwenden |
| Filter | Nur relevante Daten laden |
| Paginierung | Große Datenmengen begrenzen |
| Cache | SAC Caching aktivieren |
Live Data vs. Import
| Aspekt | Live Data | Import |
|---|---|---|
| Aktualität | Echtzeit | Snapshot |
| Performance | Abhängig vom Backend | Schnell (gecached) |
| Datenvolumen | Begrenzt | Unbegrenzt |
| Empfohlen für | Operative Analyse | Große Datenmengen |
Connection Pool Konfiguration
# SAC Connection Settingsmax_connections: 10connection_timeout: 30000query_timeout: 300000Caching-Strategie
-- In der CDS View für SAC@ObjectModel.usageType: { serviceQuality: #D, -- Für direkte Abfragen optimiert sizeCategory: #L, -- Erwartete Datenmenge dataClass: #TRANSACTIONAL}Berechtigungen und Security
CDS Access Control
@MappingRole: truedefine role ZR_SalesAnalytics { grant select on ZC_SalesAnalyticsSAC where SalesOrganization = aspect pfcg_auth ( V_VBAK_AAT, VKORG, ACTVT = '03' );}SAC Team und Folder Berechtigungen
- Public Folder: Stories für alle Benutzer
- Team Folder: Stories für bestimmte Teams
- Private Folder: Eigene Stories
SSO-Konfiguration
Für nahtlose Authentifizierung zwischen Fiori und SAC:
Identity Provider: SAP Identity AuthenticationTrust Configuration: Cross-Domain SSO enabledPrincipal Propagation: ActiveTroubleshooting
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Keine Daten in SAC | InA Service nicht aktiv | Communication Scenario prüfen |
| Langsame Performance | Große Datenmenge ohne Filter | Pflichtfilter definieren |
| Filter funktioniert nicht | Falscher Feldname | Technische Namen synchronisieren |
| Connection Fehler | Zertifikat abgelaufen | Trust Store aktualisieren |
Diagnose-Tools
-- CDS View testenSELECT * FROM zc_salesanalyticssac WHERE CalendarMonth = '202401';
-- InA-Service prüfen/sap/bw/ina/GetServerInfoZusammenfassung
SAP Analytics Cloud Embedded bringt Analytics direkt in den Arbeitskontext der Benutzer. Die wichtigsten Schritte:
- Analytische CDS Views mit korrekten Annotations erstellen
- Live Data Connection zwischen ABAP Cloud und SAC einrichten
- Story in SAC mit dem CDS-Modell erstellen
- Story einbetten in Fiori App (Widget, Library oder iFrame)
- Filter-Kontext für nahtlose Benutzererfahrung synchronisieren
Die Kombination aus Echtzeitdaten und interaktiven Visualisierungen macht SAC Embedded zu einem mächtigen Werkzeug für datengetriebene Entscheidungen.
Verwandte Themen
- Custom Analytical Queries - Analytische CDS Views im Detail
- Fiori Overview Page (OVP) - KPI-Kacheln und Cards
- CDS Annotations - Alle CDS Annotations im Überblick