Information

Please visit our international page to see all the numbers matching your region.

SAP-Praxishandbuch ABAP Core Data Services (CDS) - 2., erweiterte Auflage

SAP-Praxishandbuch ABAP Core Data Services (CDS) - 2., erweiterte Auflage

Idioma

Alemán

Páginas

244

Nivel

Principiante

ISBN

9783960124290

ISBN Imprimir

9783960123972

Libros electrónicos

o acceder a todos los contenidos

Tarifa plana

19 € al mes

  • Licencia única
  • Más de 1000 libros electrónicos y tutoriales en vídeo
  • Acceso instantáneo
  • 12 meses(228 €al año)
  • Renovación automática

Saber más

ABAP Core Data Services (CDS) sind auf komplexe Datenbeschaffungsszenarien bei der Entwicklung klassischer ABAP- wie auch moderner UI-Applikationen ausgerichtet. Die vorliegende zweite Auflage des Praxishandbuchs streift kurz die Grundlagen der Core Data Services, um sich dann ausführlich den CDS-View-Entitäten – Nachfolger der klassischen CDS-Views seit ABAP-Release 7.55 – zuzuwenden. Sie begegnen Erweiterungen für CDS-Entitäten und CDS-Tabellenfunktionen, die speziell für SAP-HANA-Datenbanken entwickelt wurden und eine Verbindung zwischen SQLScript-Abfragen und ABAP-Klassen herstellen. 

Neben dem eigens für CDS entwickelten Berechtigungskonzept nach dem Code-Pushdown-Prinzip erläutert der Autor fortgeschrittene Techniken wie Annotationen, virtuelle Felder und eingebaute Funktionen. Abgerundet wird das Thema durch Einblicke in die Implementierung eines virtuellen Datenmodells zur Datenanalyse in Echtzeit. Speziell für Entwickler gedacht ist der Ausblick auf die CDS-Testumgebung mit der Option, automatisierte Unit-Tests auch für Core Data Services zu nutzen.

  • Core Data Services in S/4HANA On-Premise und in der BTP
  • Code Pushdown
  • Das virtuelle Datenmodell als Alternative zum BW
  • Viele Übungsprogramme für Anfänger und Fortgeschrittene

Ejemplo de lectura

2.1 ABAP Development Tools (ADT)

2.1.1 Installation

Die ABAP Development Tools basieren auf der Eclipse-Entwicklungsumgebung. Diese können Sie unter https://eclipse.org/downloads herunterladen. Bei der Installation wählen Sie zwischen verschiedenen Programmiersprachen (z.B. Java oder C++), wobei ABAP standardmäßig nicht enthalten ist. Um die ABAP-Development-Tools zu installieren, wählen Sie HelpInstall New Software im Menü der Eclipse-IDE (Abbildung 2.1).

Core

Abbildung 2.1: Eclipse-IDE – neue Software installieren

Im zweiten Schritt geben Sie die URL https://tools.hana.ondemand.com/latest in das Feld Work With ein, wählen die ABAP Development Tools in der Liste aus und bestätigen den Schritt mit Next.

Core

Abbildung 2.2: Eclipse-IDE – ADT-URL

Im dritten Schritt installiert die Eclipse-IDE die ABAP Development Tools im Hintergrund. Sie brauchen die Eclipse-IDE nach der Installation nur neu zu starten und können mit der ABAP-Entwicklung beginnen.

2.1.2 Erste CDS-View-Entität erstellen

Um Ihre erste CDS-View-Entität zu erstellen, öffnen Sie die ADT und wählen File • New • Other (siehe Abbildung 2.3).

Core

Abbildung 2.3: CDS-View-Entität erstellen – Schritt 1

Daraufhin öffnet sich der in Abbildung 2.4 gezeigte Dialog, in dem Sie die Kategorie Core Data ServicesData Definition auswählen.

Core

Abbildung 2.4: CDS-View-Entität erstellen – Schritt 2

Im dritten Fenster, das Sie in Abbildung 2.5 sehen, geben Sie das Entwicklungspaket (Package), den technischen Namen sowie die Beschreibung für die Entität ein.

Core

Abbildung 2.5: CDS-View-Entität erstellen – Schritt 3

Im vierten Fenster wählen Sie die Vorlage defineViewEntity (Abbildung 2.6).

Core

Abbildung 2.6: CDS-View-Entität erstellen – Schritt 4

