Core Data Services (CDS) ABAP

Associations

(C) Brandeis Consulting

Assoziationen

Eine Assoziation beschreibt eine gerichtete Verbindung zu einem anderen DDiC oder CDS Objekt.

(C) Brandeis Consulting

Beispiel-Szenario

SalesOrderItems

@AbapCatalog.sqlViewName: 'ZV_VDM_SO_I'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'SalesOrderItem'
define view zcds_vdm_so_i as 

select from snwd_so_i as soi

association [1..1] to zcds_vdm_so as _SalesOrder
on soi.parent_key = _SalesOrder.NodeKey

{
    key node_key as NodeKey,
    parent_key as ParentKey,
    so_item_pos as SoItemPos,
...
    currency_code as CurrencyCode,
    gross_amount as GrossAmount,
    net_amount as NetAmount,
    
    //Associations
    _SalesOrder
}

SalesOrder

@AbapCatalog.sqlViewName: 'ZV_VDM_SO'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'SalesOrder'
define view zcds_vdm_so as 

select from snwd_so as so

association [*] to zcds_vdm_so_i as _SalesOrderItem
on so.node_key = _SalesOrderItem.ParentKey

association [1..1] to zcds_vdm_bpa as _Buyer
on so.buyer_guid = _Buyer.NodeKey

{
    key node_key as NodeKey,
    so_id as SoId,
    created_by as CreatedBy,
...
    buy_contact_guid as BuyContactGuid,
    ship_to_adr_guid as ShipToAdrGuid,
    bill_to_adr_guid as BillToAdrGuid,
    
    // Associations
    _SalesOrderItem,
    _Buyer
}
(C) Brandeis Consulting

Beispiel-Szenario aus ABAP Perspektive

ABAP Code

  METHOD if_oo_adt_classrun~main.

    select
    from zcds_vdm_so_i
    fields 
      \_SalesOrder-SoId,
      SoItemPos,
      NetAmount,
      CurrencyCode,
      \_SalesOrder-NetAmount as so_net_amount,
      \_SalesOrder\_Buyer-CompanyName

    into table @data(result)
    UP TO 100 rows .

    out->write( result ).
  ENDMETHOD.
(C) Brandeis Consulting

Beispiel-Szenario aus Sicht anderer CDS-Objekten

Navigation mit Punkt-Notation über mehrere Ecken möglich

(C) Brandeis Consulting

Assoziationen - Kardinalität (Quellkardinalität)

define view zcds_as_so
  as select from snwd_so as so
  association to snwd_bpa as _buyer on so.buyer_guid = _buyer.node_key
  association [1..*] to snwd_so_i as _items on so.node_key = _items.parent_key

Wie oft kommt das assoziierte Ziel vor?

Notation: [<Min>..<Max>] oder [MAX]
Typische Werte:

  • 0
  • 1
  • * - Beliebig viele

Der Default Wert ist [0..1]

Falls die Kardinalität nicht stimmt, kann es passieren, dass der Ausführungsplan nicht gut optimiert wird oder falsche Ergebnis berechnet werden.

(C) Brandeis Consulting

Assoziationen - Neue Syntax für Kardinalität von Quelle und Ziel (seit 2023)

Ab S/4HANA 2023 kann neben der Eckigen Klammer [<Min>..<Max>] die Kardinalität auch als Text angegeben werden:

[many | one | exact one ] to [ many | one | exact one ]

Da die neue Syntax mehr Informationen enthält, kann der Ausführungsplan in speziellen Situationen besser optimiert werden. Wichtig ist, dass die Informationen stimmen, sonst gilt das SISO Prinzip.

Die neue Syntax funktioniert in

  • ABAP CDS für
    • JOIN
    • ASSOCIATON
    • Pfadausdrücken
  • ABAP SQL

SAP Blogpost dazu

(C) Brandeis Consulting

Assoziation - Pfadausdrücke in CDS

_items[1:SoItemPos = '0000000010' ] as _first_item,              --Assoziation zur 1. Position
_items.SoItemPos,                                                --Alle Positionsnummer
_buyer.company_name,                                             --Name des Käufers
_items[*:NetAmount > 1.00 ]._product.category as productCategory --Produktkategorien der Produkte teurer > 1
_items[1: inner where SoItemPos = '0000000060' ].TaxAmount       --Steuerbetrag der 6. Position

Pfadausdrücke können über mehrere Ebenen gehen. Bei Assoziationen mit mehreren Zielobjekten kann man in eckigen Klammern auch filtern. Syntax
[ <Kardinalität> <Joinart> <Filter> ]
Alle Komponenten sind optional

  • Kardinalität gibt die Anzahl der Elemente vom Zielobjekt an
  • Die Joinart kann INNER oder LEFT OUTER sein
  • Der Filter enthält Bedingungen, die mit WHERE beginnen können
(C) Brandeis Consulting

Assoziationen - Pfadausdrücke in ABAP

SELECT
FROM zcds_as_so AS soi
FIELDS \_ITEMS[  (*)  inner where NetAmount > 20000  ]\_PRODUCT-category
INTO  TABLE @DATA(lt_tmp).

Ähnlich wie bei den CDS Pfadausdrücken, aber Assoziationen müssen mit \ beginnen bzw. werden damit getrennt.
Die Kardinalität wird in Klammern angegeben.

(C) Brandeis Consulting

Übungsaufgabe Assoziationen

Legt zwei CDS View Entities mit den folgenden Basistabellen an:

  • ZBC_TASKS - Aufgaben
    • Feld ASSIGNEE ist der Link zum Bearbeiter
  • ZBC_USERS - Benutzer
    • Feld USER_ID entspricht dem ASSIGNEE aus den Aufgaben
  • Erstelle eine Assoziation von den Aufgaben zu den Bearbeitern.
  • Erstelle eine Assoziation von den Benutzern zu den Aufgaben
  • Erstelle eine ABAP Klasse mit dem Interface IF_OO_ADT_CLASSRUN, die die Aufgaben mit Benutzer-Vor -und Nachname darstellt.

Dauer: 15Minuten

(C) Brandeis Consulting