SAP Datasphere Integration: ABAP Cloud Daten in Analytics nutzen

kategorie
Integration
Veröffentlicht
autor
Johannes

SAP Datasphere ist die Nachfolgelösung von SAP Data Warehouse Cloud und bildet das Herzstück der SAP Business Data Fabric. Für ABAP Cloud Entwickler eröffnet sich damit die Möglichkeit, transaktionale Daten für komplexe Analytics-Szenarien bereitzustellen.

SAP Datasphere Grundlagen

SAP Datasphere vereint Data Warehousing, Data Lake, Data Virtualization und Business Semantics in einer integrierten Plattform. Die Architektur basiert auf Spaces, die als isolierte Datenbereiche fungieren.

Kernkonzepte

KonzeptBeschreibung
SpaceIsolierter Arbeitsbereich für Teams
Data BuilderModellierung von Views und Tabellen
Business BuilderSemantische Layer und Kennzahlen
Data Access ControlsBerechtigungen auf Datenebene
ConnectionsAnbindungen an Quellsysteme

Integration mit ABAP Cloud

ABAP Cloud Systeme lassen sich über verschiedene Wege anbinden:

  1. ABAP CDS Extraction: Direkte Extraktion von CDS Views
  2. OData Services: Zugriff über OData-Schnittstellen
  3. Remote Tables: Virtueller Zugriff auf SAP-Systeme
  4. Replication Flows: Geplante Datenreplikation

CDS View Extraction für Datasphere

Die CDS View Extraction ist der empfohlene Weg für ABAP Cloud zu Datasphere. Die Views müssen mit speziellen Annotationen versehen werden.

Extraction-fähige CDS Views

@AbapCatalog.sqlViewName: 'ZSALESORDEREX'
@AbapCatalog.compiler.compareFilter: true
@Analytics.dataCategory: #CUBE
@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.delta.changeDataCapture.automatic: true
define view entity ZI_SalesOrderExtract
as select from zsalesorder as so
association [1..1] to ZI_CustomerMaster as _Customer
on $projection.CustomerId = _Customer.CustomerId
{
@Analytics.dataExtraction.delta.byElement.name: 'ChangedOn'
@Analytics.dataExtraction.delta.byElement.maxDelayInSeconds: 1800
key so.sales_order_id as SalesOrderId,
so.customer_id as CustomerId,
so.order_date as OrderDate,
so.net_amount as NetAmount,
so.currency as Currency,
so.status as Status,
@Semantics.systemDateTime.lastChangedAt: true
so.changed_on as ChangedOn,
@Semantics.systemDateTime.createdAt: true
so.created_on as CreatedOn,
_Customer
}

Wichtige Annotationen für Extraktion

