Core Data Services (CDS) ABAP

Associations & Parameters

(C) Brandeis Consulting

Dependency Analzer

Darstellung von Abhängigkeiten mit dem CDS Dependency Analyzer

(C) Brandeis Consulting

Parameter in Views

Verwendung als Ausdruck, z.B. in

  • Operatorausdrücken, z.B. Berechnungen
  • Argument in SQL-Funktionen
  • WHERE und ON Bedingungen

Zugriff auf dem Parameter entweder über
$parameters.<parameter> oder mit
:<parameter>

(C) Brandeis Consulting

Parameter erzeugen Funktionen

Da im SQL ein View keine Parameter kennt, werden statt dessen UDF-Funktionen (User-Defined Functions) angelegt. Das können wir in der SQL-Vorschau sehen.

(C) Brandeis Consulting

Annotationen für Parameter

@EndUserText.label: <Beschreibung>

@EndUserText.tooltip: <Tooltip>

@Environment.systemField: //defaultwerte für Parameter
  • #CLIENT liefert sy-mandt
  • #SYSTEM_DATE liefert sy-datum
  • #SYSTEM_TIME liefert sy-uzeit
  • #SYSTEM_LANGUAGE liefert sy-langu
  • #USER liefert sy-uname
  • Nur #CLIENT kann beim Aufruf nicht übersteuert werden
(C) Brandeis Consulting

Client Handling

Per Default ist das Client Handling eingeschaltet und wir brauchen uns um nichts kümmern.

Die Annotation ClientDependent: [true |false] ist obsolet.

Aktuelle Annotation:

ClientHandling.type: [#INHERITED|#CLIENT_DEPENDENT|#CLIENT_INDEPENDENT]

(C) Brandeis Consulting

Client Handling Beispiel

CDS View

@AbapCatalog: { sqlViewName: 'ZJB_DEMO',
                compiler.compareFilter: true,
                preserveKey: true }
                
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Mein erster CDS View'
define view zjb_cds_demo
  as select from    zbc_tasks as t

    left outer join zbc_users as u on t.assignee = u.user_id
{
      // Blockmodus: Alt + Shift + A
      // Pretty Printer: Shift + F1
  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 Firstname,
      u.lastname    as Lastname,
      t.type        as Type      
}

Generiertes SQL Statement___

CREATE OR REPLACE VIEW "ZJB_DEMO" AS SELECT 
  "T"."CLIENT" AS "MANDT", 
  "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 "FIRSTNAME", 
  "U"."LASTNAME" AS "LASTNAME", 
  "T"."TYPE" AS "TYPE"
FROM "ZBC_TASKS" "T" LEFT OUTER JOIN "ZBC_USERS" "U" ON ( 
  "T"."CLIENT" = "U"."CLIENT" AND 
  "T"."ASSIGNEE" = "U"."USER_ID" 
)
(C) Brandeis Consulting

Assoziationen

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

Bild mit Ass

(C) Brandeis Consulting

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

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

AssoziationenBeispiel-Szenario aus Sicht anderer CDS-Objekten

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

(C) Brandeis Consulting

AssoziationenAssoziationen - Kardinalitä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

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