This is a test message to test the length of the message box.
Login
|
ABAP RAP Virtuelle Felder sortieren
Erstellt von Software-Heroes

RAP - Virtuelle Felder sortieren

148

Haben wir virtuelle Felder in einer Entität im ABAP RESTful Application Programming Model implementiert, wie können wir dann eigentlich eine Sortierung verwenden? Schauen wir uns einmal den Prozess dazu an.

Werbung


In diesem Artikel ergänzen wir unsere Entität mit einfachen virtuellen Feldern und implementieren eine Sortierung, um später auch über die Felder Einschränkungen vornehmen zu können.

 

Einleitung

Du hast virtuelle Felder in deinem RAP Objekt definiert? Damit stehen dir weitere Möglichkeiten zur Verfügung zusätzliche Informationen im UI anzuzeigen, die so auf der Datenbank nicht vorkommen. In diesem Artikel erweitern wir unsere Sales App im ersten Schritt durch virtuelle Felder, schauen uns dann die Handhabung mit dem UI an und ergänzen zum Abschluss die Möglichkeit, auch über die Felder zu sortieren.

 

Virtuelle Felder

Dazu definieren wir zwei neue Informationen in der Entität ZBS_C_SASale. Wir möchten gern im UI die Informationen zum Jahr und zum Monat haben, die wir in diesem Fall aus dem Verkaufsdatum ableiten. Normalerweise würden wir das über ein Statement im Core Data Service machen können. Daher machen wir das vor allem zu Demonstrationszwecken und empfehlen das nur bedingt als Standard.

 

Elemente 

Legen wir dazu die Elemente im View an. Über das Schlüsselwort VIRTUAL definieren wir lokale Elemente im Consumption View und geben ihnen spezifische Typen für das Frontend. In diesem Fall verwenden wir einfach Elemente. Über die Annotation definieren wir die Klasse, die später die Ableitung der Felder vornimmt.

@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
virtual SalesYear : abap.char(4),

@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
virtual SalesMonth : abap.char(2),

 

Metadata Extension

Wir ergänzen nun die Metadata Extension und legen die Felder nach dem SaleDate an. Wir wollen sie im List Report und auf der Object Page anzeigen und geben den Elementen ein Label, damit im UI entsprechende Texte vorhanden sind.

@UI.lineItem: [ { position: 32  } ]
@UI.identification: [ { position: 32 , qualifier: 'GENERAL' } ]
@EndUserText.label: 'Sales Year'
SalesYear;

@UI.lineItem: [ { position: 33  } ]
@UI.identification: [ { position: 33 , qualifier: 'GENERAL' } ]
@EndUserText.label: 'Sales Month'
SalesMonth;

 

Exit

Im nächsten Schritt implementieren wir den SADL Exit, also die Klasse, die wir in den Annotationen angegeben haben. In der Methode GET_CALCULATION_INFO fordern wir das Feld SalesDate an, da wir dieses für die Ableitung benötigen.

et_requested_orig_elements = VALUE #( ( `SALESDATE` ) ).

 

In der Methode CALCULATE machen wir dann die Ableitung der Elemente und Befüllung pro Datensatz die Informationen. In diesem Fall machen wir per SUBSTRING eine Extraktion der Informationen in die Zielfelder und übergeben die Informationen an den Aufrufer. Die komplette Logik findest du im Repository.

CASE element.
  WHEN `SALESYEAR`.
    original->SalesYear = substring( val = original->SalesDate
                                     off = 0
                                     len = 4 ).
  WHEN `SALESMONTH`.
    original->SalesMonth = substring( val = original->SalesDate
                                      off = 4
                                      len = 2 ).
ENDCASE.

 

Testdaten

Damit wir später die neuen Filter testen können, fügen wir noch einige neuen Datensätze auf oberer Ebene ein, sodass wir im List Report verschiedene Jahre und Monate zur Verfügung haben. Die zusätzlichen Daten findest du in der Klasse ZCL_BS_DEMO_RAP_SALES_FIELDS, die wir noch einmal ausführen, um die Tabellen zu befüllen. Sind wir damit fertig, können wir in die Anwendung wechseln und die Selektion ausführen.

 

Monat und Jahr wird in einer eigenen Spalte angezeigt und in der Liste als Element ergänzt.

 

Sortierung

Wie sieht es eigentlich mit der Sortierung der Datensätze aus? Unten im Artikel haben wir dir die Dokumentation dazu verlinkt, schauen wir uns dazu die Beispiele an.

 

Aktueller Stand

Aktuell finden wir die Felder nicht in der Sortierung. Wenn du auf die Spaltenüberschrift klickst, dann fehlt die Funktion der Sortierung, ebenfalls wenn wir in die Standardeinstellungen der Tabelle schauen.

 

Implementierung

Um nun die Sortierung und die Funktion für die Felder zu aktivieren, benötigen wir eine Annotation und eine zusätzliche Implementierung in der Klasse. Dazu erweitern wir die Metadata Extension der virtuellen Elemente um die Annotation "ObjectModel.sort.transformedBy" und müssen wieder einen ABAP Exit angeben. In diesem Fall können wir auch die gleiche Klasse, wie bei der Ermittlung der Daten verwenden.

@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
@ObjectModel.sort.transformedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
virtual SalesYear : abap.char(4),

@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
@ObjectModel.sort.transformedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
virtual SalesMonth : abap.char(2),

 

