
ABAP Tools - IDE Actions (Tabelle)
Wie kannst du eigentlich eine Tabelle erzeugen und in der IDE Action bearbeiten? Schauen wir uns die Möglichkeiten für die Eingabe an und wie du am Ende mit den Daten umgehen kannst.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns Tabellen für den IDE Action Input an und wie du sie in deiner Entwicklung effizient verwenden kannst.
Einleitung
Bisher hatten wir für die Ausgabe vor allem einfache Felder verwendet, die jeweils eine Information aufnehmen können. Wie sieht es aber nun zum Beispiel aus, wenn du mehr Informationen bearbeiten möchtest und diese in einem strukturierten Format vorliegen? Dazu steht dir die Tabelle zur Verfügung, die wir in diesem Artikel einmal genauer anschauen.
Struktur
Dazu beginnen wir mit einem neuen Datentyp, den wir für die Ausgabe und Bearbeitung verwenden wollen. Da wir eine Tabelle definieren wollen, definieren wir uns eine Struktur und den entsprechenden Tabellentypen dazu.
TYPES:
BEGIN OF table_line,
"! <p class="shorttext">Key</p>
key_field TYPE c LENGTH 15,
"! <p class="shorttext">Number</p>
int_number TYPE i,
"! <p class="shorttext">Long text</p>
long_text TYPE string,
END OF table_line.
TYPES table_body TYPE STANDARD TABLE OF table_line WITH EMPTY KEY.
Dazu binden wir das Feld in unsere "input" Struktur für die Ausgabe ein.
table_input TYPE table_body,
Rufen wir nun die IDE Action auf und schauen uns das Ergebnis an. Dabei fällt auf, dass nun eine Tabelle angezeigt wird, wir aber keine Möglichkeiten zur Interaktion mit der Tabelle haben. Auch sieht aktuell das Layout etwas komisch aus.
Da wir den Inhalt der Tabelle aktuell nicht ändern können, fügen wir erst einmal einen Datensatz in die Tabelle ein. Defaultwerte können wir in der Methode CREATE_INPUT_CONFIG setzen, bevor wir die Konfiguration und die Eingabe an die Factory übergeben.
INSERT VALUE #( key_field = 'ABC'
long_text = `This is a longer text` ) INTO TABLE input-table_input.
Wir erhalten nun einen Datensatz in der Tabelle und wenn wir diesen anklicken, dann sehen wir die Daten auf der rechten Seite der Tabelle und können weitere Anpassungen vornehmen.
Layout
Passen wir nun etwas am Layout der IDE Action an, um die Standard Editieroptionen der Tabelle zu aktivieren. Dazu müssen wir keine weitere Konfiguration an der Tabelle vornehmen, sondern setzen das Layout der Konfiguration. Über das Interface IF_SD_CONFIG_ELEMENT findest du die passenden Konstanten für das Layout.
configuration->set_layout( if_sd_config_element=>layout-grid ).
Mit dieser Einstellung aktivieren sich die Buttons an der Tabelle. Damit können wir auch neue Datensätze hinzufügen und bearbeiten. Dazu einfach auf der linken Seite den Datensatz wählen und Rechts bearbeiten.
Wollen wir etwas mehr Tabelle haben und die Bearbeitung in einem Popup durchführen, dann können wir den Typen direkt auf Tabelle umstellen. Dazu holen wir uns über die Methode GET_STRUCTURED_TABLE ein Objekt für unsere Tabelle und können auch hier ein neues Layout definieren. Zusätzlich setzen wir die Option COLLAPSED auf True, damit wird beim Start der IDE Action der Bereich eingeklappt dargestellt. Damit kannst du optionale Optionen erst einmal ausblenden.
DATA(table) = configuration->get_structured_table( `table_input` ).
table->set_layout( type = if_sd_config_element=>layout-table
collapsed = if_sd_config_element=>true ).
Wenn die IDE Action nun geladen wird und wir den Bereich wieder aufklappen, dann findest nun die Tabelle über die komplette Breite. Damit kannst du eine große Anzahl an Objekten und Informationen schnell und einfach präsentieren. Zusätzlich haben wir nun einen neuen Button, um den Datensatz zu ändern.
Eingabe
Als nächsten Schritt passen wir nun die Feldeigenschaften an. Ähnlich wie bei den normalen Feldern, können wir es auch in diesem Fall machen. Allerdings müssen wir uns erst das Strukturobjekt der Tabelle geben lassen, um dann die einzelnen Elemente der Struktur anpassen zu können.
DATA(structure) = table->get_line_structure( ).
structure->get_element( `long_text` )->set_multiline( if_sd_config_element=>height-medium ).
structure->get_element( `int_number` )->set_read_only( ).
Gehst du nun auf "Edit" für einen Datensatz, dann wird uns das folgende Bild angezeigt. Wir haben die verschiedenen Einstellungen an den Feldern geändert. Das Nummernfeld ist nun nicht mehr eingabebereit und der Langtext wird als größeres Feld angezeigt und bietet nun mehr Platz für das Einfügen von Text.
Seiteneffekt
Als letzten Schritt möchten wir nun die Daten in der Tabelle automatisch aktualisieren, nachdem wir einen neuen Datensatz eingefügt haben. Definieren wir zuerst in der Konfiguration für die Struktur den Seiteneffekt. Dieser soll erst nach Anlage eines neuen Datensatzes ausgelöst werden.
structure->set_sideeffect( after_create = abap_true ).
Dazu bauen wir die Klasse ZCL_BS_DEMO_IDE_FIRST_SIDE um und ändern die Validierung der Ermittlung. In diesem Fall führen wir die bisherige Logik im AFTER_UPDATE aus und fügen einen neuen Zweig für AFTER_CREATE ein. Damit können wir auf die unterschiedlichen Events in der gleichen Implementierung reagieren.
CASE determination_kind.
WHEN if_sd_determination=>kind-after_update.
input-se_output = |{ input-output_format }: { strlen( input-se_input ) }|.
WHEN if_sd_determination=>kind-after_create.
ENDCASE.
Von der Logik her, wollen wir nach jeder neuen Zeile die Nummerierung in der Liste aktualisieren. Dabei soll die maximale Nummer in der ersten Zeile stehen und sich mit jeder Zeile reduzieren, bis 1 in der letzten Zeile steht. Damit können wir das Feld aktualisieren, wobei der Entwickler keine Änderungen vornehmen kann.
DATA(actual_index) = lines( input-table_input ).
LOOP AT input-table_input REFERENCE INTO DATA(line).
line->int_number = actual_index.
actual_index -= 1.
ENDLOOP.
Schauen wir uns nun die Tabelle einmal in Aktion an. Wir führen die IDE Action aus, maximieren den Abschnitt und fügen dann neue Zeilen hinzu. Nach jeder neuen Zeile wird durch den Seiteneffekt die Nummerierung aktualisiert.
Damit sind wir mit der Implementierung der Tabelle fertig. Diese kannst du nun ganz normal in der Aktion verwenden. Dort holen wir uns bereits alle Daten aus der IDE Action und damit auch die befüllte Tabelle.
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
Mit diesem Tutorial kannst du nun komplexe Datenstrukturen für die Eingabe verwalten und hast somit weitere Möglichkeiten deine IDE Actions flexibler zu gestalten. In Zukunft werden wir auch eine neue IDE Action vorstellen, die die Tabelle verwendet, um komplexe Einstellungen vor der Generierung zu machen.





