Ansicht
Dokumentation

ABENCDS_SIMPLE_ASSOCIATION_V1 - CDS SIMPLE ASSOCIATION V1

ABENCDS_SIMPLE_ASSOCIATION_V1 - CDS SIMPLE ASSOCIATION V1

ROGBILLS - Synchronize billing plans   PERFORM Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- DDIC-basierte View, ASSOCIATION

... ASSOCIATION $[ [min..max] $] TO target $[AS _assoc$] ON cds_cond
                $[ WITH DEFAULT FILTER cds_cond $] ...


Zusätze:

1. ... [min..max]

2. ... AS _assoc

3. ... WITH DEFAULT FILTER cds_cond

Wirkung

Definition einer CDS-Assoziation des Namens _assoc in einer SELECT-Anweisung einer . Eine CDS-Assoziation assoziiert die aktuelle CDS-View mit einer ON-Bedingung cds_cond als Assoziationsquelle mit dem Assoziationsziel target. Eine Datenquelle target kann eine im ABAP Dictionary definierte DDIC-Datenbanktabelle , eine DDIC-View oder eine CDS-Entität sein. Wenn target eine nicht-SQL-CDS-Entität ist, schränkt dies die Verwendung der CDS-Assoziation ein.

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

  • Wenn eine CDS-Assoziation, deren Assoziationsziel keine abstrakte CDS-Entität oder CDS-Custom-Entität ist, durch einen Pfadausdruck in der SELECT-Liste der aktuellen SELECT-Anweisung exponiert wird, können die folgenden Elemente sie in ihren Pfadausdrücken verwenden.

Wenn eine CDS-View aktiviert wird, die einen Pfadausdruck für den Zugriff auf eine CDS-Assoziation oder ein Element verwendet, oder wenn ein Pfadausdruck für den Zugriff in verwendet wird, wird jede CDS-Assoziation des Pfadausdrucks in einen Join-Ausdruck umgewandelt. Hier stellt die Assoziationsquelle die linke Seite und das Assoziationsziel die rechte Seite dar. Die ON-Bedingung des Joins wird um die ON-Bedingung der Assoziation ergänzt. Standardmäßig hängt der Join-Typ von der Verwendungsstelle des Pfadausdrucks ab:

Bei Verwendung der CDS-Assoziation in einem Pfadausdruck kann diese Einstellung durch die Angabe des Join-Typs überschrieben werden. Ein Pfadausdruck in einer SELECT-Liste, welcher seine abschließende CDS-Assoziation exponiert, wird nicht als Join ausgeprägt. Eine Selbstassoziation, bei der das Assoziationsziel gleich der Assoziationsquelle ist, kann in der CDS-View-, in der sie definiert ist, nicht als Join definiert werden.

Bei der Angabe der ON-Bedingung gelten für die Operanden die folgenden allgemeinen Regeln und Sonderregeln:

  • Felder des Assoziationsziels müssen in der ON-Bedingung den Namen der CDS-Assoziation als durch einen Punkt abgetrennten Präfix _assoc. vorangestellt bekommen.
  • Wenn die CDS-Assoziation in der SELECT-Liste der aktuellen SELECT-Anweisung exponiert wird, müssen die Felder der Assoziationsquelle, die in der ON-Bedingung angegeben sind, auch in der SELECT-Liste aufgeführt sein. Dadurch wird sichergestellt, dass ein Join-Ausdruck aus der CDS-Assoziation gebaut werden kann (bei Verwendung in einem Pfadausdruck).
  • Um sich in der ON-Bedingung auf ein Element der SELECT-Liste zu beziehen, kann dem Feldnamen der Präfix $projection statt des Namens der Assoziationsquelle vorangestellt werden. In diesem Fall kann statt des Feldnamens auch ein mit AS definierter alternativer Elementname angegeben werden. Wenn bei Verwendung des Präfix $projection in der ON-Bedingung ein Pfadausdruck der SELECT-Liste verwendet wird, darf die aktuelle CDS-Assoziation nicht selbst in der SELECT-Liste verwendet werden, um ungültige Join-Ausdrücke zu vermeiden.

