Ansicht
Dokumentation

ABENCDS_F1_ASSOCIATION - CDS F1 ASSOCIATION

ABENCDS_F1_ASSOCIATION - CDS F1 ASSOCIATION

Fill RESBD Structure from EBP Component Structure   Addresses (Business Address Services)  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- SELECT, ASSOCIATION

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


Zusätze:

1. ... [min..max]

2. ... AS _assoc

3. ... WITH DEFAULT FILTER cond_exp

Wirkung

Definition einer CDS-Assoziation des Namens _assoc in einer SELECT-Anweisung einer CDS-View. Eine CDS-Assoziation verknüpft die aktuelle CDS-View als Ausgangsdatenquelle über eine ON-Bedingung cond_exp mit der in der Definition der CDS-Assoziation angegebenen Zieldatenquelle target. Eine Datenquelle target kann eine im ABAP Dictionary definierte Datenbanktabelle , eine Dictionary-View oder eine CDS-Entität sein. Wenn target eine abstrakte 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 Zieldatenquelle nicht abstrakt ist, durch einen Pfadausdruck in der SELECT-Liste der aktuellen SELECT-Anweisung veröffentlicht wird, können

Bei der Aktivierung einer CDS-View, die mit einem Pfadausdruck auf eine CDS-Assoziation oder ein Element zugreift, und bei einem Zugriff mit einem Pfadausdruck in wird jede CDS-Assoziation des Pfadausdrucks in einen Join-Ausdruck verwandelt, wobei die Ausgangsdatenquelle die linke und die Zieldatenquelle die rechte Seite des Joins darstellt und die ON-Bedingung der CDS-Assoziation in dessen ON-Bedingung übernommen wird. Standardmäßig hängt die Art des Joins von der Verwendungsstelle des Pfadausdrucks ab:

  • Hinter FROM ist es ein innerer Join (INNER JOIN)
  • An allen anderen Stellen ist es ein links äußerer Join (LEFT OUTER JOIN)

Diese Einstellung kann bei Angabe der CDS-Assoziation in einem Pfadausdruck durch ein Attribut überschrieben werden. Ein Pfadausdruck in einer SELECT-Liste, welcher seine abschließende CDS-Assoziation veröffentlicht, wird nicht als Join ausgeprägt. Eine Selbstassoziation, bei der die Zieldatenquelle gleich der Ausgangsdatenquelle ist, kann in der CDS-View, in der sie definiert ist, nicht als Join ausgeprägt werden.

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

  • Felder der Zieldatenquelle 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 veröffentlicht wird, müssen Felder der Ausgangsdatenquelle, die in der ON-Bedingung angegeben sind, zusätzlich auch in der SELECT-Liste aufgeführt sein, damit aus der CDS-Assoziation bei Verwendung in einem Pfadausdruck ein Join-Ausdruck gebildet werden kann.
  • 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 Ausgangsdatenquelle 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.
  • CDS-Assoziationen, deren Zieldatenquelle eine abstrakte CDS-Entität ist, können an keiner Stelle verwendet werden, an der es zu einer Ausprägung von Join-Ausdrücken käme.

Zusatz 1

... [min..max]

Wirkung

Definiert die Kardinalität der Zieldatenquelle einer mit ASSOCIATION definierten CDS-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:

  • 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 links äußerer Join mit dem impliziten Zusatz TO ONE ausgeprägt. 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 mit expliziter Angabe der Kardinalität. Bei Verwendung der CDS-Assoziation in einer Pfadangabe der SELECT-Liste wird diese auf manchen Datenbanksystemen, wie z.B. der SAP-HANA-Datenbank, als links äußerer Join mit dem impliziten Zusatz TO MANY ausgeprägt, 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 der Zieldatenquelle 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 veröffentlicht. 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 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 der Zieldatenquelle snwd_bpa.
  • _invoice_items steht für einen Join zwischen der aktuellen View und der Zieldatenquelle snwd_so_inv_item.

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 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                  //publish 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.

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 CDS-Assoziation _invoice_items zugegriffen werden kann. In dieser View wird auf die Elemente der CDS-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 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 cond_exp

Wirkung

Definiert eine Standardfilterbedingung für einen Pfadausdruck.

  • Wenn bei Verwendung der CDS-Assoziation in einem Pfadausdruck in den Attributen attributes keine Filterbedingung angegeben ist, wird die mit DEFAULT FILTER angegebene Bedingung cond_exp 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 in den Attributen attributes 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.






BAL_S_LOG - Application Log: Log header data   General Data in Customer Master  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 33189 Date: 20240523 Time: 155630     sap01-206 ( 382 ms )