This is a test message to test the length of the message box.
Login
|
ABAP RAP Gruppierung von Aktionen
Erstellt von Software-Heroes

RAP - Gruppierung von Aktionen

57

Wie kannst du eigentlich deine verschiedenen Aktion in RAP unter einem Button gruppieren, vor allem wenn die Aktionen relativ ähnlich sind. In diesem Artikel schauen wir uns die Details zur Umsetzung mit ABAP an.

Werbung


In diesem Artikel werden wir die Factory Actions implementieren und im UI eine Gruppierung anwenden, um dem Anwender die Möglichkeiten besser zu visualisieren.

 

Einleitung

Aktuell haben wir verschiedene Optionen zur Anlage von neuen Datensätzen in unserer Sales App. Dabei haben wir in einem älteren Artikel zwei spezifische Factory Actions angelegt, um Datensätze mit einer Vorbefüllung und ersten Werten zu erstellen. Daneben steht weiterhin die Standard "Create" Aktion, über die wir einen neuen Datensatz anlegen können. Deshalb haben wir auch die Anforderung die Anlageoptionen zu reduzieren und für den Anwender einfacher darzustellen.

 

Factory Actions

Die Factory Action verwenden wir für die Anlage von neuen Datensätzen. Dabei verwenden wir nicht den Standard Create, da wir damit nur auf einer leeren Object Page landen, sondern zeigen dem Anwender Pflichtinformationen in einem neuen Popup die wir für die Neuanlage benötigen. Damit können wir den spezifischen Flow und die Ableitung von neuen Informationen im Prozess vereinheitlichen. In unserem Beispiel wollen wir, dass der Anwender nur Abweichungen als ganze Werte oder Prozent eingibt.

 

Aktueller Stand

Dazu hatten wir bereits im Verhalten die folgenden Actions definiert, aber noch nicht implementiert. Folgende Definitionen existieren aktuell und sind bereits im UI eingeblendet.

static factory action ( authorization : global ) createFixValue parameter ZBS_S_SAPopupFixValue [1];
static factory action ( authorization : global ) createPercent parameter ZBS_S_SAPopupPercent [1];

 

Die Aktionen sind STATIC, da noch keine Instanz besteht und die PARAMETER verwenden wir, damit ein Popup angezeigt wird, wo zusätzliche Informationen angezeigt werden. Da wir mit den Aktionen einen neuen Datensatz anlegen und der User später direkt damit arbeiten soll, gibt unsere Action genau einen Datensatz zurück.

 

Implementierung

Die eigentliche Implementierung ist relativ einfach gemacht, zumindest wenn du dich mit der Entity Manipulation Language (EML) auskennst. Dazu verarbeiten wir die übergebenen Schlüssel und legen pro Datensatz einen neuen Eintrag an. Das Ergebnis aus MAPPED übergeben wir dann an die Rückgabe unserer Implementierung. Wir verwenden hier einen LOOP, um später vielleicht noch entsprechende Ableitungen für andere Felder implementieren zu können, grundsätzlich könntest du auch mit einer FOR-Anweisung arbeiten. Welche EML Variante du nutzt, ist dir überlassen.

LOOP AT keys INTO DATA(key).
  MODIFY ENTITIES OF zbs_r_sasale IN LOCAL MODE
         ENTITY SASale
         CREATE FROM VALUE #( ( %cid                        = key-%cid
                                %is_draft                   = key-%param-%is_draft
                                PartnerNumber               = key-%param-PartnerNumber
                                SalesDate                   = key-%param-SalesDate
                                DifferenceAmount            = key-%param-DifferenceAmount
                                DifferenceCurrency          = key-%param-DifferenceCurrency
                                %control-PartnerNumber      = if_abap_behv=>mk-on
                                %control-SalesDate          = if_abap_behv=>mk-on
                                %control-DifferenceAmount   = if_abap_behv=>mk-on
                                %control-DifferenceCurrency = if_abap_behv=>mk-on ) )
         MAPPED DATA(mapped_result).

  INSERT LINES OF mapped_result-sasale INTO TABLE mapped-sasale.
ENDLOOP.

 

Wichtig ist in der Implementierung, dass wir das Ergebnis an den Aufrufer zurückgeben, da sonst die Navigation auf die Object Page in Fiori nicht funktioniert. Ebenfalls müssen wir den Draft Status mit an den Create übergeben, da wir sonst eine Fehlermeldung erhalten und der Datensatz nicht korrekt angelegt wird.

 

Gruppierung

In diesem Abschnitt wollen wir die Gruppierung der beiden Factory Actions durchführen. Dabei soll der User unter einem Punkt die Möglichkeit der Anlage finden und nicht mehr verstreut über mehrere Buttons, wo vielleicht auch noch andere Aktionen sichtbar sind.

 

Gruppe bilden

Im Moment sind beide Aktionen einzeln im UI eingeblendet. Jede Aktion ist als FOR_ACTION eingebunden, hat eine Referenz zur RAP Aktion und ein Label für die Anzeige.

