Freitag, 26. September 2014

Gruppen (Named Sets) über Datenschnitte steuern mittels MDX

In meinem letzten Post habe ich Euch das Erstellen von Gruppen (sog. Named Sets) erklärt, um asymmetrische Berichte mit Power Pivot zu erstellen. In diesem Post wird es darum gehen, solche Gruppen derart aufzubauen, dass sie für den Nutzer einfach und komfortabel über Datenschnitte gesteuert werden können. Dafür sind einige Kniffe und Kenntnisse notwendig, aber es erhöht erheblich die Nutzerfreundlichkeit und macht das Browsen durch die Datenflut um einiges angenehmer. Es lohnt sich...





Der folgende Screenshot zeigt, wie ich mir das ganze vorstelle. 




Die linke Pivot zeigt nach dem Abschluss des Monats Februar die Monate Januar und Februar einzeln auf, gefolgt von einer Kumulation der beiden Monate (ein sog. Year-to-Date-Wert, kurz YTD). Danach folgt ebenfalls ein YTD-Wert, jedoch der des Vorjahres, gefolgt von einer Verhältniskennzahl, die ausdrückt, wie sich der Wert des aktuellen YTD-Wertes im Vergleich zu dem YTD-Wertes des Vorjahres verhält. 

Jetzt zeige ich Euch in sechs Schritten, wie Ihr den Aufbau der Pivot über die Datenschnitte steuern könnt.


1. Die monatlichen Gruppen (Sets) anlegen


Damit die Gruppen durch die Auswahl des Datenschnittes auch ausgewählt werden können, müssen sie zunächst erstellt werden. Wie Ihr dies macht, könnt ihr meinem letzten Post detailliert entnehmen. An dieser Stelle nur folgender Hinsweis: Arbeitet mit dem Feld Anzeigeordner (optional). Dadurch könnt Ihr alle Gruppen (Sets) inhaltlich vernünftig gruppieren und somit Ordnung in Eure Gruppen bringen. Glaubt mir, es werden viele werden. Da dieses Feld ein Freitextfeld ist, ist hier besondere Obacht geboten, die Namen auch richtig zu schreiben.


2. Hilfstabelle für das Filtern erzeugen


Im letzen Post habt Ihr ja bereits lesen können, dass es nicht zulässig ist einerseits eine Gruppe (Set) aufzubauen, die auf einer bestimmten Dimension basiert und andererseits diese Dimension als Datenschnitt zum Filtern zu benutzen... Ihr erinnert euch an diese Fehlermeldung?!



Wenn Ihr aber nunmal über eine Monatsauswahl festlegen wollt, welchen Aufbau Eure Pivot haben soll, dann müßt Ihr zuvor eine Hilfstabelle erstellen. Folgender Screenshot zeigt meine Hilfstabelle:



Spalte A beinhaltet eine Aufstellung von Monaten, auf deren Basis ich später meinen Pivotaufbau bestimmen will. Spalte B greift auf Spalte A zu und stellt den entsprechenden Wert lediglich als Zahl (also ohne Unterstrich) dar. Wofür dies notwendig ist, seht Ihr im weiteren Verlauf.
Noch ein wichtiger Hinweis, bevor wir mit dem nächsten Schritt weiter machen:
Macht aus dieser Hilfstabelle eine intelligente Tabelle, indem Ihr in Excel auf Einfügen >> Tabelle geht. Anschließend klickt in die neu erstellte intelligente Tabelle und geht in den Reiter Entwurf. Unter Tabellenname könnt ihr dieser Tabelle einen sprechenden Namen geben. Meine heißt tblSetSteuerung. Dies ist von großem Vorteil für die weitere Arbeit im Datenmodell von Power Pivot.


3. Hilfstabelle ins Datenmodell integrieren


Nachdem die Hilfstabelle angelegt ist, kann diese, sofern Ihr die Tabelle aktiviert habt, über POWERPIVOT >> Tabellen >> Zu Datenmodell hinzufügen ins Datenmodell eingebunden werden. Das Datenmodell sieht jetzt wie folgt aus:




Beachtet, dass die Hilfstabelle keine Verbindung zu den anderen Tabellen hat. Dies ist kein Fehler. Genauso soll es sein.


