ABAP - Schlüsselwortdokumentation →  ABAP - Dictionary →  ABAP CDS im ABAP Dictionary →  ABAP CDS - Datendefinitionen →  ABAP CDS - DDL-Anweisungen →  ABAP CDS - DEFINE VIEW →  ABAP CDS - SELECT → 

ABAP CDS - SELECT, association

Syntax

... ASSOCIATION [ [min..max] ] TO target [AS _assoc] ON cond_exp ...

Zusätze:

1. ... [min..max]

2. ... AS _assoc

Wirkung

Definition einer Assoziation des Namens _assoc in einer SELECT-Anweisung einer CDS-View der ABAP CDS. Eine Assoziation verknüpft die aktuelle CDS-View als Ausgangsdatenquelle über eine ON-Bedingung cond_exp mit der in der Definition der Assoziation angegebenen Zieldatenquelle target. Eine Datenquelle target kann eine im ABAP Dictionary definierte Datenbanktabelle, eine klassische View, eine externe View oder eine CDS-Entität sein.

Auf eine Assoziation einer SELECT-Anweisung einer CDS-View kann wie folgt zugegriffen werden:

sie in ihren Pfadausdrücken verwenden.

Bei der Aktivierung einer CDS-View mit Pfadausdrücken wird jede dort angegebenen Assoziation in einen Join-Ausdruck verwandelt, wobei die Ausgangsdatenquelle die linke und die Zieldatenquelle die rechte Seite des Joins darstellt und die ON-Bedingung der Assoziation in dessen ON-Bedingung übernommen wird. Standardmäßig hängt die Art des Joins von der Verwendungsstelle des Pfadausdrucks ab:

Diese Einstellung kann bei Angabe der Assoziation in einem Pfadausdruck durch ein Attribut überschrieben werden.

Für die Angabe der ON-Bedingung gelten spezielle Regeln zusätzlich folgender Besonderheiten:

Hinweise

Zusatz 1

... [min..max]

Wirkung

Definiert die Kardinalität der Zieldatenquelle einer mit ASSOCIATION definierten Assoziation einer CDS-View. Die eckigen Klammern [ ] sind Teil der Syntax. Für min und max sind positive ganze Zahlen inklusive 0 oder ein Stern (*) wie folgt möglich:

Wenn die Kardinalität nicht explizit definiert wird, wird implizit eine Kardinalität "zu 1" ([min..1]) verwendet.

Die Angabe der Kardinalität dient hauptsächlich der Dokumentation der Semantik des Datenmodells. Die Kardinalität wird zur Laufzeit nicht validiert kann aber zu Warnungen von der Syntaxprüfung führen.

Hinweis

Die Angabe der Kardinalität wird von der Syntaxprüfung für Pfadangaben in der DDL von CDS oder in Open SQL ausgewertet. Es erfolgt derzeit eine Warnung wenn für max ein Wert größer 1 angegeben ist, d.h., wenn eine Pfadangabe gemäß dieser Angabe die Kardinalität der Ergebnismenge beeinflusst.

Zusatz 2

... AS _assoc

Wirkung

Definiert den Namen _assoc einer mit ASSOCIATION definierten Assoziation einer CDS-View. Falls kein expliziter Name mit AS definiert wird, wird _assoc implizit auf den Namen der Zieldatenquelle gesetzt. Der Name _assoc muss den Namensregeln für Bezeichner folgen.

Hinweis

Als Namenskonvention wird für den Namen einer Assoziation als erstes Zeichen ein Unterstrich _ empfohlen.

Beispiel

Beispiel einer einfachen Assoziation. Die folgende CDS-View liefert das gleiche Ergebnis wie die CDS-View DEMO_CDS_SCARR_SPFLI im Beispiel zu Joins, was im Programm DEMO_CDS_ASSOCIATION durch eine Assertion gezeigt wird. Zusätzlich wird die Assoziation spfli_scarr in der SELECT-Liste durch die Angabe einer Pfadangabe, die nur den Namen einer Assoziation enthält, für die Verwendung von außen veröffentlicht. Das Programm DEMO_CDS_ASSOCIATION zeigt auch, wie auf die Assoziation durch eine Pfadangabe in Open SQL zugegriffen werden kann.

