Ausnahmeaggregation mit ABAP CDS-Views (Querydesign Teil 3)
Einleitung
Im Blog „Kennzahlen und Textvariablen in ABAP CDS“, wurde gezeigt wie eingeschränkte bzw. berechnete Kennzahlen in CDS-Views erstellt werden und man die aus dem BW bekannten Textvariablen zum Teil ersetzen kann. Aufbauend auf die Query aus dem letzten Blog, möchten wir in einem sehr kurzen Beitrag auf Ausnahmeaggregationen in CDS-Views eingehen.
Durchschnitt
Zunächst wollen wir in der Query ZC_KST_QUERY_DVU den monatlichen Durschnitt der Ist Daten berechnen. Dazu legen wir eine neue Kennzahl namens ActAvg an (siehe Zeilen 50-55):
Mit der Annotation AnalyticsDetails.exceptionAggregationSteps.exceptionAggregationBehavior wird die Aggregationsart festgelegt. Hier setzen wir den Wert #AVG (Durchschnitt). Generell stehen folgende Ausnahmeaggregationen zur Verfügung: SUM, MIN, MAX, COUNT, AVG, STD, FIRST, LAST. Durch AnalyticsDetails.exceptionAggregationSteps.exceptionAggregationElements, werden die entsprechenden Referenzfelder angegeben. Für den Durchschnitt pro Monat wählen wir daher periode. Da lediglich Ist Daten berücksichtigt werden sollen, geben wir in der Formel die Kennzahl act an.
Nach Ausführen der Query, sehen wir die neue Kennzahl (Mon. Durchschnitt Ist) mit dem korrekten Wert in den Spalten:
An der Stelle kann gesagt werden, dass nicht alle vom BW Querydesigner bekannte Funktionen für CDS Views von Haus aus zur Verfügung stehen. So kann man für berechnete Kennzahlen beispielsweise keine Einstellungen für lokale Berechnungen setzen (z.B. Einzelwert als gleitenden Durchschnitt berechnen) oder standardmäßig Nullsätze aus den Ausnahmeaggregationen ausschließen. Wie sich letzteres auswirkt, sehen wir uns im nächsten Punkt an.
Wir wollen nun die Anzahl der Kostenstellen für die Ist Daten ausgeben und legen eine neue Kennzahl CostcenterCount in den Zeilen 56-61 an:
Als Ausnahmeaggregation legen wir COUNT und als Referenzfeld die Kostenstelle kst fest. Die Kennzahl wird ebenfalls in die Spalten gelegt. Die Query zeigt folgendes Ergebnis:
Wie erwartet, werden die Kostenstellen gezählt, jedoch scheint hier erstmalig die Kostenstelle 0069300000 auf, welche in den beiden ausgewerteten Versionen lediglich Nullwerte aufweist, und bisher durch die Nullzeilenunterdrückung ausgeblendet wurde. Zunächst möchten wir wissen, wie die Sätze entstanden sind. Erinnern wir uns an dieser Stelle an die Kennzahlendefinition im Cube im letzten Blog zurück:
Für alle Versionen, welche ich den CASE Bedingungen nicht inbegriffen sind, wurden Nullsätze erzeugt, was bedeutet, dass die Kostenstelle 0069300000 ursprünglich nur Werte in einer Version ungleich 000 bzw. 221 aufwies, und daher im Cube Nullwerte für diese beiden Versionen generiert wurden. Diese Kostenstelle soll jedoch logischerweise nicht mitgezählt werden. Wie bereits erwähnt, fehlt uns hier von Haus aus eine Funktion die Nullwerte in Ausnahmeaggregationen unberücksichtigt lässt.
Für die Zählung lässt sich das Problem noch mit einem Workaround umgehen, indem man SUM als Ausnahmeaggregation mir einer gewissen Formellogik kombiniert. Die Herangehensweise ist in folgendem SAP Blog sehr gut erklärt, und ließe sich genauso auf unser Beispiel anwenden:
https://blogs.sap.com/2021/04/22/count-not-zero-exception-aggregation-with-abap-cds-view/
Was sich jedoch in diesem speziellen Fall noch mit einem einfachen Workaround lösen lässt, wird in anderen Fällen bereits schwieriger. Beispielsweise wenn man den durchschnittlichen Wert pro Kostenstelle errechnen will, jedoch Kostenstellen mit lediglich Nullwerten nicht berücksichtigt werden sollen. Derartige und ähnliche Situationen könnten es erforderlich machen, die Nullwerte bereits im Vorhinein an entsprechender Stelle im Datenmodell auszuschließen. Dies wiederum würde oft in eine zusätzliche Schicht bzw. View im Modell münden, da das nicht erst auf Query Ebene durchgeführt werden kann.
Conclusio
Generell ist die Anwendung von Ausnahmeaggregation in CDS Query Views mithilfe der entsprechenden Annotationen leicht möglich gemacht worden. Es stehen jedoch nicht alle, in der Praxis oft notwendigen Funktionen, standardmäßig zur Verfügung. Dadurch werden gängige Szenarien in der Praxis, sicherlich Sonderlösungen, die eines größeren Aufwandes bedürfen, erforderlich machen.