4. Hinzufügen eines Datenschnitts auf Basis der neuen Hilfstabelle


Der einzige Zweck der Hilfstabelle ist es, als Datenschnitt für die Steuerung des Pivotaufbaus zu fungieren. Das nennt man auch Parametertabelle. Dementsprechend wird die Hilfstabelle jetzt als Datenschnitt eingebaut. Geht hierfür zurück in die Excelumgebung und klickt in die bestehende Pivottabelle. Sobald die Pivot aktiviert ist, erscheint am oberen Rand des Excel-Fensters das kontextsensitive Menü PIVOTTABLE-TOOLS. Klickt jetzt im Reiter ANALYSIEREN auf Datenschnitt einfügen. Im Anschluss erscheint ein Auswahlfenster wie folgendes:


Wählt hier das Monatsfeld der Hilfstabelle aus und bestätigt mit OK.

Mit einem Rechtsklick auf den Datenschnitt könnt Ihr diesem unter Datenschnitteinstellungen noch einen sprechenden Namen geben. In meinem Fall lautet die Beschriftung Gewünschten Berichtsmonat auswählen.


Das Ergebnis sieht dann wie folgt aus:


Allerdings besteht noch ein wesentlicher Mangel: Noch steuert der Datenschnitt leider überhaupt nichts. Dafür sorgen wir in den nächsten Schritten.


5. Das steuernde Measure anlegen


Damit der Aufbau der Pivottabelle über die Auswahl im Datenschnitt bestimmt werden kann, muss ermittelt werden können, welcher Monat im Datenschnitt überhaupt ausgewählt wurde. Hierfür werden wird das Measure MMaxSetSteuerung erstellen. Da bei einem Datenschnitt nicht vordefiniert werden kann, dass nur ein einzelner Wert ausgewählt werden darf (single select), muss über das Measure definiert werden, welcher Wert bei einer Mehrfachselektion im Datenschnitt zurück gegeben wird. 
Beispielsweise soll bei Auswahl der Monate 2014_012014_02 und 2014_03 nur ein einzelner Monat als ausgewählt gelten, in unserem Falle (per Definition) der letzte Monat. Die Formel unseres Measures lautet demnach:

MMaxSetSteuerung:=MAX(tblSetSteuerung[JJJJ_MM])

Diese Formel liefert jedoch leider einen Fehler, da die MAX-Funktion nur mit numerischen Werten arbeiten kann. Bei der Spalte tblSetSteuerung[JJJJ_MM] handelt es sich jedoch um den Datentyp Text. Jetzt kommt die vorhin erstellte Spalte B MonatsZAHL ins Spiel. Ich hatte in der Formel für die Erstellung der Werte in Spalte B extra mit 1 multipliziert, um den Datentyp Text in einen Zahlenwert zu konvertieren (siehe Formel):




Auf Basis dieses Wertes kann nun das funktionierende Measure für die Identifikation des selektierten Wertes im Datenschnitt erstellt werden. Die Formel lautet wie folgt:

MMaxSetSteuerung:=MAX(tblSetSteuerung[MonatsZAHL])

Was jetzt noch fehlt ist, der Pivot beizubringen, auf den selektierten Wert im Datenschnitt hin ihren Aufbau zu ändern. Dies machen wir im nächsten Abschnitt via MDX.


6. Eine dynamische Gruppe (Set) via MDX aufbauen


Bei MDX (Multidimensional eXpressions) handelt es sich um eine Datenbanksprache für Multidimensionale Datenbanken (z. B. SQL Server Analysis Services). Nun kann man sich fragen, was MDX jetzt mit Power Pivot zu tun hat, aber jeder von Euch, der bereits eine Gruppe (Named Set) erstellt hat, hat auch bereits MDX benutzt. Intern wird eine solche Gruppe immer mittels MDX definiert. Der folgende Screenshot zeigt, wie Ihr Euch die erstellten Gruppen (Sets) als MDX ansehen könnt:



