BW Berechtigungen mit der SAP Analytics Cloud synchronisieren 

Januar 2026

Einführung

Im Reporting werden häufig Daten aus verschiedenen Quellen verwendet. So kann es vorkommen, dass ein Teil der Daten in der SAC liegt, während ein anderer Teil über eine Live-Verbindung aus dem BW angezeigt wird. 

Sind diese Daten über ein berechtigungsrelevantes Merkmal eingeschränkt, besteht die Aufgabe darin, die Benutzerberechtigungen über beide Systeme hinweg zu synchronisieren. Dies ist bei einer großen Anzahl von Benutzern und/oder Merkmalen mit vielen Ausprägungen manuell schnell nicht mehr zuverlässig umsetzbar. 

In diesem Blog möchten wir eine Möglichkeit beschreiben, wie sich diese Herausforderung effizient lösen lässt. 

Lösungsansatz 

  • Die Berechtigungen werden im BW originär in einer Tabelle gepflegt, z. B. in einem Planungs‑aDSO. 
  • Weichen die Namen der BW‑User von den Namen der SAC‑User ab, müssen im BW auch die Zuordnungen gepflegt und in der Query bereitgestellt werden. 
  • Die Einschränkung im BW erfolgt über eine Exit‑Variable, die die Werte aus dieser Tabelle ausliest. 
  • Die Berechtigungen werden über eine SAC‑Query zur Verfügung gestellt und mithilfe eines Skripts in die Berechtigungsspalten des Merkmals übertragen. 
  • Das Skript kann nun bei Bedarf manuell gestartet werden, wodurch Übertragungsfehler vermieden werden. 

 

Im Folgenden werden die einzelnen Punkte mit einem einfachen Beispiel genau beschrieben. 

Berechtigungspflege im BW und mapping BW – User zu SAC User 

In unserem Beispiel gehen wir von einer Einzelpflege der Berechtigungen für Buchungskreise aus. Dies haben wir über ein planungsbereites aDSO mit den Schlüsselfeldern „BW User“ und „Company“ sowie dem planungsrelevanten Attribut „Flag Valid“ umgesetzt. Das Flag verwenden wir, um Berechtigungen zurückzunehmen, da Zeilen nicht einfach gelöscht werden können. 

Um das Mapping zu abweichenden BW‑Usernamen zu ermöglichen, haben wir dem Merkmal „BW User“ einfach das Attribut „SAC‑User“ hinzugefügt. Dieses muss einmalig für jeden User gepflegt werden. 

Abbildung 1: Beispiel zur Pflege der Benutzerberechtigung

 

Wird eine Berechtigung auf Hierarchieknoten, bzw. einer zeitabhängigen Pflege benötigt, ist das Szenario entsprechend zu erweitern, ändert aber die grundsätzliche Logik nicht.  

BW – Berechtigung aus der Tabelle ableiten 

Wie beispielsweise im Open‑SAP‑Kurs beschrieben, kann die BW‑Berechtigung basierend auf einer Tabelle eingerichtet werden: 

https://learning.sap.com/courses/implementing-authorizations-in-sap-bw-4hana/using-variables-in-authorizations_b506a634-82b9-4985-97e3-b7ce4ec49648 

Zunächst muss eine Exit‑Variable angelegt werden, die die Ausprägungen liefert, für die der User berechtigt ist. Achtung: Bei der Berechtigungsprüfung wird das Coding im Step 0 ausgeführt. Das Coding für unser Beispiel ist im nächsten Screenshot zu sehen. 

Abbildung 2: Coding der Exit – Variable für die BW – Berechtigung 

Nun muss nur noch ein BW‑Berechtigungsobjekt angelegt werden, und die Berechtigung wird für die gewünschten InfoProvider mithilfe der Exit‑Variable dem entsprechenden Merkmal zugeordnet (siehe nächste Abbildung). 

Abbildung 3: BW – Berechtigungsobjekt für die Einschränkung über die Exit – Variable ZCOMPANY4AUTH 

Damit werden im Bericht nur Buchungskreise angezeigt, auf die der Nutzer berechtigt ist.  

Ein Beispielbericht, bei dem die Berechtigung für den Testnutzer nicht angewandt wird: 

Abbildung 4: Beispiel BW – Bericht ohne Einschränkung 

Und einen Bericht, bei dem die Berechtigung angewandt wird: 

Abbildung 5Der selbe Bericht für einen Benutzer mit Einschränkungen 

Im BW ist der Nutzer also auf nur 2 Buchungskreise berechtigt.  

Synchronisation mit der SAP Analytics Cloud 

In der SAC ist der Buchungskreis entsprechend dem BW als öffentliche Dimension angelegt: 

Abbildung 6: Öffentliche berechtigungsrelevante SAC Dimension

 

