RAP - Popup Pflichtfelder
Wie kannst du eigentlich Pflichtfelder für ein Popup in RAP definieren? In diesem Artikel werden wir etwas genauer auf die Details eingehen.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns an, wie wir für unsere Excel Upload Action weitere Pflichtfelder definieren und diese dann validieren können. Dazu schauen wir uns verschiedene Lösungen an.
Einleitung
In diesem Beispiel werden wir unsere App für das Report Pattern erweitern. Normalerweise definierst du Pflichtfelder innerhalb der Verhaltensdefinition, wenn es um Felder des RAP Business Objekts geht. Doch wie würde das für das Popup in unserer Aktion funktionieren?
Problem
Wenn wir unsere Excel Datei laden, zeigen wir im ersten Schritt ein Popup an, wo der Anwender noch einmal zusätzliche Informationen hinterlegen kann. Problem ist allerdings, dass die Felder keine Pflichtfelder sind und damit auch leer gelassen werden können.
Grundsätzlich steht dir die Annotation "@ObjectModel.mandatory" zur Verfügung, diese ist aber nicht für ABAP Cloud freigegeben und damit können in der Entität keine Pflichtfelder mehr über die Annotation gesetzt werden. Da wir einen nachhaltigen und langfristigen Weg benötigen, schauen wir uns zwei Lösungen an.
Lösung
Hier findest du zwei Lösungsvorschläge, um das gewünschte Ergebnis zu erzielen und den User zur Eingabe der Felder zu bekommen.
Prüfung
Eine einfache Möglichkeit ist die Überprüfung der Pflichtangaben vor der eigentlichen Ausführung der Aktion. Bedeutet wir führen die Validierung als ersten Schritt durch, bevor wir dann die folgende Logik ausführen. Dazu erweitern wir die Verhaltensimplementierung der Methode "LoadExcelContent".
IF ls_key-%param-EventComment IS INITIAL.
INSERT new_message( id = 'ZBS_DEMO_RAP_PATTERN'
number = '008'
severity = if_abap_behv_message=>severity-error )
INTO TABLE reported-%other.
RETURN.
ENDIF.
Ist das Feld EventComment leer, dann geben wir eine Fehlermeldung aus und verlassen die aktuelle Logik bzw. die Methode komplett. Allerdings können wir den "TestRun" nicht validieren, da auch leer ein Ergebnis ist. Als Ergebnis erhalten wir im ersten Schritt eine Warnmeldung aus dem Backend.
Bestätigen wir die Warnung, dann wird daraus eine Fehlermeldung. Das Popup wird ausgeblendet und die klassische Fehlermeldung angezeigt.
Verhalten
Als zweite Lösung wollen wir neues Verhalten für die abstrakte Entität hinterlegen. Bereits in einem anderen Artikel haben wir eine abstrakte Entität genutzt, um tiefe Strukturen an eine API zu übergeben. In diesem Fall müssen wir unsere abstrakte Entität "ZBS_S_DRPExcelPopup" um das Schlüsselwort ROOT erweitern, da wir sonst keine Verhaltensdefinition erzeugen können.
@EndUserText.label: 'Excel Popup'
define root abstract entity ZBS_S_DRPExcelPopup
{
@EndUserText.label: 'Comment'
EventComment : abap.char(60);
@EndUserText.label: 'Test run'
TestRun : abap_boolean;
}
Im nächsten Schritt kannst du über das Kontextmenü des Objekts eine Verhaltensdefinition erzeugen die als "abstract" gekennzeichnet ist.
Allerdings müssen wir in der generierten Verhaltensdefinition des STRICT Mode deaktivieren, damit wir das Objekt ohne Fehler aktivieren können. Im Artikel von Andre Fischer im unteren Bereich, geht das auch mit dem STRICT Mode, allerdings mit einigen Zusätzen.
abstract;
define behavior for ZBS_S_DRPExcelPopup
{
field ( mandatory ) EventComment, TestRun;
}
Schauen wir uns nun das Popup an, dann wurden hier die entsprechenden Marker hinterlegt und die Felder als Pflichtfelder definiert.
Führen wir nun die Aktion ohne Eingabe der Parameter aus, dann erhalten wir direkt im UI eine Fehlermeldung und können nicht weiter. Hier fällt auch auf, dass das Ja/Nein Feld nun auch eine Validierung besitzt und wir explizit einen Wert auswählen müssen. Leere Werte sind damit nicht mehr möglich.
Vollständiges Beispiel
Alle Änderungen aus diesem Artikel und alle neuen Objekte findest du im passenden Commit im GitHub Repository und kannst damit die gemachten Änderungen nachvollziehen.
Fazit
Für die Definition von Pflichtfeldern gibt es aktuell verschiedene Möglichkeiten. Welche du in deinem Szenario verwenden willst, bleibt am Ende dir überlassen.