Hinweise

  • CDS-Assoziationen, die nicht in der SELECT-Liste aufgeführt sind, können nur in Pfadausdrücken der aktuellen SELECT-Anweisung verwendet werden.
  • Die Syntax zur Definition und Verwendung von CDS-Assoziationen ist eine höherwertige Verschalung der Syntax für Joins. Der Einsatz von CDS-Assoziationen statt der direkten Programmierung von Joins dient der Lesbarkeit der Definition einer CDS-View. Mit Hilfe von CDS-Assoziationen können Beziehungen zwischen CDS-Entitäten modelliert werden, auf die auf einfache Art und Weise über Pfadausdrücke in CDS-Views oder in zugegriffen werden kann.
  • Ein durch eine CDS-Assoziation definierter Join wird bei der Aktivierung einer CDS-View nicht für die Definition der CDS-Assoziation sondern für jede Verwendung in einem Pfadausdruck gebildet. Für eine CDS-Assoziation, die in ihrer CDS-View nicht in einem Pfadausdruck verwendet wird, wird auch kein Join gebildet.
  • Falls eine CDS-Assoziation in einem Pfadausdruck der SELECT-Liste der aktuellen SELECT-Anweisung verwendet wird, wird ein Join für die aktuelle View definiert wobei die ON-Bedingungen der CDS-Assoziation direkt in den Join übernommen werden. Da in der ON-Bedingung eines Joins keine Pfadausdrücke erlaubt sind, kann man sich deshalb bei Verwendung des Präfix $projection in der ON-Bedingung einer CDS-Assoziation nicht auf einen Pfadausdruck der SELECT-Liste beziehen, wenn dort auch die CDS-Assoziation verwendet wird.
  • In einer SELECT-Anweisung einer CDS-View können CDS-Assoziationen und Join-Ausdrücke gemeinsam verwendet werden. Bei der Ausprägung der durch die CDS-Assoziationen definierten Join-Ausdrücken bei deren Verwendung in Pfadausdrücken werden alle Joins miteinander verknüpft.
  • Für CDS-Assoziationen in mit UNION vereinigten SELECT-Anweisungen gelten spezielle Regeln.
  • Bei der Verwendung von CDS-Assoziationen sollten zyklische Abhängigkeiten vermieden werden, um Probleme bei der Massenaktivierung von CDS-Entitäten zu vermeiden.

Zusatz 1

... [min..max]

Wirkung

Definiert die Kardinalität des Assoziationsziels einer mit CDS-Assoziation ASSOCIATION definierten 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:

  • max darf nicht 0 sein.
  • Ein Stern * für max bedeutet beliebig viele Zeilen.
  • min kann weggelassen werden und wird dann auf 0 gesetzt.
  • min darf nicht * sein.
  • Für eine CDS-Assoziation, die in einer WHERE-Bedingung verwendet wird, muss für max 1 angegeben sein.

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

Die Angabe der Kardinalität dient zum einen der Dokumentation der Semantik des Datenmodells, wird zum anderen aber auch von manchen Datenbanksystemen für Optimierungen verwendet. Auf solchen Datenbanksystemen erhalten links äußere Joins (LEFT OUTER JOIN), die bei der Ausprägung eines Pfadausdrucks entstehen, bei einer expliziten oder impliziten Kardinalität "zu 1" einen Zusatz TO ONE und bei anderen Kardinalität einen Zusatz TO MANY. Diese Zusätze wirken wie bei ihrer expliziten Angabe bei einem LEFT OUTER JOIN. D.h. es wird versucht eine Optimierung auszuführen und das Ergebnis kann undefiniert sein, wenn die Ergebnismenge nicht der Kardinalität entspricht.

Hinweise

  • Um undefiniertes und plattformabhängiges Verhalten zu vermeiden, sollte die Kardinalität immer passend zu den zu lesenden Daten definiert werden.
  • Die Angabe der Kardinalität wird von der Syntaxprüfung für Pfadangaben in der CDS DDL von CDS oder in ausgewertet. Eine unpassende Kardinalität führt in der Regel zu einer Warnung von der Syntaxprüfung.

Beispiel