Zusätzlich wird die Datenzugriffsberechtigung vergeben. Für das weitere Beispiel betrachten wir nur die Write‑Berechtigung, parallel wäre jedoch auch Read möglich – oder eine Kombination aus beiden. 

Um die Berechtigungsinformationen in der SAC bereitzustellen, benötigen wir eine Query, die alle erlaubten Zugriffe auflistet. Das berechtigungsrelevante Attribut (hier ZCOMPANY) sowie alle User – entscheidend ist am Ende der SAC‑Username – müssen als Liste dargestellt werden. 

In unserem Beispiel sieht das in der SAC folgendermaßen aus: 

Abbildung 7BW Bericht in der SAC mit allen Berechtigungen

 

Dieser Aufriss ist notwendig, da die Zuordnung zwischen Buchungskreis und User mit dem Attribut SAC User über das Result Set im Script gelesen wird, um die Berechtigungen auf die SAC Dimension zu übertragen.  

Die eigentliche Synchronisierung findet im Script statt. Dieses wird durch einen einfachen Button getriggert. Dies ruft die Methode „f_setAuthoriation“ auf.  

Abbildung 8: Definition der Funktion, um die Berechtigungen zu übertragen 

Innerhalb dieser Methode werden zunächst einige Variablen definiert 

// Get result set from table data source 

var tableResultSet = p_Table.getDataSource().getResultSet(); 

// Reference planning model 

var planningModel = PlanningModel_1; 

// Get all members of the given dimension 

var planningModelMembers = planningModel.getMembers(p_Dimension); 

// Array for members to be updated 

var members = ArrayUtils.create(Type.PlanningModelMember); 

// Array to store BW member–user combinations (DIM$USER) 

var dimensionMembersBW = ArrayUtils.create(Type.string); 

// Temporary variables 

var dimensionMember = ""; 

var dimensionUser = „“; 

var dimensionKey = „“; 

// Array to store unique dimension members from BW 

var dimensionArrayBW = ArrayUtils.create(Type.string); 

  

Danach werden zwei Schleifen durchlaufen. Die erste Schleife läuft durch das Result Set und baut einen künstlichen Schlüssel zwischen Buchungskreis und Nutzer auf. Außerdem wird ein Array mit den einzelnen Buchungskreisen befüllt. 

// Extract dimension members and users from BW result set 

for (var j = 0; j < tableResultSet.length; j++) { 

// Get dimension member ID 

dimensionMember = tableResultSet[j][p_Dimension].id; 

// Get BW user mapped to SAC user 

dimensionUser = tableResultSet[j][p_User].properties["ZBW_USER.ZSAC_USER.DISPLAY_KEY"]; 

// Build DIM$USER key if user exists 

if (dimensionUser !== „#“) { 

dimensionKey = dimensionMember + "$" + dimensionUser; 

dimensionMembersBW.push(dimensionKey); 

} 

// Store unique dimension members 

if (dimensionArrayBW.includes(dimensionMember) === false) { 

dimensionArrayBW.push(dimensionMember); 

} 

} 

 

In „dimensionKey“ haben wir die kombinierten Schlüssel aus dem BW, die eine Schreibberechtigung haben sollen.  

Die zweite Schleife durchläuft die Planungsmodellelemente des Buchungskreises in der Analytics Cloud. Dabei wird geprüft, ob der Buchungskreis aus dem BW mit dem aus der Analytics Cloud übereinstimmt. Gleichzeitig sollen vorhandene Teams unverändert bleiben. In dieser Variante werden alle Nutzer entfernt und durch die im BW definierten Nutzer ersetzt, während alle Teams bestehen bleiben. 

// Loop through planning model members 

for (var n = 0; n < planningModelMembers.length; n++) { 

// Process only members found in BW result set 

if (dimensionArrayBW.includes(planningModelMembers[n].id) === true) { 

  // Remove existing user writers but keep team writers 

for (var i = 0; i <= planningModelMembers[n].writers.length; i++) { 
var member = planningModelMembers[n].writers.pop(); 

if (member !== undefined && member.type === UserType.Team) { 

planningModelMembers[n].writers.push(member); 

} 

} 

// Add users as writers based on BW mapping 

for (var k = 0; k < dimensionMembersBW.length; k++) { 

if (planningModelMembers[n].id === dimensionMembersBW[k].split(„$“)[0]) { 

planningModelMembers[n].writers.push({ 

id: dimensionMembersBW[k].split(„$“)[1], 

type: UserType.User 

}); 

} 

}  

// Collect updated member 

members.push(planningModelMembers[n]); 

} 

} 

  

Die angepassten Buchungskreise stehen in „members“. Um die Berechtigungen anzupassen muss nur noch das Planungsmodel aktualisiert werden. 

