Simple Tree Model mit User-Object

Bäume sind immer interessant, finde ich. Sie sind nicht so eintönig gleichmäßig wie die meisten Listen. Der CL_SIMPLE_TREE_MODEL hat jedoch zudem auch in der Programmierung eine schöne Besonderheit: Zu jedem Knoten kann die Instanz einer beliebigen Klasse übergeben werden. Mit der Methode NODE_GET_USER_OBJECT kann man sich dann die Instanz geben lassen und hiermit weiter arbeiten.

Tree-Ausgabe

Als Beispielaufgabe habe ich mir die folgende gestellt: Zeige alle Materialien zu einer Selektion nach Materialart unterteilt an. Also: Hauptknoten – Materialart – Materialien. Die Selektion der Daten erfolgt im Selektionsbild des Reports bei AT SELECTION-SCREEN. Auf unserem IDES-System haben ich nur ein paar Dutzend Materialien, da geht die Selektion zügig.

Mit Doppelklick auf einen Eintrag soll – je nach Knotenart „Materialart“ oder „Materialnummer“ – die jeweilige Information ausgegeben werden. Es muss also bei dem Knoten „Materialart“ eine andere Klasse verwendet werden, als bei der Knotenart „Materialnummer“.

Zusätzlich zur Demonstration des CL_SIMPLE_TREE_MODEL habe ich versucht, möglichst viele neue Sprachbefehle zu verwenden. Gerade bei der Verwendung des User-Objects macht der Befehl NEW zur Instantiierung einer Klasse die Programmierung wirklich elegant.

User-Object

für das User-Object habe ich eine Hauptklasse LCL_USER_OBJECT_MARA definiert:

Die Klasse hat nur das Attribut MARA, das bei der Erzeugung mitgegeben werden muss und die Methode GET_TEXT mit der ein Text zum Objekt ermittelt wird.

Da ich die Klasse als ABSTRAKT definiert habe, kann ich diese Klasse nicht instantiieren. Das geht nur bei den von dieser Klasse abgeleiteten Klassen:

In der Klasse MTART redefiniere ich die Methode „GET_TEXT“ um einen eigenen Text für Materialart zu bekommen.

Die Klasse MATNR ist nur eine leere Hülle, da sie alles andere von der Hauptklasse erbt.

Natürlich hätte ich auch zwei komplett unterschiedliche und voneinander unabhängige Klassen definieren können.

Hauptprogramm

Das Hauptprogramm besteht nur den Selektionsparametern und aus zwei Ereignissen:

  1. dem Ereignis INITIALIZATION, in dem ich den Docking-Container erzeuge und
  2. dem Ereignis AT SELECTION-SCREEN, in dem ich die Daten selektiere und den Baum erzeuge

Hauptklasse

Die Klasse LCL_MAIN, in der die Logik des Programms vorhanden ist, besteht aus diesen vier Methoden:

  1. Create_Docker
  2. Create_Tree
  3. Get_Data
  4. Add_Nodes

Zusätzlich gibt es noch die Methode zur Ereignisbehandlung des Doppelklicks auf einen Knoten: Handle_Node_Double_Click.

Create_Docker

So simple:

 

Get_Data

Ebenfalls nicht spektakulär:

Zur Fehlerbehandlung habe ich eine eigene Exception-class erstellt:

Create_Tree

Bei der Erzeugung des CL_SIMPLE_TREE_MODEL bin ich auf die erste Hürde gestoßen, denn die Erzeugung des Control läuft etwas anders, als bei den meisten anderen GUI-Controls. Normalerweise instantiiert man das GUI-Control unter Angabe des Containers in das das Control eingefügt werden soll (Parameter PARENT). Nicht so bei dieser Klasse. Hier wird erst das Tree-Objekt erzeugt und danach mit der Methode CREATE_TREE_CONTROL an den PARENT-Container gehängt:

Das Event Doppelklick wird hier ebenfalls registriert und der event handler dafür installiert. Zusätzlich wird der Hauptknoten ROOT eingefügt.

 

 

Add_Nodes

Mit der Methode ADD_NODE des Tree-Controls werden einzelne Knoten in den Baum eingehängt. Immer unter Angabe des Knoten-ID, des übergeordneten Knotens, Text und ein paar anderen. An dieser Stelle kann das User-Object übergeben werden, dass dann zur Knoten-ID zur Verfügung steht:

Ereignisbehandler

Im Ereignisbehandler prüfen wir, welchen Objekttyp das User-Object hat, um gegebenenfalls anders reagieren zu können:

In diesem Fall verwenden wir zwar für MTART und MATNR die gleiche Methode GET_TEXT, aber hier könnte man je Objekt eine andere Funktion ausführen. Falls im ABAP Release die Syntax IS INSTANCE OF noch nicht verfügbar ist, muss mit TRY – CATCH geprüft werden, ob der Cast zwischen OBJECT und User-Object erfolgreich war oder nicht:

Das komplette Programm