In Schritt 1 sagt Ihr, dass Ihr die Gruppe (Set) mit MDX bearbeiten wollt. Im Anschluss erfolgt eine Warnmeldung, die darauf hinweist, dass nachdem Änderungen via MDX vorgenommen wurden, anschließend keine Änderungen mehr über die gewohnte Nutzeroberfläche, wie in Schritt 1, gemacht werden können. Dies liegt daran, dass MDX einen größeren Handlungsumfang zur Verfügung stellt, als die gewöhnliche Oberfläche zur Erstellung der Gruppen anbietet. Sobald Ihr bei Schritt 2 also auf OK klickt und in Schritt 3 ebenfalls mit OK bestätigt, geht beim nächsten Bearbeiten dieser Gruppe sofort das Fenster von Schritt 3 auf. Sofern Ihr in Schritt 3 jedoch gleich wieder auf Abbrechen geht, ist nichts passiert.

Was MDX für Power Pivot angeht kenne ich nur einen einzigen Artikel im Netz, der darauf eingeht. Die gute Nachricht hierbei ist, dass dieser Artikel sehr ausführlich geschrieben und mit vielen Beispielen versehen ist. Die vielleicht weniger gute Nachricht ist, dass er auf Englisch verfasst wurde. Chris Webb ist der Autor der fünfteiligen Reihe Introduction to MDX for PowerPivot Users und zum ersten Artikel geht's hier. (Kleine Randinformation: Chris ist unter anderem auch Autor des derzeit einzigen Buches zum Thema Power Query for Power BI & Excel

Chris' Artikelreihe hatte ich bereits vor über einem Jahr gelesen und es fiel mir zugegebenermaßen schwer zu verstehen, in wie weit mich das bei Power Pivot weiterbringen würde. Doch dann las ich folgenden Artikel auf Rob Collies' Seite Powerpivotpro.com.

Der wesentliche Punkt hierbei war, dass MDX DAX-Measures lesen und interpretieren kann. Ist das nicht der Wahnsinn?! Was bedeutet das jetzt? Wenn ich ...

   1. mit MDX den Aufbau einer Pivot bestimmen kann (jede Gruppe tut dies) und 
   2. MDX den Wert von einem DAX-Measure lesen kann, und ich 
   3. wiederum über einen Datenschnitt den Wert eines DAX-Measures bestimmen kann (denkt an              unsere Hilfstabelle), ...

dann kann ich über einen Datenschnitt auch den Aufbau einer Pivot bestimmen. 

Wie geil ist das denn :)

Die Lösung meines Problems sah schlussendlich wie folgt aus:


Die IIF-Funktion gibt in Abhängigkeit der Erfüllung einer logischen Prüfung (z. B. [Measures].[MMaxSetSteuerung]=201401) das Objekt A, oder B zurück.
Übersetzt auf unseren Fall bedeutet das, dass dieses MDX-Statement prüft, ob im Datenschnitt der Monat 2014_01 ausgewählt wurde und gibt in diesem Fall die Gruppe [2014_01] zurück. Falls dies nicht der Fall ist, prüft das MDX-Statement darauf, ob Monat 2014_02 ausgewählt wurde und so weiter.

Besonders wichtig ist, das rot markierte Feld Set bei jedem Aktualisieren neu berechnen anzuhaken. Nur dann wird die Gruppe (Set) in Abhängigkeit der Auswahl im Datenschnitt den Aufbau der Pivot korrekt bestimmt. Andernfalls ändert sich die Pivot überhaupt nicht.

Der letzte Schritt liegt quasi auf der Hand: Die eben erstellte Gruppe (Set) muss nun für die aktuelle Pivot in der Feldliste noch als Spaltenüberschrift ausgewählt werden. 


Damit ist unser Ziel erreicht... Der Aufbau der Pivot läßt sich nun nach belieben über den Datenschnitt bestimmen.

Wer jetzt noch nicht mit rauchendem Kopf da sitzt, dem ist vielleicht aufgefallen, dass das MDX-Statement noch nicht optimal geschrieben ist. Schließlich haben wir über verschachtelte IIF-Funktionen erst 6 Fälle (nämlich die Monate 2014_01 bis 2014_06) behandelt. Für jeden weiteren Monat müßte jeweils eine weitere IIF-Funktion hinzugefügt werden. Wie man dies eleganter und wartungsfreier bewerkstelligen kann, erkläre ich in meinem nächsten Post.

Hier könnt Ihr die Beispieldatei herunterladen (Excel 2013, 32 bit):
Download


Viel Spaß beim Testen und bis zum nächsten Mal...

Lars