Sparklines ermöglichen in DeltaMaster nun schon seit über 17 Jahren die sowohl platzsparende als auch eingängige Darstellung von Kennzahlentwicklungen. Für relationale Anwendungen gibt es auch nach dieser langen Zeit Neues zu vermelden!
Sparklines in DeltaMaster
Ein Grundpfeiler unserer BI-Software DeltaMaster ist die Grafische Tabelle und Grundpfeiler der Grafischen Tabelle sind wiederum Sparklines, die bereits seit 2004 in DeltaMaster zum Einsatz kommen. Sie erlauben die kompakte, übersichtliche und sofort erfassbare Wiedergabe von Trends bei den Kennzahlen, wie z. B. hier in einer DB-Rechnung in unserer Demo-Anwendung Chair:
In Kombination mit dem Semantischen Zoom, der ohne verwirrende Berichtswechsel zusätzliche Informationen an Ort und Stelle liefert, gehen Ad-hoc-Analysen leicht von der Hand:
Zur Geschichte der Sparklines in DeltaMaster können und sollten Sie sich unseren interessanten Überblicksartikel durchlesen.
Im vorliegenden Beitrag geht es um ein kleines, aber nicht unwesentliches Detail bei den Sparklines: Mit welchem Startelement können Sparklines beginnen, wie stelle ich das ein und – besonders relevant für den heutigen Artikel – wie kann ich spezielle Anforderungen erfüllen?
Hier gab es mit dem Release 6.4.0 Erweiterungen bei relationalen Modellen, die einen dynamisch ermittelten Start der Sparklines ermöglichen – aber dazu gleich mehr.
Startelemente für Sparklines
Optionen für Startelemente für Sparklines bei relationalen Anwendungen
Rufen wir in einer relationalen Anwendung mit F4 das Optionsmenu der Grafischen Tabelle auf, so sehen wir auf dem Reiter Sparklines im oberen Teil die Einstellungsmöglichkeiten für den Beginn der Sparklines:
Neu ist hier der Punkt „benutzerdef. Ausdruck für Startelement“, um den es in diesem Beitrag hauptsächlich gehen wird.
Womöglich ist Ihnen bereits aufgefallen, dass wir in DeltaMaster in den letzten Releases die Funktionalität beim Einsatz von relationalen Modellen ständig erweitert haben. Vor allem benutzerdefinierte Ausdrücke sind uns bereits bei den Blog-Artikeln über Zeitanalyseelemente nun schon häufiger begegnet.
Besonders hilfreich ist hier die Lektüre des Artikels Zeitanalyseelemente einsetzen, der sich mit den Möglichkeiten beschäftigt, bestimmte Elemente der Zeitdimension dynamisch anzusprechen.
Die dort genannten Ansätze können wir auch bei den Sparklines gut gebrauchen.
Optionen für Startelemente für Sparklines bei multidimensionalen Anwendungen
Bevor wir uns wieder den relationalen Modellen widmen, werfen wir einen kurzen Blick auf multidimensionale Anwendungen. Beispielsweise könnten Sie auf einem OLAP-Cube mit Microsoft Analysis Services unterwegs sein. Hier sieht das Optionsmenu der Sparklines folgendermaßen aus:
Im Vergleich zu den relationalen Anwendungen gibt es zwei übereinstimmende Punkte „Beginn bei“ und „Länge“, einen zusätzlichen Punkt “Beginn bei erstem Datenwert”, sowie einen alternativen Punkt „MDX-Ausdruck für Startelement“.
MDX (Multidimensional Expressions) ist eine mächtige, aber auch komplexe Abfragesprache für OLAP-Cubes. Zur Bestimmung von Elementen gibt es bereits einige vordefinierte Funktionen wie Parent, FirstChild, Cousin, Ancestor usw.
Bei relationalen Modellen existieren diese kompakten, vordefinierten Befehle nicht und die gewünschte Funktionalität muss eigens programmiert werden. Mit der Entsprechung „benutzerdef. Ausdruck für das Startelement“ bei relationalen Modellen möchten wir die Lücke zu den MDX-Möglichkeiten verkleinern – vom völligen Schließen der Lücke zu sprechen wäre etwas zu vermessen!
Startelemente für Sparklines bei relationalen Modellen
Die bestehenden Optionen „Beginn bei“ und „Länge“
Diese beiden Optionen sind nahezu selbsterklärend. „Länge“ hatten wir bereits im ersten Beispiel eingesetzt. DeltaMaster nimmt eine Defaultlänge von 13 Monaten an, inklusive des aktuellen Monats. Damit reichen die Sparklines bis zum gleichen Kalendermonat des Vorjahres.
Mit einer Länge von 25 fangen die Sparklines beim passenden Kalendermonat des Vorvorjahres an.
Wäre im Berichtsfilter ein Quartal eingestellt, wird die eingestellte Länge wohl kleiner sein. Mit Länge = 5 geht es bis zum entsprechenden Quartal des Vorjahres und mit Länge = 9 zum Quartal des Vorvorjahres.
Mit „Beginn bei“ lässt sich eine fixe Periode einstellen. Die angezeigte Ebene richtet sich immer an der Periode im Berichtsfilter aus: Steht dort ein Quartal, kann man sich ein Quartal aussuchen, ist es ein Monat, kann unter den vorhandenen Monaten ausgewählt werden.
Spätere Perioden als die ausgewählte Berichtsfilterperiode sind für das Startelement nicht erlaubt und werden auch gar nicht erst angezeigt.
Im folgenden Beispiel ist der Beginn auf Jan 2018 eingestellt:
Natürlich wird bei diesem Ansatz die Säulenreihe mit fortschreitender Zeit immer länger.
Wir zeigen in diesem Beitrag immer Säulen, aber selbstverständlich funktionieren die gezeigten Ansätze auch für die anderen beiden Sparklines-Varianten „Linien“ und „Punktlinien“.
Benutzerdefinierte Ausdrücke für Startelemente bei Sparklines
Kommen wir nun zu der Neuerung des Releases 6.4.0, also zur Möglichkeit, einen benutzerdefinierten Ausdruck anzulegen. Hier geht es um genau die Funktionalität, wie sie grundsätzlich im Beitrag Zeitanalyseelemente einsetzen erläutert wurde, um ausgehend von der im Berichtsfilter eingestellten Periode ein anderes, in einem bestimmten Verhältnis stehendes Element der Periodendimension anzusprechen.
Die Ausdrücke, die wir gleich beispielhaft besprechen, folgen der dort beschriebenen Logik; es ist somit sinnvoll, den Beitrag Zeitanalyseelemente einsetzen erst einmal komplett zu lesen.
Während dort aber mit benutzerdefinierten Ausdrücken Zeitanalyseelemente angelegt wurden, die als Grundlage von Vergleichen dienen sollten, zeigen wir nun Konstruktionen, die bei Sparklines häufiger auftreten können. Natürlich kann es Überschneidungen bei diesen beiden Zielsetzungen geben.
Unsere Periodendimension besitzt in allen Beispielen die Ebenen Jahr, Quartal und Monat.
Sparklines mit fester Periodenlänge
Mit einem benutzerdefinierten Ausdruck könnte man auch den Punkt „Länge“ selbst nachbilden.
Diese Möglichkeit steht hier nur der Vollständigkeit halber, weil wir uns später in diesem Blogbeitrag in einem komplexeren Beispiel auf diesen Ausdruck beziehen werden. Der direkte Weg über das bereits angebotene „Länge“ ist einfacher und komfortabler.
Mit Current.Lag(12) geht es 12 Perioden zurück und somit sind dann insgesamt 13 Säulen sichtbar. Das „Current“ entspricht dem ausgewählten Berichtsfilterelement in der Periodendimension und darf in dem Ausdruck auch weggelassen werden. Die Ebene entspricht der Ebene, aus der das Berichtsfilterelement stammt.
Achtung: Sollte sich das Anfangselement außerhalb des Datenraumes befinden, wird im Gegensatz zu einer eingestellten Länge keine Säulenreihe angezeigt. Bei der Option Länge wären die ersten (< 13) Säulen noch sichtbar.
Sparklines seit Beginn des Jahres für Monate
Häufig möchte man vor allem sehen, wie sich eine Kennzahl seit Beginn eines übergeordneten Zeitraums, etwa des Jahres entwickelt hat. Bei Tagen, die aber nicht im hier verwendeten Modell enthalten sind, könnte es auch der Beginn des Monats sein.
Für ein übergeordnetes Jahr ist ein passender Ausdruck bei einem ausgewählten Monat im Berichtsfilter durch Year.FirstChild.FirstChild gegeben.
Bemerkung: Zwischen Groß- und Kleinschreibung wird nicht unterschieden; Sie könnten auch nur Kleinbuchstaben, also year.firstchild.firstchild verwenden.
Dieser Befehl bewirkt, dass vom ausgewählten Monat zum übergeordneten Jahr gesprungen wird, dann zum 1. Quartal und von dort zum 1. Monat im 1. Quartal – und somit zum Januar.
Steht der Berichtsfilter auf Januar, so wäre allerdings nur eine einzige Säule zu sehen.
Sparklines seit Beginn des Vorjahres für Monate
Deshalb erscheint die Idee plausibel, den Vorjahresverlauf immer komplett anzuzeigen, also mit dem Januar des Vorjahres zu beginnen. Der benötigte Ausdruck lautet Year.Lag(1).FirstChild.FirstChild und das eingeschobene Lag(1) bewirkt auf Jahresebene, anstelle des aktuellen Jahres das Vorjahr zu benutzen. Es ergibt sich für die Berichtsfiltermonate September und Januar nun das folgende Bild:
Natürlich muss das Vorjahr wieder in den Daten vorhanden sein. Hier wurden noch 3 Pixel zusätzlicher Säulenabstand für den Jahreswechsel reserviert, um den Beginn des aktuellen Jahres hervorzuheben.
Sparklines seit Beginn des Vorjahres für Quartale
Ist ein Quartal im Berichtsfilter ausgewählt, so muss jeweils ein „FirstChild“ aus den Ausdrücken entfernt und somit die bisherigen benutzerdefinierten Ausdrücke zu Year.FirstChild bzw. Year.Lag(1).FirstChild geändert werden. Für den letzteren Fall sieht das dann für ausgewählte Quartale im Berichtsfilter so aus:
Es ist hier etwas störend, dass die nun aufgeführten Ausdrücke wiederum nur für Quartale im Berichtsfilter ein Ergebnis liefern, aber nicht mehr für Monate.
Kann man einen benutzerdefinierten Ausdruck so erstellen, dass er für beide Ebenen, also für Monate und Quartale funktioniert?
Komfort durch Current.Level
Noch nicht von mir erwähnt wurde die Möglichkeit, das Level des Berichtsfilterelementes mit Current.Level auszulesen. Auf dem All-Element im gegebenen Modell ist Current.Level = 0, auf Jahresebene 1, auf Quartalsebene 2 und auf Monatsebene ergibt sich der Wert 3.
Diese Funktionalität erweist sich nun als sehr nützlich.
Auf eine Fallunterscheidung können wir sogar verzichten, wenn wir die folgende elegante Konstruktion verwenden, die von der tiefsten Ebene, also von den Monaten ausgeht!
Der bisherige Befehl Year.Lag(1).FirstChild.FirstChild funktioniert für Monate, Quartale und auch für Jahre im Berichtsfilter und liefert immer den Januar des Vorjahres. Aber nur für Monate im Berichtsfilter befinden wir uns mit dem Januar auf der gleichen Ebene. Was tun?
Hier hilft nun der Befehl ancestor in Kombination mit „Current.Level“!
Fügen wir ein „.ancestor(Current.Level)“ an, gelangen wir vom Januar des Vorjahres automatisch zum Vorgänger auf der gewünschten Ebene, also auf der Ebene der Berichtsfilterperiode! Der Vorgänger von Januar auf Quartalsebene ist das gewünschte 1. Quartal.
Mit einem einzigen benutzerdefinierten Ausdruck können die Sparklines dann sowohl auf Monats- als auch auf Quartalsebene angezeigt werden:
Beginn im 2. Halbjahr des Vorjahres
Sollen die Sparklines nicht mit Anfang des Vorjahres beginnen, sondern bspw. mit dem 2. Halbjahr, so hilft hier ein eingefügtes lead(6). Dann wird mit dem Befehl Year.Lag(1).FirstChild.FirstChild.lead(6).ancestor(Current.Level) erreicht, dass vom Januar des Vorjahres durch lead(6) erst einmal zum Juli des Vorjahres gesprungen wird. Steht ein Quartal im Berichtsfilter, also Current.Level = 2, wird mit ancestor(2) zum übergeordneten 3. Quartal gesprungen:
Hier habe ich einmal für Quartale breitere Säulen verwendet.
Eine solche ebenenübergreifende dynamische Anpassung für den Beginn von Sparklines drängt sich auch bei einer flexibel einstellbaren Länge der Sparklines auf.
Startelemente für Sparklines über dynamisch angepasste Längen festlegen
Eine eingestellte Länge von bspw. 13 oder ein benutzerdefinierter Ausdruck der Form „Current.lag(12)“ gilt immer über alle Ebenen, also auch für Quartale oder Jahre.
Normalerweise sind die gewünschten Längen aber abhängig von der Ebene.
Möchte man etwa auf Jahresebene die Werte der letzten drei Jahre sehen, auf Quartalsebene die letzten 13 Quartale und auf Monatsebene die letzten 37 Monate, so entsprechen diese Zeiträume in der genannten Reihenfolge Ausdrücken der Gestalt Current.Lag(2) für Level 1, Current.Lag(12) für Level 2 und Current.Lag(36) für Level 3.
DeltaMaster versteht im benutzerdefinierten Ausdruck nun die folgende CASE-WHEN-Anweisung, die in Abhängigkeit vom Level den gewünschten Lag zuordnet:
Current.Lag(Case Current.Level When 1 Then 2 When 2 Then 12 When 3 Then 36 End)
Somit kann man sich nun auf dynamisch angepasste Längen der Sparklines beziehen, die die Ebene der ausgewählten Periode berücksichtigen:
PeriodToYearAgo
Wenn die Sparksäulen über alle Ebenen hinweg immer eine bestimmte Anzahl x von Jahren vorher beginnen sollen, aber im gleichen Kalendermonat (bzw. Quartal), so bietet sich PeriodToYearAgo(x) oder abkürzend pya(x) an.
Ist x = 2, so erhält man die folgende Darstellung:
Im September 2020 beginnt die Reihe im September 2018 und im 3. Quartal 2020 fängt sie wie gewünscht im 3. Quartal 2018 an.
Die gleiche Funktionalität hätten wir hier auch mit dem Befehl Current.Lag(Case Current.Level When 2 Then 8 When 3 Then 24 End) umsetzen können, aber pya(2) ist offensichtlich kürzer und einfacher.
Diese gezeigten nützlichen Anwendungen sollen für den heutigen Beitrag genügen; schauen wir aber zum Abschluss auf den mobilen Bericht.
Startelemente für Sparklines im mobilen Bericht
Auch im mobilen Bericht lässt sich die Logik der benutzerdefinierten Startelemente für Sparklines einsetzen:
Über die Einstellungen lassen sich auch hier die genannten Ausdrücke wie beispielsweise Year.Lag(1).FirstChild.FirstChild.Ancestor(Current.Level) verwenden und somit der Beginn der Sparklines dynamisch festlegen.
Für die Anwendungen in multidimensionalen Modellen gäbe es noch viel Wissenswertes über MDX-definierte Startelemente zu erzählen, aber um hier alle Möglichkeiten darstellen zu können, müsste man weiter ausholen – und zu diesem Thema erstelle ich dann doch lieber einen eigenen Beitrag.
Erfahrung im Umgang mit MDX kann nie schaden und ein Besuch der vertiefenden Schulungsveranstaltung kann nur empfohlen werden.