SAP Analytics Cloud Embedded: Analytics in Fiori Apps integrieren

kategorie
Integration
Veröffentlicht
autor
Johannes

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:

AspektStandalone SACEmbedded SAC
ZugriffSeparates PortalInnerhalb Fiori App
KontextUnabhängigGeschäftsobjekt-bezogen
NavigationEigenständigTeil des Workflows
FilterManuellAutomatisch aus App
LizenzSAC LizenzEmbedded 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_SYSTEM
Communication User: SAC_TECHNICAL_USER

Schritt 2: Connection in SAC anlegen

In SAP Analytics Cloud unter ConnectionsAdd Connection:

EinstellungWert
Connection TypeSAP S/4HANA
Hostabap-system.cloud.sap
Port443
AuthenticationOAuth 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 Data
Connection: ABAP_CLOUD_SYSTEM
Data Source: ZC_SALESANALYTICSSAC

InA 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: #LOCAL

Story 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 Synchronisation
var oFilterModel = new JSONModel({
CustomerId: "",
SalesOrganization: "",
CalendarMonth: "",
syncEnabled: true
});
this.getView().setModel(oFilterModel, "filter");
// Bei Änderung in Fiori App
oFilterModel.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: #SUM
Revenue,
-- Nur benötigte Dimensionen exponieren
@Analytics.dimension: true
@AnalyticsDetails.query.axis: #ROWS -- In Zeilen vorselektiert
CalendarMonth,
-- Text-Assoziationen für schnellen Zugriff
@ObjectModel.text.association: '_CustomerText'
CustomerId,

Datenvolumen reduzieren

MaßnahmeBeschreibung
AggregationVoraggregierte Views verwenden
FilterNur relevante Daten laden
PaginierungGroße Datenmengen begrenzen
CacheSAC Caching aktivieren

Live Data vs. Import

AspektLive DataImport
AktualitätEchtzeitSnapshot
PerformanceAbhängig vom BackendSchnell (gecached)
DatenvolumenBegrenztUnbegrenzt
Empfohlen fürOperative AnalyseGroße Datenmengen

Connection Pool Konfiguration

# SAC Connection Settings
max_connections: 10
connection_timeout: 30000
query_timeout: 300000

Caching-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: true
define 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 Authentication
Trust Configuration: Cross-Domain SSO enabled
Principal Propagation: Active

Troubleshooting

Häufige Probleme

ProblemUrsacheLösung
Keine Daten in SACInA Service nicht aktivCommunication Scenario prüfen
Langsame PerformanceGroße Datenmenge ohne FilterPflichtfilter definieren
Filter funktioniert nichtFalscher FeldnameTechnische Namen synchronisieren
Connection FehlerZertifikat abgelaufenTrust Store aktualisieren

Diagnose-Tools

-- CDS View testen
SELECT * FROM zc_salesanalyticssac WHERE CalendarMonth = '202401';
-- InA-Service prüfen
/sap/bw/ina/GetServerInfo

Zusammenfassung

SAP Analytics Cloud Embedded bringt Analytics direkt in den Arbeitskontext der Benutzer. Die wichtigsten Schritte:

  1. Analytische CDS Views mit korrekten Annotations erstellen
  2. Live Data Connection zwischen ABAP Cloud und SAC einrichten
  3. Story in SAC mit dem CDS-Modell erstellen
  4. Story einbetten in Fiori App (Widget, Library oder iFrame)
  5. 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