Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Sparklines als Verwandlungskünstler

Daten, die man ohne Kontext betrachtet, sind nicht nur langweilig, sie führen auch leicht in die Irre und sind fast immer wertlos. Dank der Sparklines, die zusätzlich zu einem Analysewert beispielsweise seine historische Entwicklung anzeigen, wissen Berichte wieder mehr zu berichten. Noch spannender wird es, wenn zu einem Analysewert neben der historischen auch die geplante Entwicklung in ein und demselben Sparkline angezeigt würde. Wendet man auf einen solchen Sparkline dann noch die DeltaMaster Notationsstandards an, so ließen sich Planwerte im Gegensatz zu Ist-Werten als hohle Säulen darstellen und der Betrachter würde sofort und ohne zusätzliche Legende erkennen, ab wann die Wertart in der vorliegenden Zeitreihe wechselt. Der folgende Blogbeitrag beschreibt, wie solche wunderbaren Verwandlungs-Sparklines definiert werden.

Grundkonzept

Die DeltaMaster Pivottabellen bieten zahlreiche vordefinierte Standards, mit denen die Anzeige von Sparklines auf die jeweiligen Berichtsanforderungen angepasst werden kann. Darüber hinaus ermöglichen die DeltaMaster Flexreports aber noch eine sehr viel individuellere Konfiguration. Dies geschieht anhand von benutzerdefiniertem MDX, wodurch sich dem Anwender nahezu unbegrenzte Möglichkeiten zur Nutzung von Sparklines bieten.

Um einen Verwandlungs-Sparkline zu erzeugen ist es notwendig, diejenigen Perioden, die dargestellt werden sollen, und einen Parameter zum Umschalten der Datenart bei bzw. ab einer bestimmten Periode anzugeben. Es reicht also nicht aus, zwei Sparklines mit den jeweiligen Datenarten isoliert von einander zu definieren, die jeweiligen Verläufe in unterschiedlichen Zellen eines Flexreports zu packen und diese dann so zu formatieren, als ob es sich bei der Anzeige um eine einzige fortlaufende Zeitreihe handelt. Hierbei würde eine enorm wichtige Komponente hinsichtlich der Darstellung verloren gehen: die einheitliche Skalierung der Werte. Um dies zu vermeiden, muss ein Sparkline definiert werden, der neben den Perioden die Datenart als weiteres Merkmal trägt und komplett in einer einzigen Zelle eines Flexreports angezeigt wird.

Notationsregeln

Einem Verwandlungs-Sparkline soll man auf einen Blick ansehen, wo über das Budget und wo über Ist-Ergebnisse berichtet wird. Hierfür gibt es in DeltaMaster an zentraler Stelle die Notationsregeln (siehe hierzu auch die DeltaMaster Clicks! vom August 2009). Gestartet wird der Editor für die Notation über das Menü Modell. Auf der rechten Seite des Dialogs wird festgelegt, für welches Objekt eine Regel angelegt wird. Für unsere Verwandlungs-Sparklines benötigen wir Elementregeln, die sich auf die Dimensionselemente Ist und Plan aus der Wertart-Dimension beziehen. Wenngleich wir für die Datenart Ist keine spezielle Art der Notation anwenden, ist es dennoch erforderlich, hierfür eine Regel zu hinterlegen. Ansonsten kann es zu Darstellungsfehlern im Verwandlungs-Sparkline kommen. Das zu formatierende Element wird nun über den Link Auswählen, der den Dimensionsbrowser in der eingestellten Dimension und Hierarchie öffnet, definiert. Anschließend muss der Balkenstil der jeweiligen Wertart definiert werden. Die Voreinstellung für alles, was keiner Regel unterliegt, ist ausgefüllt; daher wird diese Option nicht eigens angeboten. Für die Datenart Ist sind folglich keine weiteren Angaben nötig. Hinsichtlich der Datenart Plan sollte der Balkenstil hohl gewählt werden.

Schaltzeitpunkt

Ein weiterer Parameter für die Verwandlungs-Sparklines ist die Angabe des Zeitpunkts, ab dem von einer in eine andere Datenart geschaltet werden soll. Hierzu eignet sich die in der Sicht eingestellte Periode, die der DeltaMaster anhand der <view>-Variablen auslesen und in seinen MDX-Statements verwenden kann. Dadurch ist sichergestellt, dass der Anwender den Schaltzeitpunkt durch eine entsprechende Sichteinstellung frei bestimmen kann. Hinsichtlich der Schaltlogik ist es ratsam, entweder bei der in der Sicht eingestellten Periode oder deren Folgeperiode die Datenart zu wechseln. Im ersten Fall bedeutet dies, dass beispielsweise bei <view> = 2010 die Istwerte bis 2009 und Planwerte ab 2010 angezeigt werden (Jahr in Sicht ~ erstes Plan-Jahr), während im zweiten Fall die Planwerte erst ab 2011 angezeigt werden (Jahr in Sicht ~ letztes Ist-Jahr). Die jeweils gewünschte Logik muss im Rahmen der MDX-Abfrage zur Definition des Verwandlungs-Sparklines berücksichtigt werden.