// Update dimension members with new authorizations 

planningModel.updateMembers(p_Dimension, members); 

 

Nachdem die Funktion lief, sieht der Buchungskreis folgenderweise aus: 

Abbildung 9SAC Dimension nach Übernahme der BW – Berechtigungen 

Beide Nutzer sind auf die Buchungskreise berechtigt, die dem Wert in der Query entsprechen.  

Die Synchronisierung der Berechtigungen beider Systeme ist damit möglich, es gibt aber einige Fallstricke. Wenn die BW nicht 1:1 dem SAC User Namen entsprechen, muss der SAC User Name als Attribut angefügt und entsprechend mit gepflegt werden. Sollte der Name im BW falsch gepflegt sein, wird der Nutzer dennoch in die Berechtigung übernommen. Dies wirft einen Fehler in der Dimension selber mit folgender Fehlermeldung: 

Abbildung 10: Fehlermeldung, wenn ein nicht gültiger SAC – User übertragen wird 

SAC schlägt vor, die falschen Benutzer zu entfernen. Eine Korrektur und Pflege der gewünschten User muss dann noch manuell durchgeführt werden.  

Das Script muss immer ausgeführt werden, wenn Änderungen der Berechtigungen übertragen werden müssen. In der vorgestellten Variante ist es dem Nutzer selbst überlassen, wann die Änderungen vorgenommen werden soll. 

Laufzeit 

Da diese Funktion in ein Skript hinter einem Button liegt, darf die SAC Seite während des Abgleichs nicht geschlossen werden, bis das Skript durchgelaufen ist! 

Die Laufzeit hängt von der Anzahl der Ausprägungen für das berechtigungsrelevante Attribut ab. Hat dies über 1000 Einträge, was z.B. bei einer Berechtigung auf Kostenstelle vorkommen kann, muss mit Laufzeiten von einigen Minuten gerechnet werden, die linear mit der Menge an Einträgen steigt.  

Da das Result Set im Script die aktuelle Selektion nimmt, kann mit einem Filter die Datenmenge angepasst werden. So kann der Administrator einen Abgleich gezielt für die gerade geänderten Kombinationen durchführen, was entsprechend kurze Laufzeiten ermöglicht. 

Abbildung 11: Beispiel des SAC – Berichtes mit eingeschränkter Anzeige auf einen User

Fazit

Der Aufwand einer Berechtigungssynchronisierung ist relativ gering. Mit wenig Coding kann die Information der Berechtigungen aus dem BW in die SAC überführt werden. Sollten die Nutzer die gleiche ID in beiden Systemen haben, wird nicht mal das Attribut am BW Objekt benötigt. Allerdings gibt es noch keine gute Möglichkeit zu prüfen, ob die übertragenden Nutzer und Buchungskreise auch in der SAC entsprechend vorhanden sind. Sollte ein Buchungskreis im BW vorhanden sein, in der SAC aber nicht, würde entsprechende Berechtigung nicht berücksichtigt. Es muss also sichergestellt werden, dass die Stammdaten des berechtigungsrelevanten Attributs idealerweise identisch mit denen im BW sind am besten direkt aus dem BW geladen und dass die entsprechenden Nutzer auch in der SAC existieren. 

Data Products Setup

I’ll start with Data Products setup. If you’re new to the concept, this recent video is a great starting point, but here’s a short summary. A data product is a well-described, easily discoverable, and consumable collection of data sets.

Creating a Data Product in Datasphere

Note that in this article I create Data Products in the Data Sharing Cockpit in Datasphere. This functionality is expected to move into the Data Product Studio, but that had not taken place at the time writing.

Before creating a Data Product in Datasphere, I need to set up a Data Provider profile, collecting descriptive metadata like contact and address details, industry, regional coverage, and importantly define Data Product Visibility. Enabling Formations allows me to share the Data Product with systems across your BDC Formation – Databricks, in this case.

With the Data Provider set up, I can go ahead and create a Data Product. As with the Data Provider, I’ll need to add metadata about the product and define its artifacts – the datasets it contains. Only datasets from a space of SAP HANA Data Lake Files type can be selected. Since this Data Product is visible across the Formation, it is available free of charge.

For this demo, the artifact is a local table containing ten years of Ice Cream sales data. Since this is a File type space, importing a CSV file directly to create a local table isn’t an option (see documentation).

I used a Replication Flow to perform an initial load from a BW aDSO table into a local table.

Once Data Product is created and listed, it becomes available in the Catalog & Marketplace, from where it can be shared with Databricks by selecting the appropriate connection details.

Jump into Databricks

To use the shared object In Databricks, I need to mount it to the Catalog – either by creating a new Catalog or using an existing one.

