Core Data Services (CDS) ABAP

Syntax Grundlagen & erstes Beispiel

(C) Brandeis Consulting

DDic-Based CDS View vs. CDS View Entity

(C) Brandeis Consulting

(DDic-Based) CDS-Views

Später wurden sie zu DDic-Based CDS Views umbenannt.

  • Bis 7.55 die einzigen CDS Views
  • Obsolet seit 7.57
  • Die SAP hat tausende davon im Virtuellen Datenmodell

==> Auch wenn sie offiziell obsolet sind, werden sie noch viele Jahrzehnte lang verwendet und unterstützt werden

(C) Brandeis Consulting

1 CDS-View - 3 Objekte

  • DDL-Datei - Quelltextdatei, die im ADT in Eclipse angelegt und bearbeitet wird
  • CDS-View - Das CDS-Objekt aus ABAP Perspektive
  • CDS-DDIC-View - Das CDS-Objekt aus DB-Perspektive
    Ansicht in die Tabelle TADIR für eine CDS-View

Blick auf die Artefakte der CDS-View im Eclipse

DDL-Datei

  • Quelltextdatei, die im ADT in Eclipse angelegt und bearbeitet wird
  • Transportierbares Objekt

CDS-View

  • CDS-View aus ABAP Perspektive
  • Generiert aus der DDL Datei
  • Als Zeilentyp im ABAP nutzbar
  • In ABAP SELECT nutzbar
  • CDS Zugriffskontrolle
  • In SE11 als Quelltext
  • In AMDP nicht nutzbar

CDS DDIC View

  • CDS-Datenbankview
  • Datenbankview in der HANA
  • In SE11 als Struktur sichtbar
  • Theoretisch im ABAP nutzbar, aber nicht empfohlen
  • In AMDP nutzbar
(C) Brandeis Consulting

Die Namen der 3 Objekte des DDic-Based CDS-View

Name der DDL-Datei normalerweise gleich dem CDS-View. Der CDS-View ist vor dem ersten Aktivieren noch umbenennbar . Bitte nicht machen…

Namen von CDS View (max. 30 Zeichen) und CDS DDIC/SQL View (max. 16 Zeichen) sind im gleichen Namensraum. Sie müssen also unterschiedlich sein.

Empfehlung: Namenskonvention festlegen

zum Beispiel:

  • ZI_<Name> & ZV_<Name>
(C) Brandeis Consulting

Datenmodell für die Beispiele

Übersicht des Datenmodels für die Beispiele

(C) Brandeis Consulting

Demo - DDic-Based CDS-View anlegen

Bitte erst zuschauen, noch nicht mitmachen!

@AbapCatalog.sqlViewName: 'ZJB_DEMO'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Demo CDS View'
define view zjb_cds_demo
  as select from    zbc_tasks as t
{
  key t.task_key    as TaskKey,
      t.summary     as Summary,
      t.status      as Status,
      t.project     as Project,
      t.description as Description,
      t.assignee    as Assignee,
      t.type        as Type,
      t.author      as Author,
      t.due_date    as DueDate,
      t.priority    as Priority
}
(C) Brandeis Consulting

Übung - DDic-Based CDS-View anlegen

  • Bitte Eure Initialen in den Namen
  • Der Name des Views und SQL-Views muss mit Z beginnen
  • Objekte in $TMP anlegen
  • 10 Minuten Zeit
  • Bei Fragen bitte gleich melden
  • Wer fertig ist, bitte in Zoom grünen Haken setzen
@AbapCatalog.sqlViewName: 'ZJB_DEMO'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Demo CDS View'
define view zjb_cds_demo
  as select from    zbc_tasks as t
{
  key t.task_key    as TaskKey,
      t.summary     as Summary,
      t.status      as Status,
      t.project     as Project,
      t.description as Description,
      t.assignee    as Assignee,
      t.type        as Type,
      t.author      as Author,
      t.due_date    as DueDate,
      t.priority    as Priority
}
(C) Brandeis Consulting

CDS View Entities (1/2)

Das CDS-Konzept wurde mit ABAP 7.55 um sogenannte View Entities erweitert.
SCN Blog 1
SCN Blog 2

Unterschiede

  • es wird kein DDIC-View mehr generiert
  • Der generierte SQL-View heisst genauso wie der CDS-View
  • Es gibt nur einen Namen für DDL-Datei und CDS View
  • Die Aktivierung geht schneller
  • Nur für SAP HANA
  • Mehr Features bei den Ausdrücken
(C) Brandeis Consulting

Übung CDS View Entity mit Join anlegen

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Join '
@ObjectModel.usageType:{
    serviceQuality: #X,
    sizeCategory: #S,
    dataClass: #MIXED
}

define view entity zi_tasks_join
  as select from    zbc_tasks as t

    left outer join zbc_users as u 
      on t.assignee = u.user_id
{
  key t.task_key    as TaskKey,
      t.summary     as Summary,
      t.status      as Status,
      t.project     as Project,
      t.description as Description,
      t.assignee    as Assignee,
      u.firstname   as AssigneeFirstname,
      u.lastname    as AssigneeLastname,
      t.type        as Type,
      t.author      as Author,
      t.due_date    as DueDate,
      t.priority    as Priority
}

---

CDS View Entities (2/2)

Verwendung in Frameworks

Wo bei CDS Views der Name des SQL-Views verwendet wurde, kann bei der CDS View Entity direkt dieser Name verwendet werden:

  • Extraktor Views, bei der Anlagen einer DataSource im BW
  • Name des CDS InfoProviders bzw. der CDS Query mit dem Präfix 2C
  • Bei der Verwendung des Views im AMDP
