
RAP - Mixed Content
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.
Inhaltsverzeichnis
In diesem Artikel gruppieren wir mehrere Felder in einer Spalte und blenden Elemente dymanisch aus, die wir nicht mehr sehen wollen.
Einleitung
In unserer Sales App haben wir auch einen Bereich für Abweichungen. Dabei wollen wir vermerken, um wie viel wir vom eigentlichen Wert des Verkaufs abweichen. Dabei steht uns ein fester Betrag zur Verfügung, aber auch ein Feld für eine prozentuale Abweichung. Eine der beiden Informationen wollen wir gern im List Report anzeigen, ohne dabei zu viel Platz mit 4 Spalten wegzunehmen. Dazu wollen wir die verschiedenen Spalten in Gruppen zusammenführen und anzeigen.
Annotation
Erweitern wir dazu im ersten Schritt unsere Metadata Extension ZBS_C_SASale, damit wir die Felder im List Report in eine Spalte bekommen. Dazu definieren wir pro Spalte ein neues "UI.lineItem", was dafür sorgt, dass das Feld als eigene Spalte dargestellt wird. Den Typ setzen wir nun auf "AS_FIELDGROUP", um eine Gruppe bilden zu können und definieren eine ID über "valueQualifier". Alle Felder die nun in der gleichen Spalte sein sollen, erhalten nun noch eine "UI.fieldGroup" mit dem passenden Qualifier. Es muss aber auch an dem gleichen Feld definiert werden, welches wir bereits mit dem LineItem markiert haben. Für die beiden Spalten erhalten wir nun die folgenden zusätzlichen Annotationen:
@UI.lineItem: [ { position: 55, type: #AS_FIELDGROUP, valueQualifier: 'DIFF_NUM', label: 'Difference' } ]
@UI.fieldGroup: [{ qualifier: 'DIFF_NUM' }]
DifferenceAmount;
@UI.lineItem: [ { position: 57, type: #AS_FIELDGROUP, valueQualifier: 'DIFF_UNIT', label: 'Difference (Unit)' } ]
@UI.fieldGroup: [{ qualifier: 'DIFF_UNIT' }]
DifferenceCurrency;
@UI.fieldGroup: [{ qualifier: 'DIFF_NUM' }]
DifferenceQuantity;
@UI.fieldGroup: [{ qualifier: 'DIFF_UNIT' }]
DifferenceUnit;
Laden wir unsere Liste und den Liste Report noch einmal, dann erhalten wir neue Spalten mit entsprechenden Überschriften und die Felder werden untereinander dargestellt.
Virtuelle Felder
Aktuell sieht das UI aber noch nicht sehr ansprechend aus, die Felder werden doppelt dargestellt und leere Informationen interessieren uns eigentlich nicht. Daher wollen wir am besten diese Informationen ausblenden, was wir leicht über virtuelle Felder erreichen können. Definieren wir dazu in unserer Entität ZBS_C_SASale die entsprechenden virtuellen Felder.
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
virtual isAmountHidden : abap_boolean,
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_RAP_SALES_VE'
virtual isQuantityHidden : abap_boolean,
Dazu müssen wir noch die Ableitungslogik in der Klasse ZCL_BS_DEMO_RAP_SALES_VE implementieren. Wir nehmen dazu in der Methode GET_CALCUALTION_INFO die Felder "DifferenceAmount" und "DifferenceQuantity" auf, da diese die Grundlage zur Ableitung sind. Zum Abschluss erweitern wir den CASE in der Methode CALCULATE, um die beiden virtuellen Felder zu befüllen.
WHEN 'ISAMOUNTHIDDEN'.
original->isAmountHidden = xsdbool( original->DifferenceAmount IS INITIAL ).
WHEN 'ISQUANTITYHIDDEN'.
original->isQuantityHidden = xsdbool( original->DifferenceQuantity IS INITIAL ).
Ist das entsprechende Feld leer, dann wollen wir diese Information im UI ausblenden. Damit das Ausblenden dann auch vom UI übernommen wird, müssen wir im letzten Schritt die Metadata Extension anpassen und die Annotation "hidden" an den Elementen ergänzen. Die neuen Annotationen sollten wie folgt aussehen.
@UI.lineItem: [ { position: 55, type: #AS_FIELDGROUP, valueQualifier: 'DIFF_NUM', label: 'Difference' } ]
@UI.fieldGroup: [{ qualifier: 'DIFF_NUM', hidden: #(isAmountHidden) }]
DifferenceAmount;
@UI.lineItem: [ { position: 57, type: #AS_FIELDGROUP, valueQualifier: 'DIFF_UNIT', label: 'Difference (Unit)' } ]
@UI.fieldGroup: [{ qualifier: 'DIFF_UNIT', hidden: #(isAmountHidden) }]
DifferenceCurrency;
@UI.fieldGroup: [{ qualifier: 'DIFF_NUM', hidden: #(isQuantityHidden) }]
DifferenceQuantity;
@UI.fieldGroup: [{ qualifier: 'DIFF_UNIT', hidden: #(isQuantityHidden) }]
DifferenceUnit;
Test
Für den Test des UI haben wir den Datengenerator ZCL_BS_DEMO_RAP_SALES_DATA noch einmal angepasst, sodass auch die Feldinformationen befüllt werden uns wir Daten für den Test haben. Laden wir das UI neu, dann werden nun die Informationen sauber angezeigt.
Die Zeilen im unteren Bereich sind leer, da dort keine der beiden Informationen gefüllt sind, entsprechend werden sie über die virtuellen Elemente auch ausgeblendet. Zwischen den Beispieldaten wirst du einmal auch beide Informationen finden, hier macht es durchaus Sinn über eine Validierung zu prüfen, dass nur eine der beiden Informationen befüllt wird. Damit ist die Funktion umgesetzt und wir können uns zum Abschluss noch einmal die Spalte genauer anschauen. Wenn wir auf den Header klicken, finden wir die gruppierten Felder noch einmal in der Übersicht und können hier weitere Einstellungen, wie die Sortierung, definieren.
Vollständiges Beispiel
Das vollständige Beispiel findest du in GitHub im entsprechenden Paket für die Sales App. Die Änderungen aus diesem Artikel findest du in diesem Commit und kannst damit die Änderungen, plus die Zusatzinformationen, nachvollziehen.
Fazit
Mit Feldgruppen kannst du mehr machen als nur Elemente auf der Object Page zu gruppieren. Du kannst sie ebenso nutzen, um den Inhalt im List Report in den verschiedenen Spalten zu gruppieren. Vor allem wenn nicht mehr so viel Platz zur Verfügung steht, kannst du damit sinnvolle Erweiterungen zur Verfügung stellen.



