Bislang war für mich die Erstellung eines CDS basierten OData Service für eine dynamische Fiori Kachel schlicht unmöglich, weil ich ein kleines Details nicht wusste. Der Service benötigt ein Feld namens number, was aber leider ein reserviertes Schlüsselwort ist. Dank eines Blogposts in der SAP Community von Andre Fischer Anfang dieser Woche, ist das aber kein Problem mehr. In diesem Artikel will ich das Vorgehen an einem Beispiel für einen entsprechenden Service aufzeigen.
Was sind dynamische Kacheln
Jede Anwendung in einem Fiori Lauchpad hat eine Kachel zum Starten. Die Texte und Symbole können entweder statisch sein oder dynamisch aus einem OData Service geliefert werden. Typisch sind zum Beispiel Kennzahlen, die groß auf der Kachel angezeigt werden und vielleicht auch noch eine farbliche Hervorhebung haben (rot/grün/gelb).

Das Problem bei Services
Der Service benötigt für die Darstellung der Kennzahl eine Feld mit dem Bezeichner number. Das ist als Feldname in CDS Objekten nicht möglich, weil dann die Syntaxprüfung meldet: "NUMBER" is a reserved word. (choose an other fieldname).

Aber leider benötigen wir exakt diesen Feldnamen. Die SAP Dokumentation ist an dieser Stelle eindeutig. Hier sind alle erlaubten Felder für den Service:
icon- ein SAP Icon in dem Format, wie es uns der SAP IconExplorer liefert , z.B.sap-icon://address-bookinfo- Ein Text unter der KennzahlinfoState- Semantische Farbe für die Info. Erlaubt sind hierNegative(rot),Neutral- der Defaultwert,Positive(grün) undCriticalnumber- Die anzuzeigende KennzahlnumberDigits- Anzahl der Nachkomastellen der KennzahlnumberFactor- Faktor, wie die Kennzahl angezeigt werden soll: k, M, % etc.numberState- Semantische Farbe für die Kennzahl. Erlaubt sindCritical(gelb),Error(rot),Good(grün),Neutral- der Defaultwert undNone.numberUnit- MengeneinheitstateArrow- Trendanzeiger - Erlaubt sindNone,UpundDown.subtitle- Untertitel der Kacheltitle- Titel der Kachel
Alle diese Eigenschaften können aus dem Service versorgt werden. Sie übersteuern die statisch festgelegten Werte, wenn sie von dem Service gliefert werden.
Die Erstellung des dynamischen Service
Die Krux bei der Sache ist also der Name des Feldes mit der Kennzahl im Service. Dieser muss number lauten, was im CDS als Feldname nicht erlaut ist. Mit der Annotation
@odata.property.name: 'Number'
können wir aber einen alternative Feldnamen für eine OData Service festlegen. Damit haben wir dann einen valieden Service, der unsere dynamische Kachel mit Daten versorgt. Hier eine einfaches Beispiel:
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Dynamic Tile DAta'
/*+[hideWarning] { "IDS" : [ "KEY_CHECK" ] }*/
define view entity zc_dynamic_tile
as select from tadir
{
key '1' as KeyField,
'sap-icon://sum' as icon,
concat_with_space(
'seit ',
concat(
concat(
concat(
concat(
right(
dats_add_days(
$session.system_date,
-7,
'NULL'
),
2
),
'.'
),
substring(
dats_add_days(
$session.system_date,
-7,
'NULL'
),
3,
2
)
),
'.'
),
left(
dats_add_days(
$session.system_date,
-7,
'NULL'
),
4
)
),
1
) as info,
case
when count(*) > 20 then 'Good'
when count(*) < 3 then 'Error'
else 'Neutral'
end as infoState,
@OData.property.name: 'number'
count(*) as numberValue,
0 as numberDigits,
'' as numberFactor,
case
when count(*) > 20 then 'Good'
when count(*) < 3 then 'Error'
else 'Neutral'
end as numberState,
'ST' as numberUnit,
'Up' as stateArrow,
concat_with_space(
'von',
$session.user,
1
) as subtitle,
'Anzahl neue Objekte' as title
}
where
author = $session.user
and created_on > dats_add_days(
$session.system_date,
-7,
'NULL'
);
Konfiguration der dynamischen Kachel mit dem CDS basierten OData Service
Auf Basis des CDS -Views habe ich eine Service Definition und ein Service Binding angelegt:
@EndUserText.label: 'Dynamic Tile '
define service Zdynamic_Tile_Service {
expose zc_dynamic_tile as config;
}
Nach der lokalen veröffentlichung habe ich die folgende, relative URL:
/sap/opu/odata/sap/ZDYNAMIC
Der Service muss nur einen Datensatz liefern. Dieser soll nicht als EntitySet sondern als einzelner Datensatz geliefert werden. Dafür wurde der künstliche Schlüssel
key '1' as KeyField,
in den View aufgenommen. Mit der URL
/sap/opu/odata/sap/ZDYNAMIC('1')
bekommen wir genau diesen einen Datensatz. Diese relative URL wird in der Konfiguration der dynamischen Kachel eingetragen:

Da unser Service alle Felder versorgt, müssen die Felder Titel, Untertitel etc. nicht ausgefüllt werden.
Das Ergebnis: Eine dynamische Fiori Launchpad Kachel

Diese Kachel zeigt die Anzahl der Entwicklungsobjekte eines Benutzers an, die er in den letzten 7 Tagen im Objektkatalog (TADIR) angelegt hat. Falls es mehr als 20 Stück sind, wird die Farbe grün angezeigt.
Nützliche Links
SAP Community
How to use reserved words as property names in your OData service?
SAP Dokumentation
Response Values for Dynamic Tiles