Anzahl der Perioden

Es gibt verschiedene Prinzipien, um die Perioden, die im Sparkline angezeigt werden sollen, zu definieren.

Mit Pick-Listen (bspw. {[Perioden].[Alle Jahre].[2008], [Perioden].[Alle Jahre].[2009], [Perioden].[Alle Jahre].[2010]}) lassen sich die gewünschten Perioden auf einfachste Weise auswählen. Allerdings handelt es sich hier um eine statische Auswahl an Perioden, die bei jeder Änderung, wie beispielsweise einem Jahreswechsel, manuell angepasst werden müsste. Auf Grund des hohen Wartungsbedarfs empfehlen sich Pick-Listen eher nicht.

Mehr Dynamik bieten strukturgetriebene Listen, die beispielsweise alle Jahre der Periodendimension beinhalten (bspw. {[Perioden].[Jahr].Members}). Nachteilig ist, dass derartige Listen NULL-Elemente (bspw. zukünftige Perioden ohne Werte) beinhalten können oder eine unerwünscht hohe Anzahl an Perioden liefern (bspw. Perioden, die viel zu weit zurückliegen).

Letzteres lässt sich mit sichtgetriebenen Listen umgehen. Hier regelt die in der Sicht ausgewählte Periode die Zusammensetzung der Liste. Auf dieser Weise könnten beispielsweise immer die letzten 3 Jahre sowie die beiden Folgejahre basierend auf der aktuellen Sichteinstellung ausgewählt werden ({<view>.lag(3):<view>.lead(2)}). Wenngleich sich so die Anzahl der Perioden einer Liste regulieren lässt, so besteht nach wie vor die Gefahr, dass sich NULL-Elemente darunter befinden.

Datengetriebene Listen stellen sicher, dass ausschließlich Perioden mit Werten angezeigt werden. Meist genügen hierzu ein oder zwei Filterkriterien (bspw. {Filter([Perioden].[Jahr].Members, ([Measures].[Absatz], [Wertarten].[Ist]) = 0 OR ([Measures].[Absatz], [Wertarten].[Plan]) = 0)}). Der Nachteil datengetriebener Listen liegt wieder einmal darin, dass ggf. eine zu hohe Anzahl an Perioden geliefert wird.

Optimal scheint also eine Kombination aus sicht- und datengetriebenen Listen zu sein. Diese verbinden die benutzerdefinierte Auswahl der Perioden (sichtgetriebener Ansatz) mit der Unterdrückung von NULL-Elementen (datengetriebener Ansatz). Der Wertefilter bezieht sich also auf eine benutzerdefinierte Teilmenge aller im Modell definierten Perioden (bspw. Filter({<view>.lag(3):<view>.lead(2)}, ([Measures].[Absatz], [Wertarten].[Ist]) = 0 OR ([Measures].[Absatz], [Wertarten].[Plan]) = 0) ).

Benutzerdefiniertes MDX-Statement

Die folgende Pivottabelle zeigt die Logik, die zur Definition der Verwandlungs-Sparklines per MDX implementiert werden muss. Auf Basis der in der Sicht ausgewählten Periode (im folgenden Beispiel 2008) wechselt die Datenart ab dem Jahr 2008 von Ist auf Plan. Planwerte, die aufgrund der Notationsregel automatisch als hohle Balken angezeigt werden, signalisieren den Wechsel.

Ausgangspunkt für die Erstellung eines Verwandlungs-Sparklines ist meist eine Pivottabelle. Hierbei spielt es grundsätzlich keine Rolle, ob die Pivottabelle auf eine bestimmte Wertart gefiltert ist. Die spätere Anzeige der Sparklines würde diesen Filter einfach überschreiben. Es muss aber unbedingt darauf geachtet werden, dass die Analysewerte nicht auf eine bestimmte Wertart gefiltert sind. Sonst besteht die Gefahr, dass Werte im Verwandlungs-Sparkline zwar als Ist-Werte dargestellt werden, in Wirklichkeit aber Planwerte sind. Dies muss unbedingt vermieden werden. Verwenden Sie daher keine Analysewerte, die auf Wertarten gefiltert sind. Durch Umwandlung der Pivottabelle in einen Flexreport mit Zellreferenzen erhält man also die Basis zu weiteren Definition der Verwandlungs-Sparklines.

In den Zelleigenschaften eines Flexreports lassen sich nun über das Register Sparkline benutzerdefinierte Sparklines erzeugen. Für unseren Verwandlungs-Sparkline ist folgende MDX-Syntax erforderlich:

Das MDX-Statement erzeugt eine Menge an Tuples aus [Periode] und [Wertart] (im obigen Beispiel für alle Jahre). Hierfür dient der GENERATE-Befehl. Bei der Zusammensetzung der Tuple wird anhand einer WENN-DANN-Klausel geprüft, ob die gerade behandelte Periode kleiner als die in der Sicht ausgewählte Periode ist. Dies leistet das IIF-Statement, indem es die jeweiligen Objektränge miteinander vergleicht. Bei WAHR wird ein Tuple aus der gerade behandelten Periode und der Datenart Ist erzeugt, bei FALSCH ein entsprechendes Tuple mit der Datenart Plan.

