Core Data Services (CDS) ABAP

CDS Extraktoren

Empfehlenswerte Quelle: Der Blog von Simon Kranig

(C) Brandeis Consulting

Extraktorview anlegen

CDS View anlegen mit der Annotation
@Analytics.dataExtraction.enabled: true

Und noch die Datenkategorie festlegen mit
@Analytics.dataCategory: #CUBE
@ObjectModel.dataCategory: #TEXT

@AbapCatalog.sqlViewName: 'ZSQL_EXTRACTOR'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@Analytics.dataCategory: #CUBE
@Analytics.dataExtraction.enabled : true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Extractor for SO Data'
define view zcds_extractor as
  select from snwd_so as so

  left outer join snwd_so_i as soi
  on so.node_key = soi.parent_key

  left outer join snwd_pd as pd
  on soi.product_guid = pd.node_key 
  {
      so.so_id,
      so.created_at,
      ...
  } 
(C) Brandeis Consulting

API Status setzen

API Status auf C1 setzen (nicht immer notwendig)
Eine Darstellung, wie man den API-State zur Freigabe im SAP System setzt

Einschränkung über Berechtigung

(C) Brandeis Consulting

Extraktor aus dem BW heraus Konsumieren

Quellsystem als ODP verbinden

Type ABAP_CDS

Verbindung des Quellsystems als ODP über Eclipse BW-Projekt-View

DataSource anlegen

Replizieren ist nicht notwendig. Der Name des Extraktors entspricht dem SQL-View des CDS Views oder dem Name der CDS View Entity.

Anlegen einer neuen Datenquelle auf dem zuvor hinzugefügten ODP

Auswahl der CDS-View zur Datenextraktion

(C) Brandeis Consulting

Delta Verfahren

Mit Zeitstempel

  • Die Anwendungsdaten enthalten einen Zeitstempel der letzten Änderung.
  • Hilfsweise das letzte Änderungsdatum

Change Data Capture

  • Verfügbar ab SAP S/4HANA Cloud 1905 and SAP S/4HANA 1909 FPS01
  • Basiert auf DB-Triggern wie im SLT
(C) Brandeis Consulting

Delta mit Zeitstempel oder Datum

Falls ein passender Zeitstempel oder Datumsfeld in den Daten ist, wird das Element auf View-Ebene mitgegben:
@Analytics.dataExtraction.delta.byElement.name: <Feldname>

Und in der Feldliste muss das Feld entsprechend mit der Annotation
@Semantics.systemDateTime.lastChangedAt: true oder
@Semantics.systemDate.lastChangedAt: true

versehen sein.

(C) Brandeis Consulting

Sicherheitsintervall beim Delta

Sicherheitsintervall ist per Default ½ Stunde. Das kann geändert werden mit

@Analytics.dataExtraction.delta.byElement.maxDelayInSeconds: 3600

Die Schlüssel und der Hashwert der bereits extrahierten Daten werden gespeichert. Falls wegen des Intervalls ein Wert doppelt vorkommt, wird er mit diesen Informationen wieder entfernt.

Diagramm zur Visualisierung wie die überlappenden Intervalle bei der Delta Extraction abgebildet werden

(C) Brandeis Consulting

Delta mit Löschungserkennung

Wenn Löschungen von Daten mit extrahiert werden sollen, dann kann man die folgende Notation verwenden:

@Analytics.dataExtraction.delta.byElement.detectDeletions: true

Allerdings wird dann bei jeder Extraktion der gesamte Bestand gegen die bereits extrahierten Schlüssel geprüft. Das kann langsam werden. Mit der Annotation

@Analytics.dataExtraction.delta.byElement.ignoreDeletionAfterDays: 30

kann man den Suchbereich von gelöschten Daten einschränken.

(C) Brandeis Consulting

Delta ohne eigenen Timestamp

Falls in den Anwendungsdaten kein Zeitstempel vorhanden ist, kann man auch andere Quellen hinzujoinen, die diese Information halten. Z.B. die Änderungsbelege in CDHDR und CDPOS können als Basis für ein Delta-Verfahren verwendet werden

(C) Brandeis Consulting

Beispiel/Übung - Delta-Verfahren über CDPOS und CDHDR

Legen Sie einen Extraktor für die Adressdaten (Tabelle ADRP) an, der mit einem Delta-Verfahren nur die Änderungen seit dem letzten Load liefert.

Immer wenn sich die Adressdaten (z.B. Vor- und Nachname) über die Transaktion SU01 ändern, wird ein Änderungsbeleg in der CDHDR und CDPOS geschrieben.

(C) Brandeis Consulting

CDHDR, CDPOS und ADRP Daten

CDHDR