Nun öffnet sich der in Abbildung 2.7 gezeigte Editor. Dieser enthält die CDS-View-Entität in der CDS-Datendefinitionssprache, die Sie, wie bereits erwähnt, in Abschnitt 2.1.3 näher kennenlernen werden.

Core

Abbildung 2.7: ADT-Editor mit CDS-View-Entität

In ABAP-Programmen unterscheidet sich die Handhabung von CDS-View-Entitäten und klassischen Dictionary-Views nicht. Sie können CDS-View-Entitäten folgendermaßen einsetzen:

  • zur Definition von Strukturen oder internen Tabellen
  • als Datenquelle in Open SQL-SELECT-Anweisungen

Die Strukturen und Tabellen können Sie nur in ABAP-Programmen definieren, nicht jedoch im ABAP-Dictionary. Wenn Sie Strukturen oder Tabellentypen im ABAP-Dictionary mit Bezug zu CDS-Entitäten definieren möchten, müssen Sie zu diesem Zweck auf CDS-Views zurückgreifen.

Die Umsetzung von in der CDS-Datendefinitionssprache geschriebenen CDS-View-Entitäten in Datenbank-Views können Sie im ADT-Editor über einen Rechtsklick im Menüpunkt Show SQL CREATE Statement überprüfen (siehe Abbildung 2.8).

Core

Abbildung 2.8: ADT – SQL-CREATE-Anweisung

Mit den Buttons prüfen und aktivieren Sie CDS-View-Entitäten. Sie finden die Buttons mittig in der Menüleiste (Abbildung 2.9). Bei der Aktivierung erzeugt oder ändert das System den entsprechenden Datenbank-View.

Core

Abbildung 2.9: ADT – Menüleiste

Syntaxfehler und Warnungen sehen Sie unterhalb des Editors (Abbildung 1.7).

Core

Abbildung 2.10: ADT – Syntaxprüfung

Nachdem Sie Ihren ersten View mit der Tastenkombination Strg + S gesichert haben, können Sie diesen mit dem Button in der Menüleiste erneut öffnen. Es erscheint der in Abbildung 2.11 gezeigte Dialog, in dem Ihre zuletzt verwendeten Objekte angezeigt werden oder in dem Sie nach bestimmten Objekten suchen können.

Core

Abbildung 2.11: ADT – Dialog zum Öffnen von Entwicklungsobjekten

Wenn Sie ein Objekt suchen, brauchen Sie nur dessen Name in das Suchfeld einzugeben. Die Entwicklungsumgebung gibt automatisch alle Objekte aus (Programme, Klassen, Funktionsgruppen, Datendefinitionen), die dem Suchbegriff entsprechen.

2.1.3 CDS-Datendefinitionssprache

Codebeispiele

Die Codebeispiele in den nachfolgenden Abschnitten basieren auf dem DMO-Namensraum, der die Abwicklung eines Flugbetriebs darstellt, sowie auf Z-Tabellen. Die Codebeispiele sollen dabei nicht die Umsetzung einer konkreten Aufgabe, sondern die Syntax und Verwendung der CDS-Datendefinitionssprache demonstrieren.

Syntax Datendefinition

In diesem Abschnitt möchte ich Ihnen den Teil der CDS-Datendefinitionssprache vorstellen, den Sie für CDS-View-Entitäten benötigen.

Eine CDS-View-Entität leiten Sie mit den Schlüsselwörtern DEFINE VIEW ENTITY ein. An diese Schlüsselwörter schließen sich die folgenden Elemente an:

1. der technische Name der CDS-Entität, den Sie bei der Erstellung gewählt haben (Abbildung 2.5)

2. die Datenquelle, die mit AS SELECT FROM eingeleitet wird dies kann eine einzelne Datenbanktabelle, eine Verknüpfung aus mehreren Datenbanktabellen (ein sogenannter JOIN bzw. eine Assoziation) oder wiederum ein CDS-View/eine CDS-View-Entität sein.

Wie bei Open SQL-SELECT-Anweisungen geben Sie als Nächstes die View-Felder in der Feldliste ein, die Sie mit geschweiften Klammern umschließen. Schlüsselfelder leiten Sie mit dem Schlüsselwort KEY ein. Bei Open SQL-Anweisungen verknüpft das Sonderzeichen »~« die Datenbanktabelle mit dem Feld. Bei CDS-View-Entitäten ersetzen Sie dieses Sonderzeichen durch einen Punkt. Mit dem Schlüsselwort AS können Sie dem Feld einen alternativen Namen (Aliasnamen) geben. In Listing 2.1 bekommt das Feld BOOKING_ID aus der Tabelle /DMO/A_BOOKING_D den Aliasnamen BOOKING_NUMBER.

