Core Data Services (CDS) ABAP

Embedded Analytics

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

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

Metadaten des CDS InfoProviders

Transaktion RSRTS_ODP_DIS
Mit dem 2C-Namen

Darstellung eines Infoproviders über Transaktion RSRTS_ODP_DIS

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

Struktur eines CDS InfoProviders

Struktur von CDS InfoProvidern

CDS Cube Views

  • InfoProvider für Kennzahlen - Aggregationsverhalten ist relevant für numerische Werte
  • Dimensionen werden als Assoziationen modelliert
  • Quelle für Queries

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>'

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,

CDS Dimension Views

  • Enthält die Attribute der Dimension
  • Kann zeitabhängig sein
  • Numerische Daten werden nicht aggregiert

CDS Dimension Views - Annotationen

Auf View Ebene

@Analytics.dataCategory: #DIMENSION

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>'

CDS Dimension Views - Annotationen (2)

Weitere Semantische Annotationen

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

CDS Dimension View - Beispiel

@AbapCatalog.sqlViewName: 'SQL_VIEW_NAME'
@EndUserText.label: '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,
      ...
}

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

CDS Text Views - Annotationen

Auf View Ebene

@ObjectModel.dataCategory: #TEXT

Auf Feld Ebene

@ObjectModel.text.element: [ 'Text' ]
@Semantics.text: true - Das Textfeld
@Semantics.language: true - Das Sprachfeld, optional
@Semantics.businessDate.from - Datumsfeld falls zeitabhängig
@Semantics.businessDate.to - dito

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

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
{
    @ObjectModel.text.element: [ 'text' ]
    key pd.node_key as ProductNodeKey,

    @Semantics.language: true
    key tx.language as Language,

    @Semantics.text: true
    tx.text
}

CDS Queries

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

define transient view entity <query name> provider contract analytical_query as projection on <cube name>

CDS Queries - Annotationen auf Viewebene

@Analytics.query: true

@Analytics.settings.zeroValues: { handling:   #HIDE_IF_ALL, // #HIDE, #SHOW
                                  hideOnAxis: #ROWS_COLUMNS // #COLUMNS, #ROWS
}

define transient view entity <query name> 
  provider contract analytical_query 
    as projection on <cube name>
{ 
  ...
}

CDS Queries - Annotationen für Filter-Parameter

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

  @AnalyticsDetails.query:{ hidden: false, 
                          
                            display: #KEY_TEXT }  
  Product

CDS Queries - Annotationen für Merkmale

  
  @UI.textArrangement: #TEXT_ONLY  
  @AnalyticsDetails.query:{ //display:       #KEY,    //#KEY_TEXT, #TEXT
                            axis:          #ROWS,   //#COLUMNS
                            totals:        #HIDE,   //#SHOW
                            hidden:        false,   //Default: false
                            sortDirection: #ASC     //#DESC
  }
  calday

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