
ABAP Tools - IDE Actions (Eingabe)
Wie können wir eigentlich vor der Eingabe noch Informationen holen, bevor die eigentliche IDE Action in ABAP ausgeführt wird? Implementieren wir dazu die erste Version einer einfachen Eingabe.
Inhaltsverzeichnis
In diesem Artikel legen wir eine Eingabeklasse an und gestalten unsere erste Eingabe für die IDE Action. Dabei schauen wir uns einige Möglichkeiten der Formatierung an.
Einleitung
Wenn wir nicht gerade ein Refactoring von Quellcode durchführen, benötigen wir normalerweise eine Eingabe vom Entwickler, der die IDE Action ausführt. Damit können wir zusätzliche Daten abfragen oder Entscheidungen des Entwicklers erhalten, wie wir dann weiter vorgehen wollen. Wollen wir Objekte generieren oder größere Änderungen vornehmen, macht eine Eingabe auf jeden Fall Sinn.
UI Configuration
Dazu müssen wir im ersten Schritt eine UI Configuration Klasse anlegen, die vom Interface IF_AIA_SD_ACTION_INPUT erbt und wo wir die Methode CREATE_INPUT_CONFIG ausprägen müssen. Dazu können wir in der eigentlichen IDE Action beginnen und den Namen der Klasse in das Feld "Input UI Configuration Class" eintragen.
Über die Vorwärtsnavigation (Klick auf den Link), können wir die Anlage starten und müssen nur das passende Interface hinterlegen. Wir erhalten im Anschluss unsere leere Klasse und können die beiden Objekte im System aktivieren.
Annotationen
Bevor wir mit der eigentlichen Implementierung starten, sollten wir uns zuvor mit den Annotationen beschäftigen, die wir später verwenden möchten. Dazu gibt es aktuell mehrere Quellen für die Formatierung und die verschiedenen Attribute:
Für was benötigen wir also die Annotationen? Wollen wir zum Beispiel einen Titel für ein Feld definieren, die Länge der Eingabe beschränken oder einen Standardwert für ein Feld definieren, dann benötigen wir zusätzliche beschreibende Merkmale. Diese Merkmale werden in Form von Annotationen direkt am Feld oder dem Typen definiert und beginnen in vielen Fällen wie ABAP Docs. Dazu ein kleines Beispiel, um das Label am Feld zu setzen:
"! <p class="shorttext">Output of the IDE Action</p>
output_format TYPE output_format,
Struktur
In diesem Kapitel gestalten wir schrittweise die Struktur für die Ausgabe und bauen verschiedene Elemente für die Formatierung der Eingabe ein.
Aufbau
Dafür benötigen wir einen ersten initialen Aufbau. Ein guter Anfang ist daher eine eigene Struktur, wo wir die verschiedenen Eingabeinformationen speichern wollen. Hier definieren wir die Struktur INPUT mit dem Feld OUTPUT_FORMAT, um später die verschiedenen Ausgaben zu prüfen.
TYPES:
BEGIN OF input,
output_format TYPE string,
END OF input.
In der Methode CREATE_INPUT_CONFIG müssen wir nun die Struktur vorbereiten und übergeben diese an die UI_INFORMATION_FACTORY. Neben der eigentlichen Variable können wir auch schon direkt Defaultwerte setzen. Die Instanz geben wir dann als Ergebnis aus der Methode.
DATA input TYPE input.
input-output_format = 'TEST'.
RETURN ui_information_factory->for_abap_type( abap_type = input ).
Führen wir nun die IDE Action aus, dann erhalten wir ein Popup und unser erstes Feld zusammen mit dem Defaultwert angezeigt.
Labels
Im nächsten Schritt wollen wir den Feldern ein paar Label geben, damit sie besser lesbar sind und der Anwender mehr Informationen bei der Ausführung erhält. Dazu ergänzen wir jeweils einen Paragraph mit der Klasse "shorttext" und dem eigentlichen Text. In diesem Fall geben wir der Struktur eine Beschreibung und dem eigentlichen Feld.
TYPES:
"! <p class="shorttext">Out first action</p>
BEGIN OF input,
"! <p class="shorttext">Choose an output</p>
output_format TYPE string,
END OF input.
Als Ergebnis erhalten wir dieses mal die entsprechenden Texte im Popup, schon einmal eine Verbesserung zum ersten Eindruck des UIs.
ENUM
Für die verschiedenen Ausgabeformate wollen wir dem User nun eine Wahlmöglichkeit geben. Dafür müssen wir einige Dinge anlegen, damit die Eingabe am Ende zu einem Dropdown wird. Dazu legen wir uns eine Konstanten Struktur an, die alle Werte enthält. In diesem Fall haben wir TEXT, HTML und CODE, damit wir später die Ausgabe steuern können. Ebenfalls haben wir bereits Texte definiert, sodass die Konstanten später einen schönen Text erhalten.
CONSTANTS:
BEGIN OF output_enum,
"! <p class="shorttext">Plain text</p>
text TYPE string VALUE 'TEXT',
"! <p class="shorttext">HTML</p>
html TYPE string VALUE 'HTML',
"! <p class="shorttext">Code Change</p>
code TYPE string VALUE 'CODE',
END OF output_enum.
Nun ein etwas schwieriger Teil, die eigentliche Konfiguration des Datentyps für die Ausgabe. Dabei definieren wir einen Typen, der den Inhalt des ENUMs entgegennehmen kann, in diesem Fall STRING. Dann müssen wir die Konfiguration vornehmen. Über $VALUES geben wir an, woher die Typdefinition kommt. In diesem Fall haben wir einen Link auf die aktuelle Klasse, den Datenbereich und dort das OUTPUT_ENUM. Dann müssen wir noch angeben, welcher Wert initial gesetzt ist. Dazu geben wir hinter $DEFAULT wieder das ENUM an, dieses Mal aber auch einen Wert daraus.
"! $values { @link zcl_bs_demo_ide_first_input.data:output_enum }
"! $default { @link zcl_bs_demo_ide_first_input.data:output_enum.text }
TYPES output_format TYPE string.
Zum Abschluss tauschen wir den Datentype STRING gegen unseren neuen Typen aus, damit die Konfiguration für dieses Feld greift. Damit wären wir mit der eigentlichen Konfiguration schon fertig.
TYPES:
"! <p class="shorttext">Out first action</p>
BEGIN OF input,
"! <p class="shorttext">Choose an output</p>
output_format TYPE output_format,
END OF input.
Führen wir nun die Aktion im System aus, dann erhalten wir als Ergebnis ein Feld als Dropdown mit den entsprechend definierten Werten. Damit kann der Entwickler direkt wählen, welche Ausgabe er erzeugen möchte.
Verwendung
Nun kommen wir zum eigentlich wichtigsten Teil, wie können wir die Eingabe des Entwicklers bei der eigentlichen Ausführung der Aktion verwenden? Dazu müssen wir in die eigentliche Aktion wechseln und in der Methode RUN weiteren Code implementieren. Dazu erzeugen wir uns eine Variable von unserem Datentyp und rufen über das CONTEXT Objekt die Methode GET_INPUT_CONFIG_CONTENT auf, um an die Inhalte des Popups zu gelangen.
DATA input TYPE zcl_bs_demo_ide_first_input=>input.
TRY.
context->get_input_config_content( )->get_as_structure( IMPORTING result = input ).
CATCH cx_sd_invalid_data.
ENDTRY.
Im Anschluss können wir dann auf den Inhalt der Variable reagieren und bekommen je nach Auswahl eine unterschiedliche Ausgabe angezeigt.
CASE input-output_format.
WHEN zcl_bs_demo_ide_first_input=>output_enum-text.
result = output_text( ).
WHEN zcl_bs_demo_ide_first_input=>output_enum-html.
result = output_html( ).
WHEN zcl_bs_demo_ide_first_input=>output_enum-code.
result = output_code_change( context ).
ENDCASE.
Vollständiges Beispiel
Das komplette Beispiel zur Entwicklung von IDE Actions findest du bei uns im GitHub Repository. Die eigentliche Änderung aus diesem Artikel im Commit, da sich das eigentliche Repository im Laufe der Serie ändern wird.
Fazit
Heute haben wir uns angeschaut, wie wir eine Ausgabe erstellen und dem Entwickler weitere Informationen abfragen können und diese im Anschluss bei unserer Aktion auch nutzen können. Dabei haben wir uns erste Annotationen fürs UI angeschaut.




