
RAP - Festwert-Filter
Wie verwendest du Festwerte aus einer Domäne für einen Filter und passt diesen nach deinen Bedüfnissen in RAP an? Mehr dazu hier.
Inhaltsverzeichnis
In diese Artikel implementieren wir die Werthilfe für das Staging. Dabei wollen wir die Daten direkt beim Laden einschränken und die Möglichkeiten bei der Auswahl reduzieren.
Einleitung
Im letzten Artikel über das Custom Pattern hatten wir das "Staging" Feld eingeführt, ohne es im Detail weiter zu beachten. Hierbei soll es später möglich sein, über das Staging den Stand der Software Komponenten aus verschiedenen Systemen zu ermitteln. Dabei verwenden wir bereits die Domäne ZBS_DEMO_DCP_STAGING für die Typisierung.
In den nächsten Kapiteln legen wir die Wertehilfe an und schränken dann die Möglichkeiten weiter ein.
Wertehilfe
Für die Wertehilfe legen wir einen Core Data Service an, der auf den Standard Views DDCDS_CUSTOMER_DOMAIN_VALUE und DDCDS_CUSTOMER_DOMAIN_VALUE_T basiert. Der erste View ist für die Festwerte, der zweite View für die sprachabhängigen Texte. Dazu bauen wir einen Core Data Service mit Join. Brauchst du eine Vorlage, kannst du bei unseren Code Snippets mal vorbeischauen. Dazu definieren wir zuerst einen neuen Core Data Service, dabei kannst du das Referenzobjekt leer lassen, wichtig wäre die VIEW ENTITY als Template.
Im nächsten Schritt nehmen wir das Template und befüllen die Domäne mit unserem Wert. Auf Ebene der Felder passen wir noch den ALIAS an und sollten damit den aktuellen View erhalten.
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'VH for Staging'
define view entity ZBS_I_CPStagingVH
as select from DDCDS_CUSTOMER_DOMAIN_VALUE(
p_domain_name : 'ZBS_DEMO_DCP_STAGING') as Values
left outer join DDCDS_CUSTOMER_DOMAIN_VALUE_T(
p_domain_name : 'ZBS_DEMO_DCP_STAGING') as Texts
on Texts.domain_name = Values.domain_name
and Texts.value_position = Values.value_position
and Texts.language = $session.system_language
{
key Values.value_low as Staging,
Texts.text as Description
}
Der View erzeugt einen Join über beide Standard Views und übergibt die Domäne als Parameter. In der Join-Bedingung schränken wir auf die aktuelle Sprache ein, um keine Duplikate im Ergebnis zu erhalten. Schauen wir uns den Preview mit F8 an, solltest du nun die beiden Werte sehen.
Einbindung
In diesem Kapitel binden wir die Suchhilfe ein und passen sie entsprechend unseren Bedürfnissen an.
Anzeige
Damit die Suchhilfe nun am Feld bzw. Filter angezeigt wird, ergänzen wir die Annotation "@Consumption.valueHelpDefinition". Damit definieren wir die Wertehilfe und stellen ein Mapping zwischen den Schlüsselfeldern her, wichtig wenn sich diese unterscheiden.
@Consumption.valueHelpDefinition: [ { entity: { name: 'ZBS_I_CPStagingVH', element: 'Staging' } } ]
Schauen wir uns das Feld in der App an, dann kannst du nun die Suchhilfe ausführen und zwischen den Ergebnissen wählen. Somit ist der erste Teil der Anbindung abgeschlossen.
Dropdown
Allerdings wollen wir die Suchhilfe noch weiter auf unsere Anforderungen optimieren. Da wir nur eine kleine Anzahl an Ergebnissen haben, wollen wir die Suche als Dropdown in der Anwendung zur Verfügung stellen. Dazu ergänzen wir den Core Data Service der Wertehilfe um eine Header Annotation.
@ObjectModel.resultSet.sizeCategory: #XS
Prüfen wir nun die Anwendung, dann hat sich die Art der Suchhilfe bereits geändert und wir können per Dropdown die Werte wählen.
Filter
Im nächsten Schritt möchten wir das Verhalten des Filters weiter verändern. Dazu können wir Annotationen der Kategorie "@Consumption.filter" verwenden. Zuerst einmal wollen wir den Filter als Pflichtfeld definieren, dies erreichen wir mit der folgenden Annotation.
@Consumption.filter.mandatory: true
Damit der User nicht immer vor einem leeren Feld steht und dieses erst befüllen muss, wollen wir einen Standardwert für die Anzeige setzen. Dies erreichen wir mit der Annotation, um den Standard TEST vorzubelegen.
@Consumption.filter.defaultValue: 'TEST'
Zum Abschluss wollen wir, dass der User nur einen Wert eingeben kann, damit wir jeweils nur ein System laden und zur Verfügung stellen.
@Consumption.filter.selectionType: #SINGLE
Der Filter ist nun Pflichtfeld, mit einem Wert vorbelegt und es kann jeweils nur ein Wert ausgewählt werden.
Text
Damit der User nun die Festwerte besser zuordnen kann, möchten wir nun noch den Text dazu anzeigen. Dazu erweitern wir den Suchhilfe-View um Annotationen am Schlüsselfeld. Über "@ObjectModel.text.element" geben wir bekannt, welches Feld den Text beinhaltet, über "@UI.textArrangement" definieren wir den Text am Ende, damit der Schlüsselwert vorn steht.
@ObjectModel.text.element: [ 'Description' ]
@UI.textArrangement: #TEXT_LAST
key Values.value_low as Staging,
Prüfen wir nun die Anpassungen in der Anwendung, erhalten wir das finale Ergebnis. Der Filter ist entsprechend definiert und enthält für den User beschreibende Texte.
Logik
Da wir nun entsprechend die UI angepasst haben, müssen wir entsprechend noch die Ermittlung in der Query Klasse anpassen. Da das Feld Staging nun die Ermittlung des Repository verändern soll, aber keinen Einfluss auf die Datenermittlung hat, müssen wir es vor der Datenabgrenzung extrahieren. Dazu lesen wir alle Filter ein und nehmen den ersten Eintrag aus der Range. Im Fehlerfall befüllen wir die Stage mit dem TEST-Kennzeichen.
TRY.
DATA(filters) = request->get_filter( )->get_as_ranges( ).
test_stage = filters[ name = `STAGING` ]-range[ 1 ]-low.
CATCH cx_rap_query_filter_no_range.
test_stage = 'TEST'.
ENDTRY.
Hinweis: Die Erweiterung der Logik ist nur im Zusammenhang mit dem Custom Pattern Beispiel sinnvoll und hat erst einmal nichts mit der Wertehilfe zu tun. Die Logik wird allerdings benötigt, um den Filter von den anderen Werten zu entkoppeln.
Komplettes Beispiel
Das gesamte Beispiel findest du im GitHub Repository und alle in diesem Artikel gemachten Änderungen in diesem Commit. Damit kannst du den aktuellen Stand, sowie alle Änderungen, nachvollziehen.
Generische Version
Möchtest du nicht jede Wertehilfe individuell erstellen, dann hat Andre Fischer von SAP auch eine Lösung für dich. In diesem Beispiel beschreibt er, wie du mit einer Custom Entity und dem Additional Binding eine generische Version davon erstellen kannst, um in Zukunft nicht immer wieder neue Views anlegen zu müssen.
Fazit
Die Wertehilfe für das Staging wurde definiert und es kann jeweils nur ein System zur Anzeige der Software Komponenten gewählt werden. Damit können wir über diesen Filter das Verhalten der App steuern und der User weiß, welches System er auswählen kann.