![ABAP RAP Aktion](/user_content/content/abap-rap-action.png)
RAP - Aktion
In diesem Artikel schauen wir uns einmal Aktionen an, wie sie aufgebaut werden und was sie eigentlich mit dem RAP Business Objekt machen.
Inhaltsverzeichnis
In den letzten RAP Artikeln hatten wir uns mit dem Thema Validierungen und Ermittlungen beschäftigt, dies wollen wir nun vervollständigen mit den Aktionen. Wie du Aktionen definieren kannst und diese implementierst, erfährst du in diesem Artikel.
Einführung
Aktionen kann man sich am einfachsten wie Buttons auf einer Oberfläche vorstellen, man kann sie von außen auslösen und sie führen verschiedene Schritte aus. In den meisten Fällen werden auch Daten des RAP Business Objekts beeinflusst. Ähnlich wie Validierungen und Ermittlungen müssen sie in der Verhaltensdefinition des Objekts angelegt werden.
Bereitstellung
Im ersten Schritt definieren wir zwei einfache Aktionen in der Verhaltensdefinition, dazu musst du nur die "action" und einen Namen angeben. In diesem Fall definieren wir zwei Aktionen, eine Normal und eine Static. Über STRG + 1 können die beiden Aktionen und deren Methoden erzeugt werden, um später das Coding zu implementieren.
action fillEmptyStreets;
static action clearAllEmptyStreets;
Damit die Aktionen auch in der App oder Schnittstelle genutzt werden können, müssen diese in der Projektion bekannt gegeben werden. Erst durch die Bereitstellung nach Außen, kann sie auch genutzt werden.
use action fillEmptyStreets;
use action clearAllEmptyStreets;
Damit die Aktionen nun auf dem UI erscheinen, muss die Metadata Extension erweitert werden. Dazu kann ein beliebiges Feld um weitere Annotationen erweitert werden. Über die Erweiterung von LineItem tauchen die Buttons über der Liste auf. Wichtig ist vor allem die Defintion des "types" und der "dataAction", damit der Button angezeigt wird und die richtige Aktion auslöst.
@UI.selectionField : [ { position: 10 } ]
@UI.lineItem: [
{ position: 20, importance: #MEDIUM },
{ position: 10, type: #FOR_ACTION, label: 'Fill', dataAction: 'fillEmptyStreets' },
{ position: 20, type: #FOR_ACTION, label: 'Clear All', dataAction: 'clearAllEmptyStreets' }
]
@UI.identification: [{ position: 10, qualifier: 'PARTNER_INFO' }]
@EndUserText.label: 'Partner'
@EndUserText.quickInfo: 'Identifier of the partner'
PartnerNumber;
Die Buttons werden damit nun auch auf dem UI angezeigt und können genutzt werden:
Zum Abschluss implementieren wir nun die beiden Aktionen. Die Aktion "fillEmptyStreets" befüllt einen Datensatz, bei dem die Straße leer ist, mit einem Wert. Die Aktion "clearAllEmptyStreets" löscht die Werte nun wieder, aber keine anderen Straßen. Die Implementierung sieht wie folgt aus:
METHOD clearAllEmptyStreets.
SELECT FROM zbs_dmo_partner
FIELDS partner, street
WHERE street = 'EMPTY'
INTO TABLE @DATA(lt_partner_data).
LOOP AT lt_partner_data INTO DATA(ls_partner).
MODIFY ENTITIES OF ZBS_I_RAPPartner IN LOCAL MODE
ENTITY Partner
UPDATE FIELDS ( Street )
WITH VALUE #( ( PartnerNumber = ls_partner-partner Street = '' %control-Street = if_abap_behv=>mk-on ) ).
ENDLOOP.
INSERT VALUE #(
%msg = new_message_with_text( text = |{ lines( lt_partner_data ) } records changed|
severity = if_abap_behv_message=>severity-success )
) INTO TABLE reported-partner.
ENDMETHOD.
METHOD fillEmptyStreets.
READ ENTITIES OF ZBS_I_RAPPartner IN LOCAL MODE
ENTITY Partner
FIELDS ( Street )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_partner_data).
LOOP AT lt_partner_data INTO DATA(ls_partner) WHERE Street IS INITIAL.
MODIFY ENTITIES OF ZBS_I_RAPPartner IN LOCAL MODE
ENTITY Partner
UPDATE FIELDS ( Street )
WITH VALUE #( ( %tky = ls_partner-%tky Street = 'EMPTY' %control-Street = if_abap_behv=>mk-on ) ).
ENDLOOP.
ENDMETHOD.
Aktionen
Im oberen Beispiel haben wir zwei Aktionen verwendet, eine normale "Action" und eine "Static Action". Die normale Aktion ist zu Beginn inaktiv und kann erst genutzt werden, wenn einer oder mehrere Datensätze in der Liste markiert wurden. Die Aktion wird nur auf diesem Datensatz ausgeführt.
Die zweite Aktion ist immer aktiv, dass sie auf das ganze Objekt Einfluss hat und nicht abhängig von einem markierten Datensatz ist. Entsprechend anders läuft die Aktion, denn hier müssen wir alle Schlüssel selbst von der Datenbank lesen und bekommen sie nicht übergeben.
Meldungen
Aktionen bringen die Möglichkeit mit, entsprechende Meldungen an den User zurückzugeben. In unserer Beispielimplementierung haben wir eine einfache Erfolgsmeldung ausgegeben, die einen Message Toast erzeugt, der nach wenigen Sekunden verschwindet.
Hier besteht aber auch die Möglichkeit mehr Meldungen zu erzeugen. Werden mehr Meldungen erzeugt, dann ändert sich die Form in ein Popup, werden andere Typen verwendet, wir die Meldung anders dargestellt oder muss vielleicht auch erst bestätigt werden.
Fazit
Aktionen geben dem RAP Objekt weitere Möglichkeiten auf die Daten einzuwirken, ohne Änderungen direkt vorzunehmen. Die Aktionen können einfach sein und Daten verändern oder komplexe Aktionen auslösen, wie Daten über eine Schnittstelle nachzulesen.