AnnotationBeschreibung
@Analytics.dataExtraction.enabledAktiviert die Extraktion
@Analytics.dataExtraction.delta.changeDataCapture.automaticAutomatische CDC
@Analytics.dataExtraction.delta.byElement.nameFeld für Delta-Erkennung
@Analytics.dataCategoryKategorisierung (#CUBE, #DIMENSION, #FACT)

Analytische CDS Views für Datasphere

Für optimale Analytik sollten CDS Views nach dem Star-Schema modelliert werden.

Dimension View (Kunde)

@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.dataCategory: #DIMENSION
@Analytics.dataExtraction.enabled: true
@ObjectModel.representativeKey: 'CustomerId'
define view entity ZI_CustomerDimension
as select from zcustomer
{
key customer_id as CustomerId,
@Semantics.text: true
customer_name as CustomerName,
country as Country,
region as Region,
city as City,
customer_type as CustomerType,
@Semantics.businessDate.createdAt: true
created_on as CreatedOn
}

Fact View (Umsätze)

@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.dataCategory: #FACT
@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.delta.changeDataCapture.automatic: true
define view entity ZI_SalesFactExtract
as select from zsales_data as sd
association [1..1] to ZI_CustomerDimension as _Customer
on $projection.CustomerId = _Customer.CustomerId
association [1..1] to ZI_ProductDimension as _Product
on $projection.ProductId = _Product.ProductId
association [1..1] to ZI_TimeDimension as _Time
on $projection.SalesDate = _Time.CalendarDate
{
key sd.sales_id as SalesId,
sd.customer_id as CustomerId,
sd.product_id as ProductId,
sd.sales_date as SalesDate,
@Semantics.amount.currencyCode: 'Currency'
@DefaultAggregation: #SUM
sd.revenue as Revenue,
@DefaultAggregation: #SUM
sd.quantity as Quantity,
@DefaultAggregation: #SUM
sd.discount as Discount,
sd.currency as Currency,
@Semantics.systemDateTime.lastChangedAt: true
sd.changed_at as ChangedAt,
_Customer,
_Product,
_Time
}

Cube View (Aggregation)

@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.dataCategory: #CUBE
@Analytics.dataExtraction.enabled: true
define view entity ZI_SalesAnalyticsCube
as select from ZI_SalesFactExtract as Fact
association [1..1] to ZI_CustomerDimension as _Customer
on $projection.CustomerId = _Customer.CustomerId
association [1..1] to ZI_ProductDimension as _Product
on $projection.ProductId = _Product.ProductId
{
key Fact.SalesId,
-- Dimensionen
@ObjectModel.foreignKey.association: '_Customer'
Fact.CustomerId,
@ObjectModel.foreignKey.association: '_Product'
Fact.ProductId,
@AnalyticsDetails.query.axis: #ROWS
Fact.SalesDate,
-- Kennzahlen
@AnalyticsDetails.query.axis: #COLUMNS
@Aggregation.default: #SUM
Fact.Revenue,
@Aggregation.default: #SUM
Fact.Quantity,
@Aggregation.default: #AVG
Fact.Discount,
Fact.Currency,
-- Assoziationen
_Customer,
_Product
}

Delta-Extraktion konfigurieren

Die Delta-Extraktion überträgt nur geänderte Daten nach dem initialen Load. Dies spart Ressourcen und reduziert Latenzen.

Zeitstempel-basierte Delta-Extraktion

@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.delta.byElement: {
name: 'ChangedAt',
maxDelayInSeconds: 3600,
ignoreDeletions: false
}
define view entity ZI_MaterialWithDelta
as select from zmaterial
{
key material_id as MaterialId,
material_name as MaterialName,
base_unit as BaseUnit,
material_type as MaterialType,
@Semantics.systemDateTime.lastChangedAt: true
changed_at as ChangedAt,
deletion_flag as DeletionFlag
}

Change Data Capture (CDC)

Für Echtzeit-nahe Replikation kann automatisches CDC aktiviert werden:

@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.delta.changeDataCapture: {
automatic: true,
rowStatus: 'DELTA_STATUS'
}
define view entity ZI_OrderWithCDC
as select from zorder
association [0..*] to ZI_OrderItemWithCDC as _Items
on $projection.OrderId = _Items.OrderId
{
key order_id as OrderId,
customer_id as CustomerId,
order_date as OrderDate,
order_status as OrderStatus,
@Semantics.systemDateTime.lastChangedAt: true
changed_at as ChangedAt,
-- CDC-Statusfeld
delta_status as DeltaStatus,
_Items
}

CDC-Feldwerte

WertBedeutung
' ' (leer)Unverändert
'U'Update
'I'Insert
'D'Delete

Komplexes Delta-Szenario

@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.delta.changeDataCapture.automatic: true
define view entity ZI_InvoiceExtract
as select from zinvoice as inv
inner join zcustomer as cust
on inv.customer_id = cust.customer_id
{
key inv.invoice_id as InvoiceId,
inv.customer_id as CustomerId,
cust.customer_name as CustomerName,
inv.invoice_date as InvoiceDate,
inv.total_amount as TotalAmount,
inv.currency as Currency,
inv.payment_status as PaymentStatus,
-- Delta-Felder
@Semantics.systemDateTime.lastChangedAt: true
case
when inv.changed_at > cust.changed_at
then inv.changed_at
else cust.changed_at
end as ChangedAt,
-- Berechnetes Löschkennzeichen
case
when inv.deletion_flag = 'X' or cust.deletion_flag = 'X'
then 'X'
else ''
end as DeletionIndicator
}

Berechtigungen für Extraktion

Die Extraktion erfordert spezielle Berechtigungen sowohl im ABAP-System als auch in Datasphere.

ABAP-seitige Berechtigungen

CLASS zcl_datasphere_auth DEFINITION
PUBLIC
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_badi_interface.
METHODS check_extraction_auth
IMPORTING
iv_view_name TYPE sxco_cds_object_name
RETURNING
VALUE(rv_authorized) TYPE abap_bool.
ENDCLASS.
CLASS zcl_datasphere_auth IMPLEMENTATION.
METHOD check_extraction_auth.
" Prüfung auf Extraktionsberechtigung
DATA: lv_auth_check TYPE abap_bool.
" Berechtigungsobjekt prüfen
AUTHORITY-CHECK OBJECT 'Z_DS_EXTR'
ID 'Z_VIEWNAME' FIELD iv_view_name
ID 'ACTVT' FIELD '03'. " Anzeigen
IF sy-subrc = 0.
rv_authorized = abap_true.
ELSE.
rv_authorized = abap_false.
ENDIF.
ENDMETHOD.
ENDCLASS.

Berechtigungsobjekt Definition

" Berechtigungsobjekt Z_DS_EXTR für Datasphere Extraktion
" Felder:
" - Z_VIEWNAME: Name des CDS Views (CHAR 40)
" - ACTVT: Aktivität (01=Erstellen, 02=Ändern, 03=Anzeigen)

CDS Views mit Berechtigungsprüfung

@AccessControl.authorizationCheck: #CHECK
@Analytics.dataExtraction.enabled: true
define view entity ZI_ConfidentialSalesData
as select from zsales_data
{
key sales_id as SalesId,
customer_id as CustomerId,
region as Region,
revenue as Revenue,
profit_margin as ProfitMargin,
currency as Currency,
changed_at as ChangedAt
}

Zugehörige DCL (Data Control Language)

@EndUserText.label: 'Vertriebsdaten Berechtigung'
@MappingRole: true
define role ZI_ConfidentialSalesData {
grant select on ZI_ConfidentialSalesData
where ( Region ) = aspect pfcg_auth(
Z_SD_REGN,
Z_REGION,
ACTVT = '03'
);
}

Technical User für Extraktion

Für die automatische Extraktion wird ein technischer Benutzer benötigt:

CLASS zcl_datasphere_extraction_user DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS get_technical_user
RETURNING
VALUE(rv_user) TYPE syuname.
CLASS-METHODS validate_technical_user
IMPORTING
iv_user TYPE syuname
RETURNING
VALUE(rv_valid) TYPE abap_bool.
ENDCLASS.
CLASS zcl_datasphere_extraction_user IMPLEMENTATION.
METHOD get_technical_user.
" Technischer User für Datasphere Extraktion
rv_user = 'DATASPHERE_EXTRACT'.
ENDMETHOD.
METHOD validate_technical_user.
" Prüfung ob User existiert und aktiv ist
SELECT SINGLE bname FROM usr02
WHERE bname = @iv_user
AND uflag = 0 " Nicht gesperrt
INTO @DATA(lv_user).
rv_valid = xsdbool( sy-subrc = 0 ).
ENDMETHOD.
ENDCLASS.

Live Data Connection vs. Replication

SAP Datasphere bietet zwei grundlegende Integrationsmodi, die jeweils unterschiedliche Anwendungsfälle abdecken.

Live Data Connection (Virtualization)

Bei der Live Data Connection werden Daten nicht kopiert, sondern zur Laufzeit direkt aus dem Quellsystem abgerufen.

Vorteile:

  • Immer aktuelle Daten
  • Kein zusätzlicher Speicherverbrauch
  • Keine Replikationslogik erforderlich

Nachteile:

  • Höhere Latenz bei Abfragen
  • Belastung des Quellsystems
  • Eingeschränkte Transformationsmöglichkeiten

Anwendungsfälle:

  • Stammdaten mit geringem Änderungsvolumen
  • Ad-hoc Abfragen
  • Prototyping und Exploration

Replication (Materialization)

Bei der Replikation werden Daten physisch nach Datasphere kopiert und dort persistiert.

Vorteile:

  • Hohe Abfrageperformance
  • Keine Belastung des Quellsystems
  • Komplexe Transformationen möglich
  • Historisierung möglich

Nachteile:

  • Daten nicht in Echtzeit
  • Zusätzlicher Speicherverbrauch
  • Replikationslogik erforderlich

Anwendungsfälle:

  • Bewegungsdaten mit hohem Volumen
  • Komplexe analytische Abfragen
  • Reporting mit definierten Refresh-Zyklen

Entscheidungsmatrix

KriteriumLive DataReplication
DatenaktualitätEchtzeitVerzögert (Minuten bis Stunden)
PerformanceMittelHoch
Quellsystem-LastHochNiedrig
DatenvolumenKlein bis mittelBeliebig
TransformationenEingeschränktUmfangreich

Hybrides Szenario

-- Stammdaten: Live Connection (immer aktuell)
@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.preferredMode: #VIRTUAL
define view entity ZI_CustomerMasterLive
as select from zcustomer
{
key customer_id as CustomerId,
customer_name as CustomerName,
customer_type as CustomerType,
credit_limit as CreditLimit,
currency as Currency
}
-- Bewegungsdaten: Replikation (hohe Performance)
@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.preferredMode: #REPLICATED
@Analytics.dataExtraction.delta.changeDataCapture.automatic: true
define view entity ZI_SalesHistoryReplicated
as select from zsales_history
{
key sales_id as SalesId,
customer_id as CustomerId,
sales_date as SalesDate,
amount as Amount,
currency as Currency,
changed_at as ChangedAt
}

Konfiguration in Datasphere

Connection Setup

Im Datasphere Data Builder wird die Verbindung zum ABAP-System konfiguriert:

  1. Connection Type: SAP ABAP
  2. System ID: Systemidentifikation (z.B. S4P)
  3. Host: Hostname des ABAP-Systems
  4. Client: Mandant
  5. User/Password: Technischer Benutzer

Remote Table Configuration

Remote Table Settings:
- Source Object: ZI_SalesFactExtract
- Load Type: Initial + Delta
- Delta Frequency: Every 15 minutes
- Memory: Large
- Partitioning: By SalesDate (Monthly)

Data Flow Definition

Für komplexe Transformationen können Data Flows definiert werden:

Source: ZI_SalesFactExtract (Remote Table)
→ Filter: SalesDate >= '20240101'
→ Aggregation: SUM(Revenue) GROUP BY CustomerId, Month
→ Enrichment: LEFT JOIN CustomerMaster
→ Target: Sales_Monthly_Summary (Local Table)

Performance-Optimierung

CDS View Design für Extraktion

-- Optimiert für Extraktion
@AbapCatalog.sqlViewAppendage: {
forSourceViewName: 'ZSALESOPT'
}
@Analytics.dataExtraction.enabled: true
@Analytics.dataExtraction.delta.byElement.name: 'ChangedAt'
define view entity ZI_SalesOptimized
as select from zsales
{
key sales_id as SalesId,
-- Partitionierungsschlüssel früh
@Analytics.dataExtraction.partitionBy: true
sales_date as SalesDate,
-- Filterbare Felder indiziert
@Analytics.dataExtraction.filter: #RECOMMENDED
region as Region,
customer_id as CustomerId,
amount as Amount,
currency as Currency,
@Semantics.systemDateTime.lastChangedAt: true
changed_at as ChangedAt
}

Batch-Größen und Parallelisierung

CLASS zcl_extraction_config DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
CONSTANTS:
c_batch_size TYPE i VALUE 50000,
c_max_parallel_jobs TYPE i VALUE 4,
c_delta_interval TYPE i VALUE 900. " 15 Minuten
CLASS-METHODS get_extraction_params
IMPORTING
iv_view_name TYPE sxco_cds_object_name
RETURNING
VALUE(rs_params) TYPE zcl_extraction_config=>ts_params.
TYPES:
BEGIN OF ts_params,
batch_size TYPE i,
parallel_jobs TYPE i,
delta_interval TYPE i,
use_compression TYPE abap_bool,
END OF ts_params.
ENDCLASS.
CLASS zcl_extraction_config IMPLEMENTATION.
METHOD get_extraction_params.
" View-spezifische Konfiguration
rs_params = VALUE #(
batch_size = c_batch_size
parallel_jobs = c_max_parallel_jobs
delta_interval = c_delta_interval
use_compression = abap_true
).
" Anpassung für große Views
IF iv_view_name CS 'HISTORY' OR iv_view_name CS 'ARCHIVE'.
rs_params-batch_size = 100000.
rs_params-parallel_jobs = 8.
ENDIF.
ENDMETHOD.
ENDCLASS.