Falsche Angabe der Kardinalität einer CDS-Assoziation. Die folgende CDS-View verknüpft die Datenbanktabellen SCARR und SPFLI in einer CDS-Assoziation _spfli ohne explizite Angabe der Kardinalität. Die implizit gesetzte Kardinalität ist "zu 1". Bei Verwendung der CDS-Assoziation in einer Pfadangabe der SELECT-Liste wird diese auf manchen Datenbanksystemen, wie z.B. der SAP-HANA-Datenbank, als Left-Outer-Join mit dem impliziten Zusatz TO ONE implementiert. Die tatsächliche Kardinalität der Daten ist aber TO MANY.

Das Programm DEMO_CDS_WRONG_CARDINALITY greift mit unterschiedlichen SELECT-Anweisungen auf die View zu. Auf Datenbanksystemen, die versuchen zu optimieren, wie z.B. die SAP-HANA-Datenbank, geben die beiden Zugriffe eine unterschiedliche Anzahl von Zeilen zurück, was eventuell unerwartet ist.

Beispiel

Richtige Angabe der Kardinalität einer CDS-Assoziation. Die folgende CDS-View verknüpft die Datenbanktabellen SCARR und SPFLI in einer CDS-Assoziation _spfli und gibt dabei explizit die Kardinalität an. Bei Verwendung der CDS-Assoziation in einer Pfadangabe der SELECT-Liste wird diese auf manchen Datenbanksystemen, wie z.B. der SAP-HANA-Datenbank, als Left-Outer-Join mit dem impliziten Zusatz TO MANY implementiert, was auch der tatsächlichen Kardinalität der Daten entspricht.

Das Programm DEMO_CDS_EXPLICIT_CARDINALITY greift mit unterschiedlichen SELECT-Anweisungen auf die View zu. Die beiden Zugriffe sollten auf allen Datenbanksystemen die gleiche Anzahl von Zeilen zurückgeben.

Zusatz 2

... AS _assoc

Wirkung

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

Hinweis

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

Beispiel

Beispiel einer einfachen CDS-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 CDS-Assoziation spfli_scarr in der SELECT-Liste durch die Angabe einer Pfadangabe, die nur den Namen einer CDS-Assoziation enthält, für die Verwendung von außen exponiert. Das Programm DEMO_CDS_ASSOCIATION zeigt auch, wie auf die CDS-Assoziation durch eine Pfadangabe in zugegriffen werden kann.

Beispiel

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

Es werden zwei CDS-Assoziationen definiert:

  • _buyer steht für einen Join zwischen der aktuellen View und dem Assoziationsziel snwd_bpa.
  • _invoice_items steht für einen Join zwischen der aktuellen View und dem Assoziationsziel snwd_so_inv_item.

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

Die CDS-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 CDS-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                  //expose assoc _invoice_items
         }
          where _buyer.bp_role = '001';          //usage of assoc buyer

In einem ABAP-Programm kann mit einer einfachen SELECT-Anweisung von 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 CDS-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.

Die zuvor gezeigte CDS-View-Entität sales_order_invoice_header wird als Datenquelle in der Definition der CDS-View-Entität sales_order_invoice_items verwendet. Diese Datenquelle wird für den Zugriff auf die exponierte CDS-Assoziation _invoice_items verwendet. In dieser View wird auf die Elemente der CDS-Assoziation zugegriffen. Es gibt visuelle Hinweise darauf, dass es sich dabei um ein 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 CDS-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 }


Zusatz 3

... WITH DEFAULT FILTER cds_cond

Wirkung

Definiert eine Standardfilterbedingung für einen Pfadausdruck.

  • Wenn bei Verwendung der CDS-Assoziation in einem Pfadausdruck keine Filterbedingung angegeben ist, wird die mit DEFAULT FILTER angegebene Bedingung cds_cond als Filterbedingung verwendet und in eine erweiterte Bedingung für den Join umgesetzt . Für die Standardfilterbedingung gelten die gleichen Regeln wie für eine als Attribut angegebene Filterbedingung.
  • Wenn bei Verwendung der CDS-Assoziation in einem Pfadausdruck eine Filterbedingung angegeben ist, wird diese statt der Standardfilterbedingung verwendet.

Hinweis

Bei der Auswertung einer mit [min..max] angegebenen Kardinalität in der Syntaxprüfung wird die Standardfilterbedingung zusätzlich zur ON-Bedingung berücksichtigt.






SUBST_MERGE_LIST - merge external lists to one complete list with #if... logic for R3up   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 35144 Date: 20240523 Time: 170657     sap01-206 ( 456 ms )