
CDS - Aufbau eines Views
In diesem Artikel wollen wir dir den Aufbau und die Funktionsweise eines CDS Views näher bringen. Wie sieht ein View aus und wie funktioniert er.
Inhaltsverzeichnis
Artikel-Update: Seit Release 7.57 (S/4 HANA 2022) ist DEFINE VIEW als obsolet gekennzeichnet, stattdessen solltest du DEFINE VIEW ENTITY verwenden. Diese können an einigen Stellen zu den Beispielen abweichen. Mehr Informationen zu den neuen Views findest du in diesem Artikel.
Die Grundlagen haben wir in den ersten drei Artikeln der Serie gelegt, heute geht es darum wie du mit Eclipse deinen ersten View erzeugst. Weiterhin wollen wir dir zeigen was in so einem View schon einmal funktioniert und wie du die entsprechenden Element ansteuerst und verwendest.
Datenmodell
Am aktuellen Datenmodell für unsere Demos arbeiten wir noch, wir werden es dir aber noch zeitnah in einem Aritkel vorstellen und wie wir dabei vorgegangen sind. Für die heutigen Beispiele verwenden wir aber schon einmal die erste Tabelle aus dem Modell. Die Tabelle sieht wie folgt aus:
Sie enthält Daten für unsere Geschäftspartner mit denen wir handeln. Dabei haben wir in die Tabelle bereits erste Datensätze eingefügt um Stammdaten zur Verfügung zu haben:
Eclipse
Die Anlage von Core Data Services kann nur mit Eclipse und den ABAP Development Tools (ADT) durchgeführt werden. In SAP ist lediglich eine Anzeige des Views möglich, aber keine Anlage oder Änderung, dies ist aber abhängig vom Release des Systems.
Der einfachste Weg einen CDS View für eine Tabelle anzulegen ist dabei das Kontext-Menü der Tabelle im Project Explorer. An Hand des Kontextes leitet das Tool ab, welche Aktionen wir mit dem Objekt oder in diesem Bereich durchführen können.
Nach Auswahl der Aktion "New Data Definition" hast du nun die Möglichkeit weitere Informationen zum Objekt zu befüllen, das System hat bereits das Referenzobjekt an Hand des Kontextes vorbefüllt. Den Namen des CDS Views kannst du in CamelCase hinterlegen. Wie du bereits im virtuellen Datenmodell gelernt hast, wollen wir erst einmal einen klassichen Interface oder Basic View definieren.
Nach Auswahl des Transportauftrags können nun verschiedene Templates gewählt werden, je nachdem was für einen View du definieren möchtest. In diesem Fall reicht ein einfacher View für die Tabelle.
Interface View
Das Ergebnis der Generierung ist ein fast vollständiger Core Data Service der nun das folgende Format hat. Wobei wir mit der Arbeit noch nicht ganz fertig sind, sondern es sich um ein erstes Template handelt.
@AbapCatalog.sqlViewName: ''
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Interface for Partner'
define view ZBS_I_DmoPartner as select from ZBS_DMO_PARTNER {
key partner,
name,
street,
city,
country,
payment_currency
}
Um den View zu aktivieren müssen wir noch ein paar Informationen hinterlegen. Die Annotation "@AbapCatalog.sqlViewName" muss noch befüllt werden, hier verlangt das System einen Namen für den DDIC View, der am Ende im System generiert wird. Im Gegensatz zum CDS Namen, ist dieser Name nur 16-stellig, wie alle Views und Datenbanktabellen. Weiterhin legen wir noch für die Felder Aliase an und entfernen die Unterstriche aus den Namen. Im Ergebnis sieht dann der View wie folgt aus.
@AbapCatalog.sqlViewName: 'ZBSIDMOPARTNER'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Interface for Partner'
define view ZBS_I_DmoPartner
as select from zbs_dmo_partner
{
key partner as PartnerNumber,
name as PartnerName,
street as Street,
city as City,
country as Country,
payment_currency as PaymentCurrency
}
Die ersten 5 Zeilen sind steuernde Annotationen die Grundeinstellungen des Views definieren. Mit "define view" definieren wir den Namen des neuen CDS Views und der SELECT zeigt die Herkunft der Daten. In diesem Fall machen wir einen SELECT von der Tabelle ZBS_DMO_PARTNER. Zwischen den geschweiften Klammern wird die Feldliste definiert. Ein Core Data Service sollte aber ebenso einen Schlüssel haben, hier spielt es aber keine Rolle, ob es sich um den Schlüssel der Datenbank handelt. Mit dem Schlüssel definieren wir die eindeutigen Datensätze, die der View zurückgibt. In der Feldlist haben wir die Möglichkeit noch entsprechende Aliase zu hinterlegen.
Hinweis: Das es sich um den Interface bzw. Basic View handelt, haben wir auch noch die Möglichkeit die Felder in englische Langnamen umzuwandeln und so unser Datenmodell noch sprechender zu machen.
Consumption View
Im zweiten Schritt können wir für unseren Interface View einen Consumption View definieren. Dazu kannst du wieder über das Kontext-Menü auf dem View eine neue Data Definition anlegen. Als Template kannst du das gleiche wie für den Interface View verwenden. Anforderung an den View sind alle Partner aus Europe. Der View könnte nun wie folgt aussehen:
@AbapCatalog.sqlViewName: 'ZBSCDMOPAREUROPE'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Partner in Europe'
define view ZBS_C_DmoPartnerEurope
as select from ZBS_I_DmoPartner
{
key PartnerName,
City,
Country
}
where
Country = 'DE'
or Country = 'CH'
Im Gegensatz zum Interface View hat dieser View als Datenquelle einen anderen Core Data Service. Wir verwenden nur eine eingeschränkte Menge von Feldern und definieren auch einen komplett anderen Schlüssel. Nach den geschweiften Klammern arbeiten wir mit einer WHERE Bedingung um die Daten einzuschränken. Das gleiche Ergebnis können wir aber auch mit einem einfachen SELECT auf den Interface View erreichen:
SELECT FROM zbs_i_dmopartner
FIELDS partnername, city, country
WHERE country = 'DE' OR country = 'CH'
INTO TABLE @DATA(lt_view_data).
Der Unterschied ist aber, dass wir unseren Consumption View auch an verschiedenen Stellen wiederverwenden können und im Anpassungsfall nur diesen View ändern müssen.
Fazit
Die Anlage eines ersten CDS Views ist nicht besonders schwer und Eclipse mit den ADTs unterstützt dich dabei. Die Views sind auf Wiederverwendbarkeit ausgelegt, sodass auch Eingrenzungen der Datenmenge mit in den View übernommen werden können und diese nur an einer Stelle gepflegt werden müssen.