(C) Brandeis Consulting

Syntax in CDS Views

  • Bezeichner sind nicht case-sensitiv max. 30 Zeichen lang aus
    • Buchstaben
    • Zahlen
    • Unterstrich und Schrägstrich
  • Es ist üblich, Bezeichner ̶m̶i̶t̶ ̶B̶i̶n̶n̶e̶n̶m̶a̶j̶u̶s̶k̶e̶l̶ im CamelCase zu verwenden.
  • Literale
    • Zahlen ohne Punkt als Ganzzahle
    • Mit Punkt als Dezimaltrennzeichen wird ein Float daraus!
    • Zeichenketten mit Hochkomma
  • Kommentare
    • Zeilenendkommentare mit //
    • Blockkommentare mit /*…*/
(C) Brandeis Consulting

Variante der CDS View Syntax

Normale CDS View Syntax

Feldliste nach der FROM-Klausel

@AbapCatalog.sqlViewName: 'ZSQL_WHERE'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Examples for date and time'
define view ZCDS_where
  as select from snwd_so as so
    left outer join snwd_pd as pd 
    on so.buy_contact_guid = pd.node_key
{
    so_id,
    pd.product_id,
    ...
}

Vorteil: Der interessante Teil (FROM-Klausel) steht am Anfang und nicht erst 800 Zeilen weiter unten!

Feldliste vor FROM-Klausel

Nicht empfohlen - genau wie im klassischen SQL

@AbapCatalog.sqlViewName: 'ZSQL_WHERE'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Examples for date and time'
define view ZCDS_where
  as select
    so_id,
    pd.product_id
    ...

  from              snwd_so as so
    left outer join snwd_pd as pd 
    on so.buy_contact_guid = pd.node_key

(C) Brandeis Consulting

Annotationen

Annotationen enthalten zusätzliche Meta-Information. Zum Beispiel für die Verwendung der CDS-Views in unterschiedlichen Frameworks, z.B.

  • @Analytics
  • @Consumption
  • @EnterpriseSearch
  • @ObjectModel
  • @OData
  • @Search
  • @UI-Annotations
  • ...

Zur Generierung des SQL-Views bzw. der DB-Ausführung werden sie überwiegend nicht benötigt.

(C) Brandeis Consulting

Annotationen auf unterschiedlichen Ebenen

CDS Views

@EndUserText.label: 'Extractor for SO Data'
@Analytics.dataExtraction.enabled : true

Beispiel für Parameter

@EndUserText.label: 'Beschreibung des Parameters'
@Environment.systemField: #CLIENT`

Beispiel für Felder

@Semantics.amount.currencyCode: 'CURR'
@Semantics.currencyCode: true

Übersicht, was wo verwendet werden kann

(C) Brandeis Consulting

Annoationen Syntax (1/2) - Pfad

Als direkter Pfad

@Annotation.SubAnnotation.SubSubAnnotation: <Wert>

Mit geschweiften Klammern

@Annotation: { SubAnnotation1: <Wert>,
               SubAnnotation2: { SubSubAnnotation1: <Wert>,
                                 SubSubAnnotation2: <Wert>  } }   
(C) Brandeis Consulting

Annotationen Syntax (2/2) - Wert

Der <Wert> steht hier für:

  • Ein in der Annotation definiertes Symbol, das mit # beginnt, z.B. #CLIENT_HANDLING
  • Ein Zeichenkettenliteral in Hochkomma oder ein numerisches Literal
  • Feldnamen oder Assozationsnamen, in Hochkomma
  • Die logischen Werte true oder false
  • Listen (Arrays) von Dingen werden in Eckigen Klammern dargestellt: ['doc_number', 's_ord_item']

Mit Strg. + <Leertaste> bekommen wir passende Vorschläge

(C) Brandeis Consulting

Annotationen Syntax - Beispiel

define view zcds_Parameter
    with parameters 
    @EndUserText.label: 'Sprache'
    @EndUserText.quickInfo: 'Quick Info zur Sprache'
    @Environment.systemField: #SYSTEM_LANGUAGE  
    p_langu : abap.lang,
    
    @EndUserText: { label: 'Mandant',
                    quickInfo: 'Quick Info zum Mandant' }
    @Environment: {systemField: #CLIENT} 
    p_mandt : abap.clnt(3)
(C) Brandeis Consulting

Vererbung von Annotationen

Die Feld-Annotationen werden von einem Quell-View normalerweise 1:1 übernommen. Das gilt nicht für Annotationen auf View- bzw. auf Parameterebene!

Die folgende Annotation unterdrückt diese Vererbung.

@Metadata.ignorePropagatedAnnotations: true

Bei den CDS View-Entities ist diese Annotation standardmäßig eingeschaltet! Für ein "normales" Verhalten muss man sie ausschalten.

Atypische Feld-Annotationen

Manche Annotationen beziehen sich auf den ganzen View, sollen aber vererbbar sein. Diese sind dann im Bereich der Felder definiert, auch wenn sie sich nicht darauf beziehen. Vor welchem Feld sie stehen ist also eigentlich egal.

Ein bekanntes Beispiele hierfür ist

@UI.facet
(C) Brandeis Consulting

SQL Preview

Im CDS Editor gibt es über das Kontextmenü die Möglichkeit, sich die Definition der CDS-Objektes in SQL anzuschauen.

CDS View in der per Rechtsklick die "Show SQL CREATE Statement" Funktion aufgerufen wird

Ein CREATE-Statement zum Erzeugen der View

(C) Brandeis Consulting

Dependency Analzer

Darstellung von Abhängigkeiten mit dem CDS Dependency Analyzer

(C) Brandeis Consulting