Donnerstag, 16. Oktober 2014

Dynamische Gruppen (Sets) mittels MDX optimieren


Hallo zusammen,

in meinem letzten Post habe ich Euch gezeigt, dass man Gruppen (Named Sets) über Datenschnitte steuern kann. Dies war darauf zurückzuführen, dass MDX DAX-Measures lesen und interpretieren kann. Auf diesem Wege hatten wir über verschachtelte IIF-Funktionen in MDX eine steuernde Gruppe (Named Set) aufgebaut, die in Abhängigkeit der gewählten Einstellungen des Datenschnitts,
die gewünschte Gruppe (Named Set) zurückgeliefert hatte. Auf diesem Wege war es gelungen eine Gruppe (Named Set) über einen Datenschnitt zu steuern.

Im heutigen Post soll es darum gehen das MDX-Statement für die steuernde Gruppe (Named Set) zu optimieren. Das Ziel besteht darin das MDX-Statement zu parametrisieren, so dass das unendliche Verschachteln von IIF-Funktionen nicht mehr notwendig ist. Das MDX-Statement wird für alle Zeiten Bestand haben...



Erinnert Euch an das MDX-Statement der bisher erstellten steuernden Gruppe:

Das MDX der steuernden Gruppe über verschachtelte IIF-Funktionen

Für jeden einzelnen Monat muss die Einstellung des Datenschnitts über das Measure MMaxSetSteuerung geprüft werden. Dies bedeutet, dass in der steuernden Gruppe (Named Set) für jeden Monat eine IIF-Funktion existieren muss. 

Schön wäre es an dieser Stelle, ein MDX-Statement schreiben zu können, das parametrisiert werden kann, so dass nicht jede mögliche Bedingung (also jeder Monat) explizit in MDX geschrieben werden muss. 
Dabei hilft uns die MDX-Funktion StrToSet (String to Set). Die Funktion StrToSet liefert auf Basis eines übergebenen Strings (also Text), ein entsprechendes Set zurück, sofern dieses zuvor bereits angelegt wurde.

Das folgende MDX-Statement ist die Lösung des Problems:

STRTOSET(
                       "{[" + LEFT([Measures].[MMaxSetSteuerung],4) + "_" 
                                + RIGHT([Measures].[MMaxSetSteuerung],2) + "]}"
                     )

Hier die Erläuterung der Formel:

StrToSet wandelt wie bereits erwähnt eine Zeichenkette in ein Set um. Da es sich um eine Funktion handelt, wird mit einer öffnenden und einer schließenden Klammer gearbeitet:

STRTOSET()

Da innerhalb dieser Funktion ein String verarbeitet werden soll, wird alles innerhalb der Funktion in Anführungszeichen gesetzt:

STRTOSET("")

Ein Set in MDX wird in geschweifte Klammern {} gesetzt. Ein Set besteht wiederum aus mindestens einem Tupel, welches seinerseits in eckige Klammer [] gesetzt wird. Daher ergibt sich folgende Form:

STRTOSET("{[ ]}")

Da ich innerhalb dieses Statements Strings (also Text) mit Funktionen verknüpfen will, arbeite ich mit dem "+"-Zeichen. Dieses verknüpft Text und Funktionen. Die beiden genutzten Funktionen LEFT() und RIGHT() sind aus Excel schon bekannt. Sie geben x Stellen von links bzw. rechts aus einem übergebenen Text wieder. Ich wende diese Funktionen auf das Measure MMaxSetSteuerung an und lese damit den Datenschnitt aus. So ermittle ich für welchen Monat die Pivot aufgebaut werden soll. Das Ziel hierbei ist es den Namen des Sets (Gruppe) zusammen zu bauen, das in der Pivot benutzt werden soll.
Für den Fall, dass im Datenschnitt  2014_02 ausgewählt wurde, liefert folgende Formel

LEFT([Measures].[MMaxSetSteuerung],4) +"_"+ RIGHT([Measures].[MMaxSetSteuerung],2)

das Ergebnis 2014_02 zurück, was dem Namen des Sets entspricht, das in der Pivot genutzt werden soll. Bitte kommt an dieser Stelle nicht durcheinander, denn ich habe den Sets exakt die Namen der Monatsbezeichnungen gegeben. 2014_02 ist also sowohl der ausgewählte Monat, als auch die Bezeichnung des bereits bestehenden Sets. 

Hier nochmal das fertige Set im Editor:

Das optimierte Set
Damit ist das steuernde Set optimiert und sofern Ihr keine Anpassungen vornehmen wollt, muss es auch nicht mehr angefasst werden, ganz gleich welche Perioden in Zukunft noch hinzukommen werden. Natürlich erspart Euch das nicht die Arbeit für jede Periode ein einzelnes Set anzulegen, aber das steuernde Set ist damit immer up to date :)

Ich hoffe, dass Euch dieser Post verständlich gemacht hat, wie man steuernde Sets derart aufbauen kann, dass keine kontinuierlichen Anpassungen mehr notwendig sind, sobald eine neue Periode zum Datenbestand hinzukommt. 

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


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

Lars