@EndUserText.label: 'Flight booking' define view entity zcds2_flight_booking as select from /dmo/a_booking_d{ key booking_uuid, carrier_id, connection_id, flight_date, booking_id as booking_number, booking_date } 

Listing 2.1: Einfache CDS-View-Entität »zcds2_flight_booking«

Feldliste mit Stern (*)

CDS-View-Entitäten unterstützen keine Feldlisten mehr, die nur aus einem Stern (*) bestehen. Nur in CDS-Views können Sie den Stern weiterhin verwenden, um alle Felder in den View zu übernehmen.

Die erste Zeile in Listing 2.1 enthält eine sogenannte Annotation. Mit Annotationen definieren Sie während der Entwicklung Metadaten der CDS-View-Entität. In Listing 2.1 enthält die Annotation @EndUserText.label die Kurzbeschreibung der CDS-View-Entität.

Annotationen im Vergleich zu CDS-Views

Wenn Sie mit CDS-Views vertraut sind, werden Sie in Listing 2.1 bemerkt haben, dass folgende Annotationen fehlen:

  • @AbapCatalog.sqlViewName
  • @AbapCatalog.compiler.compareFilter
  • @AbapCatalog.preserveKey

Diese Annotationen sind nur für die Generierung der Dictionary-Views relevant, die der ABAP-Applikationsserver bei CDS-Views im Hintergrund erstellt. Bei CDS-View-Entitäten benötigen Sie sie nicht mehr. Der Compiler wird Ihnen einen Fehler liefern, sobald Sie versuchen, eine der Annotationen in CDS-View-Entitäten einzufügen.

Felddefinitionen

Innerhalb von CDS-View-Entitäten können Sie nicht nur bereits vorhandene Felder aus den Datenquellen übernehmen (siehe Listing 2.1), sondern auch Felder nach eigenen Regeln definieren. Wie Sie später in diesem Abschnitt noch sehen werden, habe ich diese Möglichkeit in Listing 2.19 und Listing 2.21 genutzt. Daher möchte ich Ihnen die Regeln in diesem Abschnitt schon einmal vorstellen:

1. Aggregatsfunktionen:

  • Maximum max( feld )
  • Minimum min( feld )
  • arithmetischer Mittelwert avg( feld )
  • Summe sum( feld )
  • Anzahl count(*)

Die Aggregatsfunktion wird für mehrere Einträge gebildet. Daher ist bei Verwendung einer Aggregatsfunktion immer eine GROUP BY-Klausel notwendig.

2. arithmetische Ausdrücke:

  • Summe feld1 + feld2
  • Subtraktion feld1 − feld2
  • Multiplikation feld1 * feld2
  • Division feld1 / feld2

Die Operanden müssen dabei numerische Felder sein.

3. Fallunterscheidungen: Abhängig vom Wert des Vergleichsfeldes wird der Wert des resultierenden Feldes gebildet (case feld1 when wert1 then resultat1 when wert2 then resultat2 else resultat3 end). Den Wert des resultierenden Feldes können Sie dabei aus den in dieser Liste aufgeführten Regeln festlegen. Dies kann beispielsweise ein arithmetischer Ausdruck, eine Aggregatsfunktion oder eine geschachtelte Fallunterscheidung sein.

4. Konvertierungen zwischen Dictionary-Typen, beispielsweise vom Typ Dezimalzahl in den Typ Gleitkommazahl (cast( feld1 as abap.fltp )).

Listing 2.2 zeigt die Syntax der Aggregatsfunktionen Summation (sum( price )), Maximum (max( price )), Minimum (min( price)), arithmetischer Mittelwert (avg( price as abap.curr(16, 2) )) und Anzahl (count(*)):

@EndUserText.label: 'Aggregat functions' define view entity zcds2_aggregat_functions as select from /dmo/flight { key carrier_id, key connection_id, currency_code, @Semantics.amount.currencyCode : 'currency_code' sum( price ) as sum_price, @Semantics.amount.currencyCode : 'currency_code' max( price ) as max_price, @Semantics.amount.currencyCode : 'currency_code' min( price ) as min_price, @Semantics.amount.currencyCode : 'currency_code' avg( price as abap.curr(16, 2) ) as avg_price, count(*) as flight_count } group by carrier_id, connection_id, currency_code 