@UI.lineItem: [
  { position: 10, type: #FOR_ACTION, dataAction: 'createFixValue', label: 'Create Fix Value' },
  { position: 20, type: #FOR_ACTION, dataAction: 'createPercent', label: 'Create Percent' }
]

 

Dazu erstellen wir eine Gruppe mit dem Typ FOR_ACTION_GROUP. Dieser geben wir eine Beschreibung und eine "actionGroupId". Die Gruppe wird im UI dann alle zugeordneten Elemente als Dropdown bündeln. Als letzten Schritt müssen wir dann die "actionGroupId" den Buttons zuordnen. Damit haben wir insgesamt eine neue Zeile und zwei Attribute in den UI-Annotationen ergänzt.

@UI.lineItem: [
  { position: 5, type: #FOR_ACTION_GROUP, label: 'Create', actionGroupId: 'idCreateGroup' },
  { position: 10, type: #FOR_ACTION, dataAction: 'createFixValue', label: 'Create Fix Value', actionGroupId: 'idCreateGroup' },
  { position: 20, type: #FOR_ACTION, dataAction: 'createPercent', label: 'Create Percent', actionGroupId: 'idCreateGroup' }
]

 

Schauen wir uns die Anwendung an, dann sind die beiden Aktionen nun unter einem neuen Punkt "Create" verfügbar und können per Dropdown ausgewählt werden.

 

Hinweis: In niedrigeren Fiori Releases kann es zu einem Fehler kommen, dass der neue Datensatz angelegt wird, aber keine Navigation auf die Object Page passiert. Dieser Fehler wurde für Factory Actions im Grouping Ende 2025 korrigiert.

 

Standard Create

Damit können wir nun den Standard Create entfernen, allerdings benötigen wir diesen weiterhin, da sonst die Anlage per EML nicht mehr funktioniert. Hier können wir den Create auf "Internal" umstellen, damit ist ein Create per EML im LOCAL MODE möglich, also innerhalb der Implementierung zum RAP Objekt. Dazu passen wir die Verhaltensdefinition ZBS_R_SASale an und setzen den Create der Entität SASale auf "internal".

internal create;

 

Allerdings haben wir nun ein Problem mit unserer Augmentation auf Ebene des Projection Layer, da diese über die Create Action unseres Objekts geht und damit einen Fehler verursacht, da die Standard Aktion nicht mehr zur Verfügung steht. In unserem Fall sollen die Factory Actions nur Shortcuts sein und eine korrekte Anlage von Entitäten weiterhin über CREATE möglich sein, zumindest mit EML. Die Stabilität solltest du vor allem mit den passenden Validierungen sicherstellen. In diesem Fall verwenden wir eine UI-Annotation auf Kopfebene der Metadata Extension. Damit können wir den CREATE Button auf UI-Ebene deaktivieren, damit der User vor allem mit unseren beiden Factory Actions arbeitet.

@UI.createHidden: true

 

Ergebnis

Schauen wir uns nun final noch einmal das Ergebnis der Anpassung an. Dabei haben wir unsere Create Action ausgeblendet und die beiden Factory Actions sind nun per Gruppe und Dropdown verfügbar. Wenn wir die Daten über das Popup eingegeben haben, landen wir direkt zur weiteren Bearbeitung im neuen Datensatz und die Informationen wurden übernommen.

 

Grundsätzlich fehlen zur vollständigen Implementierung noch Dinge wie die Validierungen oder das zum Beispiel die anderen Felder dann ausgeblendet werden, wenn entsprechend eine der beiden Varianten ausgewählt wurde.

 

Vollständiges Beispiel

Das vollständige Beispiel findest du in GitHub im entsprechenden Paket für die Sales App. Die Änderungen aus diesem Artikel findest du in diesem Commit und kannst damit die Änderungen, plus die Zusatzinformationen, nachvollziehen.

 

Fazit

Die Gruppierung von Aktionen räumt im ersten Schritt einmal das UI etwas auf und zeigt dem User, wie zum Beispiel neue Szenarien angelegt werden können. Dafür ist nun eine kleine Implementierung von UI-Annotationen nötig, um dann auch final das UI zu bereinigen.


Enthaltene Themen:
RAPBTPActionGroupingREX7
Kommentare (0)



Und weiter ...

Bist du zufrieden mit dem Inhalt des Artikels? Wir posten jeden Dienstag und Freitag neuen Content im Bereich ABAP und unregelmäßig in allen anderen Bereichen. Schaue bei unseren Tools und Apps vorbei, diese stellen wir kostenlos zur Verfügung.


ADT - RAP Extension Assistent [MIA]

Kategorie - ABAP

Du möchtest ein RAP Objekt erweitern und weißt nicht genau wo du starten sollst? Vielleicht hilft dir die Idee des Extension Assistant weiter und leitet dich Schritt für Schritt durch den Prozess.

06.03.2026

ADT - RAP Analyzer [MIA]

Kategorie - ABAP

Die Einarbeitung und Übersicht in bestehende RAP Objekte kann nicht immer einfach sein, vor allem wenn es sich um komplexe Objekte handelt. Fragen wie das verwendete Pattern und wichtige Objekte müssen sich meist erarbeitet werden.

24.02.2026

RAP - Position der Buttons

Kategorie - ABAP

In diesem Artikel schauen wir uns die verschiedenen Positionen der Buttons an. Wo können wir in RAP die verschiedenen Actions platzieren und wie nutzen wir diese.

17.02.2026

RAP - Analytical Table

Kategorie - ABAP

Schauen wir uns einmal in RAP das letzten fehlende Puzzlestück zur Ablösung des ALVs an und wie wir die Analytical Table mit wenig Aufwand einrichten können.

13.02.2026

RAP - Mixed Content

Kategorie - ABAP

Wie bekommen wir eigentlich unterschiedlichen Content in die gleiche Spalte im List Report? Schauen wir uns dazu einmal ein praktisches Beispiel für unsere Sales App an.

10.02.2026