
ABAP Tools - IDE Actions (Seiteneffekt)
Wie können wir eigentlich automatisch Informationen auf dem UI aktualisieren, wenn etwas mit der IDE Action passiert? Schauen wir uns einmal die Side Effects im Detail an.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns das Verhalten bei Seiteneffekten an und wie wir sie für unsere Eingabe effizienter nutzen können.
Einleitung
Beim letzten Mal hatten wir uns die Wertehilfen bei den IDE Actions angeschaut und wie wir damit aufeinander aufbauende Wertehilfen erstellen können. In diesem Artikel werden wir etwas mehr Fokus auf die Arbeit mit dem UI setzen. Dabei wollen wir automatisch auf Eingaben reagieren und Informationen auf dem Popup (Input) aktualisieren. Ähnlich wie bei Side Effects im ABAP RESTful Programming Model, können wir nach einer Aktion im UI den Effekt triggern und damit Informationen anpassen.
Vorbereitung
Passen wir daher im ersten Schritt unseren Input an und fügen neue Felder hinzu, die wir im Anschluss für unsere neuen Features verwenden wollen. Bei den beiden Feldern handelt es sich um ein Eingabefeld und ein Ausgabefeld für den späteren Seiteneffekt. Dazu erweitern wir die Struktur INPUT in der Input Klasse für das UI.
"! <p class="shorttext">SE: Input</p>
se_input TYPE string,
"! <p class="shorttext">SE: Output</p>
se_output TYPE string,
Dabei wollen wir auf zwei Dinge reagieren:
- Änderung des Typen der Ausgabe
- Eingabe von Text in das Inputfeld
Definition
Um nun den Seiteneffekt zu implementieren, müssen wir mehrere Schritte durchführen.
Konfiguration
Über die Konfiguration müssen wir dann den Seiteneffekt an dem Feld aktivieren. Dazu lassen wir uns das Element von der Konfiguration in der Methode CREATE_INPUT_CONFIG zurückgeben und rufen die Methode SET_SIDEEFFECT auf. Dort setzen wir das Kennzeichen, um den Effekt nach dem Update aufzurufen.
configuration->get_element( `output_format` )->set_sideeffect( after_update = abap_true ).
configuration->get_element( `se_input` )->set_sideeffect( after_update = abap_true ).
Grundsätzlich können wir verschiedene Effekte aktivieren, wenn wir zum Beispiel eine Tabelle bearbeiten. Dann können wir auch auf das Anlegen und Löschen in einer Tabelle reagieren, wenn wir zum Beispiel die Daten aktualisieren müssen.
Klasse
Im nächsten Schritt müssen wir die eigentliche Klasse für den Seiteneffekt implementieren. Diese benötigt das Interface IF_SD_DETERMINATION, wo wir dann später die eigentliche Logik implementieren.
Handler
Haben wir die Klasse definiert, dann müssen wir sie im Framework registrieren. Dazu legen wir die Methode GET_SIDE_EFFECT_PROVIDER in der Input-Klasse an. Sollte die Methode noch nicht implementiert sein, dann findest du sie im Interface IF_AIA_SD_ACTION_INPUT. Wir erzeugen die Instanz und übergeben sie an den Parameter DETERMINATION des Providers.
METHOD if_aia_sd_action_input~get_side_effect_provider.
RETURN cl_sd_sideeffect_provider=>create( determination = NEW zcl_bs_demo_ide_first_side( ) ).
ENDMETHOD.
Implementierung
In diesem Kapitel schauen wir uns die eigentliche Implementierung der Logik an. Aktuell haben wir zwei Felder mit einem Effekt, die wir in einem Ausgabefeld unterbringen wollen. Im ersten Schritt prüfen wir, ob wir aktuell beim richtigen Seiteneffekt sind, so können wir aussteuern, welcher Effekt welches Coding triggert.
IF determination_kind <> if_sd_determination=>kind-after_update.
RETURN.
ENDIF.
Als nächsten Schritt lesen wir über das MODEL die aktuellen Daten des Inputs ein, da wir die aktuellen Daten für den Effekt nutzen wollen, um dem Entwickler ein Feedback auf seine Eingaben zu geben.
DATA input TYPE zcl_bs_demo_ide_first_input=>input.
model->get_as_structure( IMPORTING result = input ).
Als letzten Schritt führen wir den eigentlichen Effekt aus. Hier übernehmen wir das Format und die aktuelle Länge des Eingabefeldes und übernehmen es in die Ausgabe. Zum Abschluss übergeben wir die Daten zur Aktualisierung an den RESULT Parameter. Grundsätzlich kannst du nun natürlich zahlreiche Ableitungen und weitere Logiken aufrufen. Allerdings sollte es nicht zu viel Zeit in Anspruch nehmen, da sonst der Entwickler nach jeder Eingabe warten muss.
input-se_output = |{ input-output_format }: { strlen( input-se_input ) }|.
result = input.
Ergebnis
Nachdem wir nun die Implementierung abgeschlossen haben, schauen wir uns einmal den Seiteneffekt in Echtzeit an. Auf die Änderung der Ausgabe oder die Eingabe in das Input Feld, regiert nun das Ausgabefeld und passt sich entsprechend an. Solange der Effekt nicht noch einmal erneut ausgelöst wird, kannst du das Ausgabefeld auch manuell anpassen.
Vollständiges Beispiel
Das vollständige Coding aus dem gesamten Beispiel findest du im GitHub Repository. Über den folgenden Commit findest du die Änderungen aus diesem Artikel und kannst so noch später den aktuellen Zustand nachvollziehen.
Fazit
Seiteneffekte bringen etwas mehr Leben in deine IDE Action und erlauben dir direkte Auswirkungen von Eingaben auf dem UI widerzuspiegeln und Informationen für den Entwickler vorzubefüllen. Grundsätzlich können sie für viele Dinge in der dynamischen Entwicklung eingesetzt werden.