Listing 2.2: Felddefinitionen mittels Aggregatsfunktionen

Listing 2.3 zeigt die Syntax für:

1. arithmetische Ausdrücke (seats_max – seats_occupied subtrahiert die Anzahl belegter Sitzplätze von der maximalen Sitzplatzanzahl)

2. Fallunterscheidungen (case plane_type_id when 'A340' then 4 else 2 end gibt vier Triebwerke für den Flugzeugtyp A340 aus, sonst zwei)

3. Konvertierungen (cast( price as abap.fltp ) konvertiert den Preis in eine Gleitkommazahl)

@EndUserText.label: 'Field rules' define view entity zcds2_field_rules as select from /dmo/flight{ key carrier_id, key connection_id, key flight_date, seats_max, seats_occupied, seats_max - seats_occupied as free_seats, plane_type_id, case plane_type_id when 'A340' then 4 else 2 end as engines, cast( price as abap.fltp ) as price_float } 

Listing 2.3: Felddefinitionen mittels arithmetischer Ausdrücke – Fallunterscheidungen und Konvertierungen

Diese Regeln sind schachtelbar. Einen arithmetischen Ausdruck können Sie beispielsweise mit einer Aggregatsfunktion umschließen.

Verknüpfungen aus mehreren Datenbanktabellen

Wie bereits erwähnt, kann eine CDS-View-Entität mehrere Datenbanktabellen als Quellen enthalten. Zur Verknüpfung dieser Datenbanktabellen bestehen folgende Möglichkeiten:

  • INNER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • CROSS JOIN
  • Assoziation

Die Ergebnismenge weist jeweils folgenden Inhalt auf:

  • INNER JOIN: alle Zeilen, die in beiden Tabellen gemeinsam enthalten sind. Abbildung 2.12 zeigt einen INNER JOIN zwischen den Tabellen /DMO/CONNECTION und /DMO/FLIGHT. Die Ergebnismenge enthält die Verbindung AA/100, da sie sowohl in der Tabelle /DMO/CONNECTION als auch in der Tabelle /DMO/FLIGHT vorkommt. Die Verbindung BA/400 ist nicht in der Ergebnismenge enthalten, da Sie in der Tabelle /DMO/CONNECTION, aber nicht in der Tabelle /DMO/FLIGHT vorkommt. Der Flug XS/900/07.01.2025 kommt nicht in der Ergebnismenge vor, da er zwar in der Tabelle /DMO/FLIGHT vorkommt, nicht jedoch in der Tabelle /DMO/CONNECTION.
  • LEFT OUTER JOIN: alle Zeilen, die in der Tabelle der linken Seite enthalten sind. Fehlt die Zeile in der Tabelle der rechten Seite, sind die Felder dieser Tabelle in der Ergebnismenge mit Initialwerten gefüllt. Abbildung 2.13 zeigt einen LEFT OUTER JOIN zwischen den Tabellen /DMO/CONNECTION (linke Seite) und /DMO/FLIGHT (rechte Seite). Die Ergebnismenge enthält alle Zeilen der Tabelle /DMO/CONNECTION. Der Eintrag BA/400 ist beim LEFT OUTER JOIN in der Ergebnismenge mit initialem Flugdatum vorhanden, obwohl die Tabelle /DMO/FLIGHT diese Verbindung nicht enthält.
  • RIGHT OUTER JOIN: alle Zeilen, die in der Tabelle der rechten Seite enthalten sind. Fehlt die Zeile in der Tabelle der linken Seite, enthalten die Felder dieser Tabelle in der Ergebnismenge Initialwerte. Abbildung 2.14 zeigt einen RIGHT OUTER JOIN zwischen den Tabellen /DMO/FLIGHT (linke Seite) und /DMO/CONNECTION (rechte Seite). Diesmal enthält die Ergebnismenge die Verbindung AA/100 sowie den Flug XS/900/07.01.2025. Der Flug XS/900/07.01.2025 ist nur in der Tabelle /DMO/FLIGHT (rechte Seite) vorhanden und daher trotzdem Bestandteil der Ergebnismenge. Die Verbindung BA/400 ist nicht in der Ergebnismenge vorhanden, da sie nicht in der Tabelle /DMO/FLIGHT vorkommt.
  • CROSS JOIN: das Kreuzprodukt aus den Zeilen der Tabelle der linken Seite und rechten Seite.