In unserer Klasse implementieren wir nun das Interface IF_SADL_EXIT_SORT_TRANSFORM mit der Methode MAP_ELEMENT. Dabei besteht die Aufgabe des Exits, das virtuelle Feld auf ein echtes Element zu mappen, welches dann direkt auf der Datenbank sortiert werden kann. Dabei funktioniert das nur sinnvoll für bestimmte Elemente. Grundsätzlich solltest du überprüfen, ob die richtige Entität und die richtigen Elemente übergeben wurden, wenn der Exit mehrfach verwendet wird.

 

In diesem Fall referenzieren unsere beiden Elemente auf dem SalesDate, weshalb wir dieses im Mapping hinterlegen und als Sortierelement festlegen.

METHOD if_sadl_exit_sort_transform~map_element.
  IF iv_element = 'SALESYEAR'.
    INSERT VALUE #( name = 'SALESDATE' ) INTO TABLE et_sort_elements.
  ENDIF.

  IF iv_element = 'SALESMONTH'.
    INSERT VALUE #( name = 'SALESDATE' ) INTO TABLE et_sort_elements.
  ENDIF.
ENDMETHOD.

 

Anzeige

Testen wir nun einmal das Verhalten im UI. Durch die Annotationen ist die Sortierung auf den Feldern aktiviert worden. Klicken wir nun auf den Spalten Header, dann werden die Möglichkeiten zur Sortierung und Gruppierung geladen.

 

Sortieren wir einmal das Jahr absteigend. Dann werden die verschiedenen Jahreszahlen sauber sortiert und dargestellt, das Kriterium funktioniert so weit sauber.

 

Sortieren wir in unserem zweiten Beispiel einmal nach dem Monat aufsteigend. In diesem Beispiel sehen die Spalten wild gewürfelt aus und es scheint keine Sortierung zu herrschen. Hier sollten wir die Logik dahinter verstehen. Wir sortieren in diesem Fall nach dem Datum, welches richtig sortiert wurde. Der Monat ist nur eine Extraktion und damit erhalten wir ein unsauberes Element. In diesem Fall sollten wir die Sortierung über den Monat eigentlich wieder deaktivieren.

 

Filterung

Eigentlich wollten wir den Artikel über die Filterung von virtuellen Elementen schreiben. Hierbei müssen wir ebenfalls eine Annotation "ObjectModel.filter.transformedBy" am virtuellen Element ergänzen und im Exit eine Methode implementieren. Allerdings ist der Exit aktuell nicht für ABAP Cloud freigegeben und damit können wir das Szenario nicht an unserer Implementierung im ABAP Environment zeigen. Grundsätzlich kannst du dich an der Implementierung für die Sortierung halten, wenn du On-Prem die Methode implementierst.

 

Vollständiges Beispiel

Alle Ressourcen findest du bei uns im GitHub Repository und die Änderungen aus diesem Artikel im folgenden Commit. Damit solltest du alle Anpassungen nachvollziehen können und kannst bei dir den Fall nachstellen bzw. nachbauen.

 

Fazit

Die Implementierung von Zusatzlogik auf virtuellen Elementen ist recht einfach und schnell gemacht. Allerdings solltest du dir auch Gedanken machen, ob in so einem Fall auch das richtige Ergebnis herauskommt und im schlechtesten Fall die Logik für das Element deaktivieren.

 

Quelle:
SAP Help - Filtering of Virtual Elements
SAP Help - Sorting of Virtual Elements


Enthaltene Themen:
RAPBTPVirtuelle ElementeSortierungREX7
Kommentare (0)



Und weiter ...

Bist du zufrieden mit dem Inhalt des Artikels? Wir posten jeden Dienstag und Freitag neuen Content im Bereich ABAP und unregelmäßig in allen anderen Bereichen. Schaue bei unseren Tools und Apps vorbei, diese stellen wir kostenlos zur Verfügung.


ADT - RAP Extension Assistent [MIA]

Kategorie - ABAP

Du möchtest ein RAP Objekt erweitern und weißt nicht genau wo du starten sollst? Vielleicht hilft dir die Idee des Extension Assistant weiter und leitet dich Schritt für Schritt durch den Prozess.

06.03.2026

ADT - RAP Analyzer [MIA]

Kategorie - ABAP

Die Einarbeitung und Übersicht in bestehende RAP Objekte kann nicht immer einfach sein, vor allem wenn es sich um komplexe Objekte handelt. Fragen wie das verwendete Pattern und wichtige Objekte müssen sich meist erarbeitet werden.

24.02.2026

RAP - Position der Buttons

Kategorie - ABAP

In diesem Artikel schauen wir uns die verschiedenen Positionen der Buttons an. Wo können wir in RAP die verschiedenen Actions platzieren und wie nutzen wir diese.

17.02.2026

RAP - Analytical Table

Kategorie - ABAP

Schauen wir uns einmal in RAP das letzten fehlende Puzzlestück zur Ablösung des ALVs an und wie wir die Analytical Table mit wenig Aufwand einrichten können.

13.02.2026

RAP - Mixed Content

Kategorie - ABAP

Wie bekommen wir eigentlich unterschiedlichen Content in die gleiche Spalte im List Report? Schauen wir uns dazu einmal ein praktisches Beispiel für unsere Sales App an.

10.02.2026