Monitoring und Troubleshooting

Extraktion überwachen

CLASS zcl_extraction_monitor DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
METHODS get_extraction_status
IMPORTING
iv_view_name TYPE sxco_cds_object_name
RETURNING
VALUE(rs_status) TYPE zcl_extraction_monitor=>ts_status.
TYPES:
BEGIN OF ts_status,
view_name TYPE sxco_cds_object_name,
last_run TYPE timestampl,
records_total TYPE i,
records_delta TYPE i,
runtime_ms TYPE i,
status TYPE c LENGTH 10,
error_message TYPE string,
END OF ts_status.
ENDCLASS.
CLASS zcl_extraction_monitor IMPLEMENTATION.
METHOD get_extraction_status.
" Beispielhafte Statusabfrage
SELECT SINGLE *
FROM zextraction_log
WHERE view_name = @iv_view_name
ORDER BY timestamp DESCENDING
INTO @DATA(ls_log).
IF sy-subrc = 0.
rs_status = VALUE #(
view_name = ls_log-view_name
last_run = ls_log-timestamp
records_total = ls_log-records_total
records_delta = ls_log-records_delta
runtime_ms = ls_log-runtime_ms
status = ls_log-status
error_message = ls_log-error_message
).
ENDIF.
ENDMETHOD.
ENDCLASS.