Core

Abbildung 2.12: INNER JOIN – Ergebnismenge

Core

Abbildung 2.13: LEFT OUTER JOIN – Ergebnismenge

Core

Abbildung 2.14: RIGHT OUTER JOIN – Ergebnismenge

Assoziationen können Sie mithilfe von Pfadausdrücken als INNER JOIN oder als LEFT OUTER JOIN implementieren. Die Definition /dmo/carrier[left outer].carrname in Listing 2.5 stellt einen Pfadausdruck dar. In eckigen Klammern finden Sie die Information, dass die Tabelle /DMO/CARRIER über einen LEFT OUTER JOIN mit der Tabelle /DMO/CONNECTION verknüpft ist, die sich auf der linken Seite der Assoziation befindet.

Wenn Sie auf die Angabe eines Pfadausdrucks (siehe Listing 2.4) verzichten, wandelt das System die Assoziation bei der Aktivierung automatisch in einen LEFT OUTER JOIN um.

@EndUserText.label: 'CDS view with association' define view entity zcds2_flight_plan_association as select from /dmo/connection association to /dmo/carrier on /dmo/carrier.carrier_id = /dmo/connection.carrier_id{ key carrier_id, key connection_id, airport_from_id, airport_to_id, /dmo/carrier.name as carrier_name } 

Listing 2.4: Assoziation ohne Pfadausdrücke

Listing 2.5 zeigt, wie Sie Pfadausdrücke in CDS-View-Entitäten angeben.

@EndUserText.label: 'Association with path' define view entity zcds2_flight_plan_associatio_o as select from /dmo/connection as co association to /dmo/flight as fl on fl.carrier_id = co.carrier_id and fl.connection_id = co.connection_id{ key co.carrier_id, key co.connection_id, max( fl[left outer].flight_date ) as last_flight_date } group by co.carrier_id, co.connection_id 

Listing 2.5: Assoziation mit Pfadausdrücken

In diesem Listing wird die Assoziation zwischen den Tabellen /DMO/CONNECTION und /DMO/FLIGHT bei der Aktivierung in einen LEFT OUTER JOIN umgewandelt. Das heißt, die CDS-View-Entität in Listing 2.5 liefert das gleiche Resultat wie die in Listing 2.6 dargestellte Open SQL-Anweisung:

SELECT co~carrier_id, co~connection_id, max( fl~flight_date ) AS last_flight_date FROM /dmo/connection AS co LEFT OUTER JOIN /dmo/carrier AS fl ON fl~carrier_id = co~carrier_id AND fl~connection_id = co~connection_id GROUP BY co~carrier_id, co~connection_id. 

Listing 2.6: Assoziation mit Open SQL-Anweisungen

Wie in Abbildung 2.8 gezeigt, können Sie die Umsetzung der Assoziationen in SQL-JOINs anhand der SQL-CREATE-Anweisung verifizieren.

Die CDS-View-Entität ZCDS2_FLIGHT_PLAN_ASSOCIATIO_O in Listing 2.5 enthält nur einen Pfadausdruck. Bei mehreren Pfadausdrücken ist es oft wünschenswert, individuelle Bedingungen je Pfadausdruck festzulegen. Aufgrund dessen kann jeder Pfadausdruck neben der JOIN-Definition (INNER, LEFT OUTER) auch eine eigene Filterbedingung (WHERE-Bedingung) enthalten. Die CDS-View-Entität in Listing 2.7, die dies demonstrieren soll, gibt die durchschnittlichen Flugpreise in den Kalenderjahren 2024 und 2025 aus. Hierfür wurden zwei Pfadausdrücke mit individuellen Filterbedingungen verwendet.

@EndUserText.label: 'Association with paths' define view entity zcds2_avg_flight_prices as select from /dmo/connection as co association to /dmo/flight as fl on fl.carrier_id = co.carrier_id and fl.connection_id = co.connection_id{ key co.carrier_id, key co.connection_id, fl.currency_code, @Semantics.amount.currencyCode: 'currency_code' avg( fl[left outer where flight_date between '20240101' and '20241231'].price as abap.curr(16, 2) ) as avg_flight_price_2024, @Semantics.amount.currencyCode: 'currency_code' avg( fl[left outer where flight_date between '20250101' and '20251231'].price as abap.curr(16, 2) ) as avg_flight_price_2025 } group by co.carrier_id, co.connection_id, fl.currency_code 

