
CDS - Parameter
In diesem Artikel schauen wir uns Parameter in Core Data Services an und wie sie dein Leben erleichtern können oder auch erschweren.
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.
Bisher hatten wir CDS View meist wie Tabellen behandelt, wenn es um Selects, Joins oder Einbindungen ging. In diesem Artikel wollen wir dir einen weiteren Aspekt zur Nutzung aufzeigen.
Allgemein
Eine weitere Möglichkeit der Steuerung von Eingaben und Einschränkungen in einem Core Data Service sind die Parameter. Die Parameter werden direkt nach der Definition des CDS Views angegeben und definiert. Wie ein Feld erhalten sie auch einen Datentypen der entweder ein interner Datentyp sein kann oder ein Datenelement aus dem Dictionary. Sobald ein Parameter definiert wurde, wird dieser auch zur Pflichteingabe beim Aufruf des Core Data Service.
Möchtest du einen Parameter verwenden, dann kannst du dazu einen Doppelpunkt verwenden mit dem nachfolgenden Parameternamen oder du arbeitest mit $parameters, um auf alle Parameter des Views zuzugreifen. Wir empfehlen dir die zweite Variante, da du hier eine gute Code Completion bekommst.
Verwendung
Die Parameter werden nach der Definition des Views angelegt, doch wo können sie überall im View verwendet werden? Dazu das folgende Beispiel, dass die verschiedenen Verwendungen aufzeigen soll:
@AbapCatalog.sqlViewName: 'ZBSCDMOPARAM'
@EndUserText.label: 'CDS with parameter'
define view ZBS_C_DmoParameter
with parameters
P_Date : abap.dats,
P_Type : abap.char( 1 ),
P_Field : abap.char( 10 )
as select from ZBS_I_DmoInvoice
{
key DocumentNumber,
DocumentDate,
_Partner.PartnerName,
_Partner.Country,
case $parameters.P_Type
when 'A' then 'New'
when 'B' then 'Old'
else 'Unknown'
end as Status,
$parameters.P_Field as ImportedField
}
where
DocumentDate = $parameters.P_Date
In dem oben gezeigten Szenario gehen wir auf die folgenden Verwendungsszenarien ein:
- Einschränkung der Datenmenge über die Where-Bedingung
- Nutzung in einer Funktion
- Direkte Verwendung als neues Feld
Data-Preview
Entsprechend ändert sich nun der Data-Preview in Eclipse, es werden nicht sofort die Daten des Views angezeigt, sondern wir erhalten im ersten Schritt eine Eingabemaske um die Parameter des Views zu befüllen, bevor die Daten angzeigt werden:
Nach Befüllung der Parameter werden die Daten angezeigt und enthalten die entsprechend übergebenen Werte:
Über die Outlines kannst du die eingegebenen Parameter prüfen und den Datentyp, sowie die Werte, prüfen:
Willst du die Parameter noch einmal ändern, dann findest du im Data-Preview einen entsprechenden Button "Parameter". Mit einem Klick öffnet sich das Eingabefenster und du hast die Möglichkeit die Parameter zu ändern. Das Popup gibt dir auch Hinweise auf die Eingabe des korrekten Formats.
Wiederverwendung
Im nächsten Schritt wollen wir auf dem erzeugten View einen weiteren View setzen, da wir den View als Grundlage für unsere Daten verwenden wollen. Aus diesem Grund müssen wir aber auch die Parameter beim Aufruf versorgen. Der neue View könnte nun wie folgt aussehen:
@AbapCatalog.sqlViewName: 'ZBSCDMOPARAMRE'
@EndUserText.label: 'Reuse with parameters'
define view ZBS_C_DmoParameterReuse
with parameters
P_Date : abap.dats
as select from ZBS_C_DmoParameter(
P_Date : $parameters.P_Date,
P_Type : 'A',
P_Field : 'From Outer'
)
{
key DocumentNumber,
DocumentDate,
Status,
ImportedField
}
Dieses mal implementieren wir nur einen Parameter, den wir von außern in den View geben. Die anderen beiden Parameter versorgen wir mit Festwerten. Beim Select musst du hinter dem Viewnamen die Parameter in einer Klammer versorgen. Beim Aufruf des Data-Preview mit dem gleichen Datum erhalten wir die folgende Sicht:
Select
Im nächsten Schritt binden wir so einen View in ein Programm ein, wie muss so ein View eingebunden werden und wie können die Parameter versorgt werden. Dazu das folgende Beispiel:
SELECT FROM ZBS_C_DmoParameter(
p_date = '20210422',
p_type = 'C',
p_field = 'Program'
)
FIELDS *
INTO table@DATA(lt_parameter).
Die Parameter müssen in Klammern hinter dem Viewnamen angegeben werden, gleichzeitig werden die einzelnen Parameter mit Kommas voneinander abgetrennt. Der Rest des Zugriffs ist Standard ABAP SQL, die Parameter müssen angegeben werden, darauf wird dich auch der Compiler hinweisen.
Vorbelegung
Bestimmte Parameter wollen wir vielleicht mit Systemfeldern vorbelegen, wie zum Beispiel ein Datum, um tagesaktuelle Daten zu bekommen. Dazu können wir eine Annotation verwenden, um die Daten aus der aktuellen Umgebung abzuleiten. In diesem Fall greifen wir auf @Environment.systemfield zu, dazu passen wir unseren Parameter-View einmal an:
@AbapCatalog.sqlViewName: 'ZBSCDMOPARAM'
@EndUserText.label: 'CDS with parameter'
define view ZBS_C_DmoParameter
with parameters
@Environment.systemField: #SYSTEM_DATE
P_Date : abap.dats,
P_Type : abap.char( 1 ),
P_Field : abap.char( 10 )
as select from ZBS_I_DmoInvoice
{
key DocumentNumber,
DocumentDate,
_Partner.PartnerName,
_Partner.Country,
case $parameters.P_Type
when 'A' then 'New'
when 'B' then 'Old'
else 'Unknown'
end as Status,
$parameters.P_Field as ImportedField
}
where
DocumentDate = $parameters.P_Date
Die folgenden Systemvariablen kannst du dabei verwenden und damit Felder vorbelegen:
Hinweis: Wenn Felder mit Standardwerten vorbelegt werden, sind sie keine Pflichtfelder mehr und können bei der Eingabe weggelassen werden.
Fazit
Parameter kommen vor allem im Analytics und Fiori Umfeld zum Einsatz, können aber auch geschickt für Selects eingesetzt werden. Wie sich Parameter verhalten und wo du sie einsetzen kannst, sollte dir nun bekannt sein.