Häufige Fehler

FehlerUrsacheLösung
No extraction enabledAnnotation fehlt@Analytics.dataExtraction.enabled: true hinzufügen
Delta field not foundFalsches FeldnameFeldname in byElement.name prüfen
Authorization failedFehlende BerechtigungTechnischen User berechtigen
Timeout during extractionZu große DatenmengeBatch-Größe reduzieren

Best Practices

  1. Modellierung nach Star-Schema: Fact- und Dimension-Views klar trennen
  2. Delta immer aktivieren: Reduziert Last und Transfervolumen
  3. Berechtigungen granular definieren: Nur notwendige Daten exponieren
  4. Performance testen: Vor Go-Live Extraktionszeiten messen
  5. Monitoring einrichten: Fehlerhafte Extraktionen frühzeitig erkennen
  6. Dokumentation pflegen: Views und deren Verwendung dokumentieren

Zusammenfassung

AspektEmpfehlung
StammdatenLive Data Connection
BewegungsdatenReplication mit Delta
BerechtigungenDCL + PFCG kombinieren
PerformancePartitionierung + Indizes
MonitoringRegelmäßige Statusprüfung

Die Integration von ABAP Cloud mit SAP Datasphere eröffnet mächtige Analytics-Möglichkeiten. Mit den richtigen Annotationen, Delta-Strategien und Berechtigungskonzepten lässt sich eine robuste und performante Datenversorgung realisieren.

Verwandte Themen