Listing 2.7: Pfadausdrücke – individuelle Assoziationsbedingungen

Die CDS-View-Entität ZCDS2_AVG_FLIGHT_PRICES in Listing 2.7 liefert das gleiche Resultat wie die in Listing 2.8 dargestellte Open SQL-Anweisung.

SELECT co~carrier_id, co~connection_id, fl24~currency_code, avg( fl24~price ) as avg_flight_price_2024, avg( fl25~price ) as avg_flight_price_2025 FROM /dmo/connection AS co LEFT OUTER JOIN /dmo/flight AS fl24 ON fl24~carrier_id = co~carrier_id AND fl24~connection_id = co~connection_id AND fl24~flight_date BETWEEN '20240101' and '20241231' LEFT OUTER JOIN /dmo/flight AS fl25 ON fl25~carrier_id = co~carrier_id AND fl25~connection_id = co~connection_id AND fl25~flight_date BETWEEN '20250101' and '20251231' GROUP BY co~carrier_id, co~connection_id, fl24~currency_code. 

Listing 2.8: Assoziation mit Open SQL-Anweisungen

Im Vergleich zu klassischen Dictionary-Views, die nur die Möglichkeit des INNER JOIN kennen, bieten Ihnen CDS-View-Entitäten weitaus mehr JOIN-Möglichkeiten.

Assoziationsbedingungen

In den Assoziationsbedingungen können Sie mit dem Schlüsselwort $projection auf ein Element der Feldliste verweisen. Die CDS-View-Entität in Listing 2.9 liefert genau die gleichen Daten wie die Entität ZFLIGHT_PLAN_ASSOCIATION aus Listing 2.4. Nur wurde hier in der Assoziationsbedingung mit $projection.carrier auf die Fluggesellschaft verwiesen.

@EndUserText.label: 'Association with projection' define view entity zcds2_flight_plan_association1 as select from /dmo/connection as co association to /dmo/carrier as ca on ca.carrier_id = $projection.carrier_id{ key co.carrier_id, key co.connection_id, co.airport_from_id, co.airport_to_id, ca.name as carrier_name } 

Listing 2.9: Assoziation mit $projection-Schlüsselwort

Kardinalität

Nach dem Schlüsselwort ASSOCIATION können Sie zu Dokumentationszwecken die Kardinalität der Assoziation in eckigen Klammern angeben. Die Umsetzung der CDS-View-Entität in einen Datenbank-View ist unabhängig von der Kardinalitätsangabe. Die ADT-Syntaxprüfung gibt Ihnen bei einer ungültigen Kardinalitätsangabe nur eine Warnung aus. Listing 2.10 zeigt eine Kardinalitätsangabe.

@EndUserText.label: 'Association with projection' define view entity zcds2_flight_plan_association1 as select from /dmo/connection as co association[0..1] to /dmo/carrier as ca on ca.carrier_id = $projection.carrier_id{ key co.carrier_id, key co.connection_id, co.airport_from_id, co.airport_to_id, ca.name as carrier_name } 

Listing 2.10: Assoziation mit Kardinalitätsangabe

[0..1] bedeutet, dass für jeden Eintrag in der Tabelle /DMO/CONNECTION keinen oder höchstens einen korrespondierenden Eintrag in der Tabelle /DMO/CARRIER existiert.

Folgende Kardinalitäten können Sie vergeben:

  • [0..1] für keinen bis höchstens einen korrespondierenden Eintrag
  • [0..*] für beliebig viele korrespondierende Einträge (einschließlich 0 korrespondierende Einträge)
  • [1..1] für genau einen korrespondierenden Eintrag
  • [1..*] für mindestens einen korrespondierenden Eintrag

UNION-Klauseln

Mit der UNION-Klausel bilden Sie Vereinigungsmengen aus mehreren ähnlichen Datenquellen. Im Gegensatz zu den in vorherigen Abschnitten dargestellten Verknüpfungen definieren Sie bei Bildung einer Vereinigungsmenge keine Assoziations- oder JOIN-Bedingungen. Die Vereinigungsmenge nimmt nacheinander die Datensätze aus den einzelnen Quellen auf.

