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

Technischer Name:

  • Bei CDS Views: 2C<Namen des SQL-Views>
  • Bei CDS View Entities: 2C<Namen des CDS-Views>

Aus dem CDS View ZJB_DEMO_CUBE
mit dem SQL-View ZSQL_DEMO_CUBE
wird dann der InfoProvider Name 2CZSQL_DEMO_CUBE

Relevant für

(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: 2CZSQL_DEMO_CUBE/!2CZSQL_DEMO_CUBE

(C) Brandeis Consulting

Struktur von CDS InfoProvidern

Struktur eines CDS InfoProviders

(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

CDS Cube Views - Beispiel

@AbapCatalog.sqlViewName: 'ZSQL_DEMO_CUBE'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Demo Cube'
@Analytics.dataCategory: #CUBE
define view zjb_demo_cube
  as select from /bic/adtsa0062

  association to zjb_material_dim as _material 
              on $projection.material = _material.material
  {
    key doc_number,
    key s_ord_item,
    key calday,

        @ObjectModel.foreignKey.association: '_material'
        cast(material as /bi0/oimaterial preserving type ) as material,
        @DefaultAggregation: #SUM
        @EndUserText.label: 'Menge'
        @Semantics.quantity.unitOfMeasure: 'base_uom'
        quant_b,
        ...
  }
(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