Core Data Services (CDS) ABAP

Embedded Analytics

(C) Brandeis Consulting

Embedded Analytics mit CDS Übersicht

Die CDS InfoProvider Views bilden eine Modellierungschicht, die als Ausgangsbasis für Embedded Analytics im S/4HANA mit CDS Queries dient. Die CDS InfoProvider können aber auch direkt als Quelle für Queries im Query Builder der SAP BW Modelling Tools verwendet werden.

Darstellung wie InfoProvider aufgebaut sind

(C) Brandeis Consulting

Der Name des CDS InfoProvider & Queries

Name des Datenbankviews

Um den Namen der InfoProvider und Queries zu bekommen, brauchen wir immer um den Namen des zugehörigen Datenbankview.

  • DDIC based CDS View: Die Annotation @AbapCatalog.sqlViewName:
  • CDS View Entities: Der Viewname

Präfix 2C

Um die Objekte aus namentlich von den sonstigen BW-Objekten zu unterscheiden, gibt es das Präfix 2C

Der Infoprovider zur CDS View Entity ZI_DEMO_CUBE heisst 2CZI_DEMO_CUBE
Die Query zum DDIC-Based CDS View ZI_DEMO_QUERY wird nach dem zugehörigen SQL-View ZVDEMOQUERY entsprechend 2CZVDEMOQUERY heissen

Verwendung der 2C-Namen

Das ist überall da relevant, wo ein InfoProvider oder Queryname verwendet wird. Unter anderem

(C) Brandeis Consulting

Metadaten des CDS InfoProviders

Transaktion RSRTS_ODP_DIS
Mit dem 2C-Namen

Darstellung eines Infoproviders über Transaktion RSRTS_ODP_DIS

(C) Brandeis Consulting

Ad-Hoc Abfragen auf CDS InfoProvider

In Analysis for Office: Falls noch keine Query existiert, über die Suche gehen.

Im SAP Query Monitor (RSRT) kann man den CDS InfoProvider genauso wie andere BW InfoProvider auch direkt abfragen. Dazu wird in das Query Feld eingegeben:
<InfoProvider>/!<InfoProvider>

Beispiel: 2CZI_DEMO_CUBE/!2CZI_DEMO_CUBE

(C) Brandeis Consulting

Struktur von CDS InfoProvidern

(C) Brandeis Consulting

CDS Cube Views

  • InfoProvider für Kennzahlen - Aggregationsverhalten ist relevant für numerische Werte
  • Dimensionen werden als Assoziationen modelliert
  • Quelle für Queries
(C) Brandeis Consulting

CDS Cube Views - Annotationen

Auf View Ebene

@Analytics.dataCategory: #CUBE

Assoziationen zu den Dimensionen

Für Merkmale mit eigener Dimension ist die Annotation
@ObjectModel.foreignKey.association: '<AssociationName>'
erforderlich

Auf Feldebene

  • @DefaultAggregation: #SUM // #MIN, #MAX, ...
  • @Semantics.quantity.unitOfMeasure: '<Einheitsfeld>'
  • @Semantics.amount.currencyCode: '<Währungsfeld>'
  • @EndUserText.label: '<Feldbeschreibung>'
(C) Brandeis Consulting

Beispiel I_SalesAnalyticsCube aus dem VDM