Zur Bildung einer Vereinigungsmenge müssen die Datenquellen mehrere gemeinsame Felder besitzen. Und die Feldlisten, die innerhalb der CDS-View-Entitäten für jede Datenquelle definiert werden, müssen den folgenden Voraussetzungen genügen:

  • Die Anzahl Felder ist in jeder Feldliste identisch.
  • Die Felder müssen auf denselben Positionen identische Dictionary-Typen besitzen.

Position meint in diesem Zusammenhang die Spalte. Spalte 1 entspricht Position 1, Spalte 2 Position 2 etc.

Als Beispiel dienen die Tabellen /DMO/BOOKING (Listing 2.11) und /DMO/A_BOOKING_D (Listing 2.12), aus denen eine Vereinigungsmenge gebildet werden soll. Die Vereinigungsmenge soll alle Buchungen enthalten – unabhängig davon, ob die einzelne Buchung in der Tabelle /DMO/BOOKING, in der Tabelle /DMO/A_BOOKING_D oder in beiden Tabellen vorhanden ist. Eine Buchung, die in beiden Tabellen vorhanden ist, soll in der Vereinigungsmenge nur einmal vorkommen.

@EndUserText.label : 'Flight Reference Scenario: Booking' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table /dmo/booking { key client : abap.clnt not null key travel_id : /dmo/travel_id not null key booking_id : /dmo/booking_id not null gr_data : include /dmo/booking_data } 

Listing 2.11: Tabelle /DMO/BOOKING

@EndUserText.label : 'Active Booking Persistence for Draft Reference Scenario' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table /dmo/a_booking_d { key client : abap.clnt not null key booking_uuid : sysuuid_x16 not null parent_uuid : sysuuid_x16 booking_id : /dmo/booking_id not null booking_date : /dmo/booking_date customer_id : /dmo/customer_id carrier_id : /dmo/carrier_id connection_id : /dmo/connection_id flight_date : /dmo/flight_date @Semantics.amount.currencyCode : '/dmo/a_booking_d.currency_code' flight_price : /dmo/flight_price currency_code : /dmo/currency_code booking_status : /dmo/booking_status local_last_changed_at : abp_locinst_lastchange_tstmpl } 

Listing 2.12: Tabelle /DMO/A_BOOKING_D

Listing 2.13 zeigt, wie Sie die Vereinigungsmenge mit Open SQL und ABAP bilden können.

SELECT booking_id, booking_date, customer_id, carrier_id, connection_id, flight_date FROM /dmo/booking INTO TABLE @DATA(bookings). SELECT booking_id, booking_date, customer_id, carrier_id, connection_id, flight_date FROM /dmo/a_booking_d APPENDING CORRESPONDING FIELDS OF TABLE @bookings. SORT bookings. DELETE ADJACENT DUPLICATES FROM bookings. 

Listing 2.13: Vereinigungsmenge mit Open SQL

Listing 2.14 zeigt eine CDS-View-Entität zur Bildung der Vereinigungsmenge.

@EndUserText.label: 'Union clause for flight booking' @Metadata.ignorePropagatedAnnotations: true define view entity zcds2_booking_union as select from /dmo/booking{ key booking_id, booking_date, customer_id, carrier_id, connection_id, flight_date } union select from /dmo/a_booking_d{ key booking_id, booking_date, customer_id, carrier_id, connection_id, flight_date } 

Listing 2.14: Vereinigungsmenge mit CDS-View-Entität

Beide Lösungen liefern das gleiche Resultat: In Listing 2.13 liegt dies als interne Tabelle vor, in Listing 2.14 als Datenbank-View.

Wollen Sie doppelte Einträge beibehalten, können Sie die SORT- und die DELETE-ADJACENT-DUPLICATES-Anweisung in Listing 2.13 weglassen. In der CDS-View-Entität aus Listing 2.14 fügen Sie – wie in Listing 2.15 – das Schlüsselwort ALL nach dem Schlüsselwort UNION ein. Doppelte Einträge bleiben damit in der Vereinigungsmenge bestehen.

@EndUserText.label: 'Union clause for flight booking' @Metadata.ignorePropagatedAnnotations: true define view entity zcds2_booking_union as select from /dmo/booking{ key booking_id, booking_date, customer_id, carrier_id, connection_id, flight_date } union all select from /dmo/a_booking_d{ key booking_id, booking_date, customer_id, carrier_id, connection_id, flight_date } 

Listing 2.15: Vereinigungsmenge mit Duplikaten

Support-Team

  • Para obtener más ayuda, visite nuestra documentación o haga clic en Chat.