CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Dynamische Berichtsüberschriften mit Textbausteinen

Bereits vor kurzem wurde hier verkündet: DeltaMaster macht Schlagzeilen! Dieser Blogbeitrag hat uns gelehrt, wie man ein bestimmtes Element (z. B. Verkäufer des Tages) per MDX in der Berichtsüberschrift anzeigen lassen kann. In diesem Eintrag wird das Thema dynamische Überschriften weiter vertieft und es wird gezeigt, wie in Abhängigkeit von bestimmten Bedingungen unterschiedliche Texte in der Überschrift angezeigt werden können. Als Beispiel werden wir Textbausteine definieren, die uns je nach Datenlage unterschiedliche Texte zurückgeben.

Unsere Überschrift soll einen Bericht aus dem Chair-Modell ergänzen und uns damit vorab verraten, um wie viel Prozent der Deckungsbeitrag im Vergleich zum Vorjahr gestiegen bzw. gefallen ist. Und das Ganze sowohl kumuliert als auch nicht kumuliert.

Chair Modell

Ein Blick auf das MDX in der fertigen Überschrift verrät: Für die Textbausteine wurden scheinbar Measures verwendet (Näheres zur Verwendung der Syntax siehe DeltaMaster deltas! 5.5.3. (4)).

MDX Überschrift

Um diese dynamische Überschrift nachzubauen, beginnen wir zunächst mit der Erstellung der Measure für folgenden Textbaustein: Text DB, ∆VJ %, nicht kum. (measure254)

neuen Analysewert anlegen

Das MDX-Statement enthält eine CASE-Prüfung, ob das abgefragte Tupel (DB, nicht kum., ∆VJ %) größer oder kleiner 0 ist. Abhängig davon wird der Text „gestiegen“ bzw. „gefallen“ ausgegeben:

case
when ([Measures].[Deckungsbeitrag],
[Kumulation].[Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) > 0 then 'gestiegen'
when ([Measures].[Deckungsbeitrag],
[Kumulation].[Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) < 0 then 'gefallen'
else NULL
end

[Periodenansicht].[Periodenansicht].[temp 8] steht hier für das Periodenansichtselement ∆VJ %.

Den Textbaustein Text DB, ∆VJ %, kum. (measure252) erstellen wir analog. Im MDX Statement muss lediglich das Kumulationselement [Kumulation].[Kumulation].[Kumulation].&[1] gegen [Kumulation].[Kumulation].[Kumulation].&[2] ausgetauscht werden.

Nun fehlen uns noch die Measures mit denen die jeweiligen Werte angezeigt werden sollen (measure255, measure252). Hierzu legen wir zwei einfache Filterwerte an. Jeweils für nicht kum. und kum.

Filterwerte anlegen

Nun haben wir alle Textbausteine erstellt und können die Überschrift zusammensetzen. Wenn wir jetzt über die Sicht durch die Perioden schalten, verändert sich der Text passend zur Datenlage.
Aufmerksamen Lesern ist sicher aufgefallen, dass bei dem obigen Beispiel eine Bedingung fehlt. Wie verhält sich die Überschrift, wenn sich der Deckungsbeitrag im Vergleich zum Vorjahr nicht verändert hat? Diese Konstellation ist zwar betriebswirtschaftlich unwahrscheinlich, aber dennoch nicht auszuschließen. Außerdem sollen ja unsere Textbausteine auch für andere Kennzahlen eingesetzt werden können. Mit der nachfolgenden Ergänzung in der CASE Bedingung ist es jedoch alleine nicht getan.

case
when ([Measures].[Deckungsbeitrag],
[Kumulation].[Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) > 0 then 'gestiegen'
when ([Measures].[Deckungsbeitrag],
[Kumulation].[Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) < 0 then 'gefallen'
when ([Measures].[Deckungsbeitrag],
[Kumulation].[Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) = 0 then 'unverändert'
else NULL
end

Belässt man es bei dieser Ergänzung, würde im Falle eines unveränderten Deckungsbeitrags leider folgender Text angezeigt werden: „Im Sep 2012 ist der nicht kumulierte DB gegenüber Vorjahr um 0% unverändert.“ Damit der Satz grammatikalisch korrekt ist, müssen das „um“ und die „0%“ wegfallen.
Damit das „um“ dynamisch verschwindet, muss eine weitere Measure definiert werden, welche dann wiederum als Textbaustein in der Überschrift verwendet wird. Das bisher statisch eingegebene „um“ wird also durch eine weitere Measure ersetzt. Das MDX-Statement für diesen benutzerdefinierten Analysewert lautet wie folgt:

case
when ([Measures].[Deckungsbeitrag],
[Kumulation].[Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) = 0 then NULL
else 'um' 
end

Analog muss eine weitere Measure für den kumulierten „um“-Baustein angelegt werden.
Ebenfalls müssen unsere Filterwerte erweitert werden. Nämlich um eine IIF- bzw. CASE-Bedingung. Damit soll geprüft werden, ob der Wert gleich 0 ist oder nicht. Wenn er 0 ist, soll uns die Measure nichts, also NULL, zurückgeben.

Es gibt zwei Möglichkeiten die Filtermeasure anzupassen. Entweder legt man einen neuen Analysewert an und verweist innerhalb der IIF- bzw. CASE-Bedingung auf die bestehende Measure oder man schreibt alles, also auch den Filter, in eine einzige neue Measure. Der oben erstellte Filteranalysewert wird dann nicht mehr benötigt und kann gelöscht werden. Das MDX-Statement für diese neue Measure lautet folgendermaßen:

iif(
([measures].[deckungsbeitrag], [Kumulation].[Kumulation].&[1],
[Periodenansicht].[Periodenansicht].[temp 8]) = 0, NULL,([measures].[deckungsbeitrag], [Kumulation].[Kumulation].[temp],
[Periodenansicht].[Periodenansicht].[temp 8]) 
)

Analog gilt wieder das Gleiche für die Filtermeasure mit der Fixierung auf kumulierte Werte.
Als Nächstes müssen die einzelnen Bausteine in der Überschrift wieder richtig zusammengesetzt werden, z. B. so:

Bausteine in der Überschrift zusammensetzen

Bei einem gleichbleibenden Deckungsbeitrag gegenüber Vorjahr würde das Ergebnis dann so aussehen (nach Aktualisierung per F9-Taste):

Ergebnis