Databricks appends a version number to the end of the schema – ‘:v1’ – to maintain versioning in case of any future changes to the Data Product.

Once the share is mounted, the schema is created automatically, and the Sales actual data table becomes available within it. From there, I can access the shared table directly in a Notebook.

Creating a Data Product in Databricks

To create a Data Product in Databricks, I first need to create a Share – which I can either do via the Delta Sharing settings in the Catalog:

Or directly out of the table which is going to become a part of the Share:

Since a single Share can contain multiple tables, I have the option to either add the table to an existing Share, or create a new one:

To publish the Share as a Data Product, I run a Python script where I define the target table for the forecast and describe the Share in CSN notation, setting the Primary Keys. Primary Keys are required for installing Data Products in Datasphere.

Jump back into Datasphere

Once the Databricks Data Product is available in Datasphere, I install it into a Space configured as a HANA Database space – since my intention is to build a view on top of the table and use it for planning in SAC.

There are two installation options: as a Remote table for live data access, or as a Replication Flow, in which case the data is physically copied into the object store in Datasphere.

Since I want live access, I install it as a Remote Table:

and build a Graphical view of type Fact on top:

Forecast calculation

With my Data Products set up and Sales actual data are available in Databricks, I create a Notebook to calculate the Sales Forecast.

The approach combines Sales and Weather data to train a Linear Regression model. I import the Weather data *https://zenodo.org/records/4770937 from an external server directly into Databricks, select the relevant features from the weather dataset, and combine them with the Sales actual data:

* Klein Tank, A.M.G. and Coauthors, 2002. Daily dataset of 20th-century surface
air temperature and precipitation series for the European Climate Assessment.
Int. J. of Climatol., 22, 1441-1453.
Data and metadata available at http://www.ecad.eu

Using the “sklearn” library, I build and train a Linear regression model:

Once trained, the model predicts the Sales forecast for Rome in June 2026 based on the weather forecast, and I save the results to my Catalog table:

Seamless planning data model

Seamless planning concept is built around physically storing planning data and public dimensions directly in Datasphere, keeping them alongside the actual data.

Since the QRC4 2025 SAC release, it has also been possible to use live versions and bring reference data into planning models without replication.

In this scenario, I build a seamless planning model on top of the Graphical view I created over the Remote table. This lets me use the forecast generated in Databricks as a reference for the final SAC Forecast version.

 

The model setup follows these steps:

Create a new model:

Start with data:

Select Datasphere as the data storage:

From there, I define the model structure and can review the data in the preview.

For a deeper dive into Seamless Planning, I recommend this biX blog.

Process Flow automation

Multi-action triggers Datasphere task chain

The final step is automating the entire forecast generation by using SAC Multi-actions and a Task-Chain in Datasphere – so that my user can trigger the calculation with a single button click from an SAC Story.

The model setup follows these steps:

Create a new model:

Triggering Task Chains from Multi-actions is a recent release. This blog post walks through how to set it up.

For details on how to trigger a Databricks Notebook from Datasphere, I recommend referring to this blog.

With everything in place, I create a Story, add my Seamless planning Model, and attach the Multi-action:

Running the Multi-action triggers the Task Chain, which in turn triggers the Databricks Notebook.

I can monitor the execution details in Datasphere:

and in Databricks:

Once the calculation completes, the updated forecast appears in the Story:

The end-to-end calculation took 2 minutes 45 seconds in total. The Task Chain in Datasphere is triggered almost instantly by the Multi-action, the Databricks Notebook execution itself took 1 minute 29 seconds, with the remaining time spent on Serverless Cluster startup.   

 

From here, I can copy the calculated forecast into a new private version:

adjust the numbers as needed, and publish it as a new public version to Datasphere:

Conclusion

With SAP Business Data Cloud, it is possible to build a forecasting workflow that feels seamless to the end user — even though it spans multiple systems under the hood.

Companies using BW as the main Data Warehouse and Databricks for ML calculations or Data Science tasks can benefit from using the platform, as the data no longer needs to be physically copied out of BW.

What this scenario demonstrates is that once wrapped as a Data Product, BW sales data can be shared with Databricks via the Delta Share protocol. Databricks, in turn, can then create its own Data Products on top of the calculation results and share them back with Datasphere as a Remote Table.

A Seamless Planning model in SAC sits on top of that Remote Table, giving planners live access to the generated forecast. A single Multi-action in an SAC Story ties it all together, triggering a Datasphere Task Chain that kicks off the Databricks Notebook — completing the full cycle in under three minutes.

As SAP Business Data Cloud continues to mature, scenarios like this one are becoming achievable – leaving the complexity in the architecture and not in the workflow.

Ansprech­partner

Ilya Kirzner
Consultant
biX Consulting
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.