define view I_SalesAnalyticsCube
...
association [0..1] to   I_Customer  as _Customer  on  $projection.Customer = _Customer.Customer
...
{
//key
  key SalesDocument,
  key SalesDocumentItem, 

//Dimensions
  //Customer
  @ObjectModel.foreignKey.association: '_SoldToParty'
  SoldToParty,      

//Measures
  @DefaultAggregation: #SUM
  @Semantics.quantity.unitOfMeasure: 'BaseUnit'
  OpnSlsOrdsForOrdReltdInvcsQty,
(C) Brandeis Consulting

CDS Dimension Views

  • Enthält die Attribute der Dimension
  • Kann zeitabhängig sein
  • Numerische Daten werden nicht aggregiert
(C) Brandeis Consulting

CDS Dimension Views - Annotationen

Auf View Ebene

@Analytics.dataCategory: #DIMENSION
@ObjectModel.representativeKey: '<Feldname>' - Genau ein Feld!

Zeitabhängigkeit

@Semantics.businessDate.from - Datumsfeld falls zeitabhängig
@Semantics.businessDate.to - dito

Texte für ein Feld

@ObjectModel.text.element: ['<Textfeld>'] - Am Schlüsselfeld
@Semantics.text: true - Am Textfeld

Oder über eine Assoziation:
@ObjectModel.text.association: '<Assoziationsname>'

(C) Brandeis Consulting

CDS Dimension Views - Annotationen (2)

Weitere Semantische Annotationen

@Semantics
z.B. Einheiten, Datumswerte, Adressen etc.

(C) Brandeis Consulting

CDS Dimension View - Beispiel

@AbapCatalog.sqlViewName: 'SQL_VIEW_NAME'
@EndUserText.label: 'Material'

@ObjectModel.representativeKey: 'material'
@Analytics.dataCategory: #DIMENSION
define view zjb_material_dim
  as select from /bi0/pmaterial as dim 
  
  association [0..*] to zjb_material_txt as _MaterialText
           on dim.material = _material_text.material
{
  @ObjectModel.text.association: '_MaterialText'
  key material,  
      changed,      
  @Semantics.systemDate.createdAt: true
      createdon,
      division,
      eanupc,
      ind_sector,
      matl_cat,
      matl_group,
      ...
}
(C) Brandeis Consulting

CDS Text Views

  • Texte zu Attributen
  • Können zeit- und sprachabhängig sein
  • Sind keine InfoProvider - können aber von solchen assoziiert werden.
  • DataCategory nicht über die @Analytics sondern über die @ObjectModel Annotation
(C) Brandeis Consulting

CDS Text Views - Annotationen

Auf View Ebene

@ObjectModel.dataCategory: #TEXT
@ObjectModel.representativeKey: '<Feldname>'

Auf Feld Ebene

@Semantics.text: true - Das Textfeld
@Semantics.language: true - Das Sprachfeld, optional
@Semantics.businessDate.from - Datumsfeld falls zeitabhängig
@Semantics.businessDate.to - dito

(C) Brandeis Consulting

CDS Text View

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Product Text'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.usageType:{  serviceQuality: #X,
                          sizeCategory: #S,
                          dataClass: #MIXED }
                          
@ObjectModel.dataCategory: #TEXT
@ObjectModel.representativeKey: 'ProductNodeKey'

define view entity zcdse_txt_product 
as select from snwd_pd as pd
inner join snwd_texts as tx
on pd.name_guid = tx.parent_key
{
    key pd.node_key as ProductNodeKey,
    @Semantics.language: true
    key tx.language as Language,
    @Semantics.text: true
    tx.text
}
(C) Brandeis Consulting

CDS Queries

  • Die CDS Query erbt sie semantischen Eigenschaften aus den InfoProvidern.
  • Sie legt die Darstellung und den initialen Aufriss der Daten fest.
(C) Brandeis Consulting

CDS Queries - Annotationen auf Viewebene

@Analytics.query: true

@Analytics.settings.zeroValues: { handling:   #HIDE_IF_ALL, // #HIDE, #SHOW
                                  hideOnAxis: #ROWS_COLUMNS // #COLUMNS, #ROWS
}
(C) Brandeis Consulting

CDS Queries - Annotationen für Filter-Parameter

Alternative zu Eingabeparametern. 
  @EndUserText.label: 'Kennzahl (Menge)'
  @Consumption.filter:{ selectionType:      #RANGE,       // #INTERVAL, #SINGLE, #HIERARCHY_NODE
                        multipleSelections: false,
                        mandatory:          true,
                        hidden:             false,
                        defaultValue:       '0000000000011675'  }

  @AnalyticsDetails.query:{ hidden: false, 
                          
                            display: #KEY_TEXT }  
  measure
(C) Brandeis Consulting

CDS Queries - Annotationen für Merkmale

  @AnalyticsDetails.query:{ display:       #KEY,    //#KEY_TEXT, #TEXT
                            axis:          #ROWS,   //#COLUMNS
                            totals:        #HIDE,   //#SHOW
                            hidden:        false,   //Default: false
                            sortDirection: #ASC     //#DESC
  }
  calday
(C) Brandeis Consulting

CDS Queries - Annotationen für Kennzahlen

@AnalyticsDetails.query:{ axis:     #COLUMNS,  //optional - Standard value for keyfigures
                          decimals: 2,         //Decimals
                          scaling:  0,         //Default value - to scale by powers of 10
                          hidden:   false      //true = initialy invisible
}
 quant_b,

  @EndUserText.label: 'Profit'
  @AnalyticsDetails.query:{ formula: '(price_vk - price_vek) * nodim(quant_b)' }
  1 as profit, 

  @EndUserText.label: 'Unterschiedl. Artikel'
  @AnalyticsDetails.exceptionAggregationSteps:
              [{ exceptionAggregationBehavior: #COUNT,
                 exceptionAggregationElements: ['material'] }]
  1 as materialCount
(C) Brandeis Consulting

Performance Tipps bei großen Datenvolumen

  • Keine SQL-Funktionen in JOIN Bedingungen (z.B. LPAD, LTRIM etc. )
  • UNION ALL statt UNION
  • Bei CDS Table Functions
    • keine Imperative Logik, d.h. nur Tabellenvariablen und SELECT Anweisungen
    • Window Functions vermeiden
(C) Brandeis Consulting