@AbapCatalog.sqlViewName: 'DEMO_CDS_ASSOC'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_association
  (_spfli_scarr, id, carrier, flight, departure, destination )
  as select from spfli
            association [1..1] to scarr as _spfli_scarr
              on $projection.carrid = _spfli_scarr.carrid
     { _spfli_scarr,
       key spfli.carrid,
       key _spfli_scarr.carrname,
       key spfli.connid,
       spfli.cityfrom,  
       spfli.cityto }

Beispiel

Die folgende CDS-View sales_order_invoice_header liefert Informationen zu Rechnungen von Verkäufen und arbeitet dafür mit den Datenbanktabellen snwd_so_inv_head, snwd_so, snwd_bpa, snwd_so_inv_item.

Es werden zwei Assoziationen definiert:

Die in den ON-Bedingungen verwendeten Felder node_key und buyer_guid der Ausgangsdatenquelle sind Teil der SELECT-Liste, wobei statt der Präfixe snwd_so_inv_head bzw. snwd_so_inv_head der empfohlene Präfix $projection verwendet wird.

Die Assoziation _buyer ist nicht in der SELECT-Liste aufgeführt und kann nur in Pfadausdrücken der aktuellen SELECT-Anweisung verwendet werden. Wegen der Kardinalität [1..1] kann sie in der WHERE-Bedingung angegeben werden. Auf die Assoziation _invoice_items wird nicht in Pfadausdrücken der aktuellen SELECT-Anweisung zugegriffen. Sie wird aber in der SELECT-Liste aufgeführt und kann damit in Pfadausdrücken anderer CDS-Views verwendet werden. Wegen der Kardinalität [1..*] kann sie nicht in einer WHERE-Bedingung angegeben werden.

@AbapCatalog.sqlViewName: 'SALESO_INVHDR_VW'
define view sales_order_invoice_header as
  select from snwd_so_inv_head
           inner join snwd_so
             on snwd_so_inv_head.so_guid = snwd_so.node_key
         association [1..1] to snwd_bpa as _buyer
           on $projection.buyer_guid = _buyer.node_key
         association [1..*] to snwd_so_inv_item as _invoice_items
           on $projection.node_key = _invoice_items.parent_key
         { key snwd_so_inv_head.node_key,      //used in assoc _invoice_items
               snwd_so_inv_head.buyer_guid,    //used in assoc _buyer
               snwd_so.so_id as sales_order_id,
               _buyer.bp_id as buyer_id,       //from assoc _buyer
               snwd_so_inv_head.payment_status,
              @Semantics.currencyCode
               snwd_so_inv_head.currency_code,
              @Semantics.amount.currencyCode: 'currency_code'
               snwd_so_inv_head.gross_amount,
               _invoice_items                  //publish assoc _invoice_items
         }
          where _buyer.bp_role = '001';          //usage of assoc buyer

In einem ABAP-Programm kann mit einer einfachen SELECT-Anweisung von Open SQL auf die CDS-View zugegriffen werden.

SELECT sales_order_id, buyer_id, payment_status
       FROM sales_order_invoice_header
       INTO CORRESPONDING FIELDS OF TABLE @itab.

Die Komplexität der eigentlichen Query ist für den Anwendungsprogrammierer transparent in der CDS-View verschalt. Während des Zugriffs wird der durch die Assoziation _invoice_items definierte Join zwischen snwd_so_inv_head und snwd_so_inv_item nicht gebildet, da in keinem Pfadausdruck auf ihn zugegriffen wird.

In der Definition der folgenden CDS-View sales_order_invoice_items wird obige CDS-View sales_order_invoice_header als Datenquelle verwendet, wodurch auf die dort veröffentlichte Assoziation _invoice_items zugegriffen werden kann. In dieser View wird auf die Elemente der Assoziation zugegriffen, ohne dass dabei sichtbar wird, dass es sich tatsächlich um das Ergebnis eines Joins handelt. Dieser Join zwischen snwd_so_inv_head und snwd_so_inv_item wird bei der Aktivierung der CDS-View sales_order_invoice_items erzeugt. Ein Zugriff auf die andere Assoziation _buyer der CDS-View sales_order_invoice_header ist nicht möglich.

@AbapCatalog.sqlViewName: 'SALESO_INVITM_VW'
define view sales_order_invoice_items as
  select from sales_order_invoice_header as header
  { header.sales_order_id,
    header._invoice_items.inv_item_pos as item_position,
   @Semantics.currencyCode
    header._invoice_items.currency_code,
   @Semantics.amount.currencyCode: 'currency_code'
    header._invoice_items.gross_amount }


Weiterlesen
ABAP CDS - path_expr