Generate

--     Parameter: Anzahl der Perioden
      ([Perioden].[Jahr].Members,

--     Erstelle ein Tuple aus [Jahr] und [Wertart]
       {[Perioden]} * StrToSet

        --     Wenn aktuelle Periode < als Periode der Sicht
               (Iif(Rank([Perioden], [Perioden].[Jahr].Members) < Rank(<view>,                  
               [Perioden].[Jahr].Members),

        --     WAHR: dann Wertart "Ist"
               "{[Wertarten].[Ist]}",
        --     FALSCH: sonst Wertart "Plan"
               "{[Wertarten].[Plan]}")
               )
        )

DIMS [Perioden],[Wertarten]

 

Damit das MDX-Statement auch wirklich funktioniert, gilt es zwei Kniffe zu beachten. Zum einen muss an allen denkbaren Stellen auf die Angabe des .CurrentMember verzichtet werden. Ansonsten kommt es im Rahmen des GENERATE stets zu einer unerwünschten Ersetzung der Perioden mit der ausgewählten Periode der Sicht. Das Ergebnis bei Verwendung von .CurrentMember wäre dann die Anzeige eines einzigen Sparklines, der die in der Sicht eingestellte Periode zeigt. Zum anderen muss im MDX-Statement explizit aufgeführt werden, aus welchen Dimensionen bzw. Hierarchien die Tuple gebildet werden. Hierzu gibt es einen DeltaMaster-spezifischen DIMS-Befehl, dem die jeweiligen Dimensions- bzw. Hierarchienamen folgen müssen.

Das Ergebnis ist der Verwandlungs-Sparkline, der in einer einzigen Zelle die historische mit der zukünftigen (geplanten) Entwicklung verbindet und dank der Notationsregeln klar signalisiert, wann der Wechsel der Datenart erfolgt. Bitte beachten Sie, dass die neben den Sparklines angezeigten Werte nicht zwingend den Wert des letzten, rechten Sparklines repräsentieren, sondern vielmehr von der Sichteinstellung abhängen. Im folgenden Beispiel repräsentieren die Werte den letzten Istwert (also die 3. Säule von links).

Verschieben des Schaltzeitpunktes

Für den Fall, dass die in der Sicht ausgewählte Periode nicht das erste Planjahr, sondern das letzte Ist-Jahr bestimmt, ist der Vergleich der Ränge zwischen den im GENERATE verwendeten Perioden und der Sichteinstellung wie folgt anzupassen:

(Iif(Rank([Perioden], [Perioden].[Jahr].Members) < Rank(<view>.lead(1), [Perioden].[Jahr].Members)

Vergleich verschiedener Prinzipien zur Auswahl der Perioden

Eingangs wurden verschiedene Prinzipien zur Auswahl der Perioden diskutiert. Im folgenden Screenshot sind die unterschiedlichen Resultate mit ihren jeweiligen Vor- und Nachteilen aufgeführt. Grundlage bildet ein Datenmodell mit den Jahren 2005 bis 2011, wobei die Plan-Werte nur bis zum Jahr 2009 reichen.

Weitere Verwandlungen

Unser obiges MDX-Statement ist als eine Vorlage zur Definition von Verwandlungs-Sparklines zu verstehen. Es ist selbstverständlich an vielen Stellen erweiterbar. So wäre die Einbettung einer Hochrechnung für das laufende Jahr (das bspw. in der Sicht ausgewählt ist) durch eine weitere Bedingung in der WENN-DANN-Klausel möglich:

Generate


--     Parameter: Anzahl der Perioden
       ([Perioden].[Jahr].Members,

       --     Erstelle ein Tuple aus [Jahr] und [Wertart]
              {[Perioden]} * StrToSet

       --     Wenn aktuelle Periode < als Periode der Sicht
              (Iif(Rank([Perioden], [Perioden].[Jahr].Members) < Rank(<view>, 
[Perioden].[Jahr].Members),

       --     WAHR: dann Wertart "Ist"
              "{[Wertarten].[Ist]}",

       --     Wenn aktuelle Periode = Periode der Sicht
              Iif(Rank([Perioden], [Perioden].[Jahr].Members) = Rank(<view>, 
[Perioden].[Jahr].Members),

       --     FALSCH: dann Wertart "Hochrechnung"
              "{[Wertarten].[Hochrechnung]}",

       --     FALSCH: sonst Wertart "Plan"
              "{[Wertarten].[Plan]}"))
       )

    )

DIMS [Perioden],[Wertarten]

Trendberechnung

Es gibt einen wesentlichen Vorteil, den ein echter Verwandlungs-Sparkline gegenüber allen alternativen Darstellungsvarianten, die nicht in einer einzigen Zelle definiert sind, hat: die Berechnung eines Trends über alle angezeigten Ist- und Planwerte. Die Trendberechnung und –anzeige lässt sich im Flexreport durch entsprechende Aktivierung in den Zelleigenschaften unter dem Register Sparklines einschalten.