MANDANT OBJECTCLAS OBJECTID CHANGENR USERNAME UDATE UTIME TCODE
100 ADRESSE3 BC0100000114050000011325 151598 DEVELOPER 20210301 152830 SU01
100 ADRESSE3 BC0100000114050000011325 151910 JBRANDEIS 20210520 125035 SU01
100 ADRESSE3 BC0100000114050000011325 151911 JBRANDEIS 20210520 125659 SU01
100 ADRESSE3 BC0100000114050000011325 151913 JBRANDEIS 20210520 132602 SU3

CDPOS

MANDANT OBJECTCLAS OBJECTID CHANGENR TABNAME TABKEY FNAME VALUE_NEW VALUE_OLD
100 ADRESSE3 BC0100000114050000011325 151913 ADRP 100000001140500010101 INITIALS R.
100 ADRESSE3 BC0100000114050000011325 151913 ADRP 100000001140500010101 TITLE 2
100 ADRESSE3 BC0100000114050000011325 151911 ADRP 100000001140500010101 INITIALS R.
100 ADRESSE3 BC0100000114050000011325 151911 ADRP 100000001140500010101 NAMEFORMAT 1
100 ADRESSE3 BC0100000114050000011325 151911 ADRP 100000001140500010101 LANGU D
100 ADRESSE3 BC0100000114050000011325 151910 ADRP 100000001140500010101 NAMCOUNTRY DE
100 ADRESSE3 BC0100000114050000011325 151598 ADRP 100000001140500010101 KEY

ADRP

CLIENT PERSNUMBER DATE_FROM NATION DATE_TO TITLE NAME_FIRST NAME_LAST
100 11326 00010101 99991231 TMSADM
100 11328 00010101 99991231 SAP SE
100 11365 00010101 99991231 TRANS
100 11445 00010101 99991231 Peter Heermann
100 11387 00010101 99991231 BWREMOTE
100 11405 00010101 99991231 2 Jörg Brandeis
100 11425 00010101 99991231 MGOERDEL
100 11385 00010101 99991231 ABAP Entwickler
(C) Brandeis Consulting

Delta-Verfahren über CDPOS und CDHDR - Lösung

@AbapCatalog.sqlViewName: 'ZSQL_EXT_CDPOS'
...
@Analytics.dataCategory: #FACT
@Analytics.dataExtraction: { enabled: true,
                             delta: { byElement.name: 'TSTMP' } }

define view zcds_extractor_cdpos
  as select distinct from cdpos as pos
  
    inner join            cdhdr as hdr on  pos.objectclas = hdr.objectclas
                                       and pos.objectid   = hdr.objectid
                                       and pos.changenr   = hdr.changenr
                                       
    inner join       adrp  as ad  on  ad.persnumber = substring( pos.tabkey, 4, 10 )
                                  and ad.date_from  = substring( pos.tabkey, 14, 8 )
{
  key ad.persnumber        as Persnumber,
  key ad.date_from         as DateFrom,

  @Semantics.systemDateTime.lastChangedAt: true
  dats_tims_to_tstmp(hdr.udate,  hdr.utime,  'UTC',  $session.client, 'NULL'  ) as tstmp,
                     
  ad.nation            as Nation,
  ad.date_to           as DateTo,
  ...
}
(C) Brandeis Consulting

CDS Extraktoren - Delta mit Change Data Capture (CDC)

Ab SAP S/4HANA Cloud 1905 and SAP S/4HANA 1909 FPS01 verfügbar.

Konzept

Änderungen (INSERT, UPDATE, DELETEE)auf DB-Ebene werden per Trigger ermittelt und in die ODQ eingestellt.

Dazu werden die Schlüssel der zugehörigen DB-Tabellen auf die Felder des CDS-Views gemappt. Mit den aufgezeichneten Schlüssel werden über den View die betroffenen Datensätze ermittelt und in die ODQ geschrieben.

Dafür müssen alle Schlüsselspalten im CDS-View projeziert werden und es muss ein Mapping vorgenommen werden.

Bei 1:1 Projektionen ohne JOIN ist das ganz einfach, solange die Schlüsselfelder im View vorkommen:
@Analytics.dataExtraction.delta.changeDataCapture.automatic: true

(C) Brandeis Consulting

CDC Mapping bei JOINs im CDS

Falls mehrere Tabellen mit JOINs kombiniert werden, muss das Mapping vorgenommen werden. In der Annotation
@Analytics.dataExtraction.delta.changeDataCapture.mapping:
wird ein Array von Mappingregeln übergeben

 {
    table : <Tabellenname>,
    role : #MAIN|#LEFT_OUTER_TO_ONE,
    viewElement : [Viewfeld1, Viewfeld2, ...],
    tableElement: [DBSchlüsselfeld1, DBSchlüsselfeld2, ...]
}

Die Reihenfolge der Viewfelder muss mit der Reihenfolge der DBSchlüsselfelder übereinstimmen.

(C) Brandeis Consulting