Vor einigen Wochen hatten wir einen Supportfall, bei dem es darum ging, in einer Pivottabelle die Eigenschaftsfilter mehrerer Dimensionen zu kombinieren. Auf der Zeilenachse sollten die unterschiedlichen Lieferbeziehungen zwischen Lieferanten und Empfängern dargestellt werden. Anforderung war nun, dass aus der Menge der Lieferanten ein bestimmter Lieferant anhand des Namens herausgefiltert werden sollte. Kein Problem: Dafür haben wir in DeltaMaster ja den Elementeigenschaftsfilter – damit war diese Aufgabe in Kürze erledigt. Aber die Anforderung war noch nicht zu Ende, denn es sollte gleichzeitig auch die Menge der Empfänger nach dem gleichen Namen gefiltert und mit der Ergebnismenge des ersten Filters kombiniert werden.
Aus der Mengenlehre kennt man den Begriff der Vereinigungsmenge – dazu gibt es auch eine entsprechende MDX-Funktion: UNION().
Um dieses Beispiel nun unabhängig von den Daten des Kunden zu veranschaulichen, wird zur weiteren Erklärung der UNION-Funktion auf unsere Chair-Datenbank zurückgegriffen. Analog zu der geschilderten Problemstellung ist auf der Chair-DB folgendes Szenario denkbar:
Es soll ein Spezialbericht erstellt werden, der die Umsatzergebnisse nach Kunden geordnet pro Einzelprodukt darstellt. Dabei soll die Menge der Kunden über einen Elementeigenschaftsfilter eingeschränkt werden, so dass nur ein Kunde und alle dort erzielten Umsätze dargestellt werden. Gleichzeitig soll aber auch ein bestimmtes Produkt angezeigt werden, dieses aber wiederum für alle Kunden.
Der Kundenname soll “Walter” enthalten – das/die gesuchte(n) Produkt(e) die Bezeichnung “Discus”.
Der Filter auf Kundenebene
Zuerst möchten wir nun die Ergebnismengen im Einzelnen darstellen. Zuerst die Filterung auf den Kundennamen “Walter”.
Im resultierenden Bericht erhalten wir drei Zeilen als Ergebnis:
Der MDX-Code, den DeltaMaster erstellt, sieht so aus:
Auf die Menge aller Kunden (Ebene 5 der Dimension Kunde) wird die Filterfunktion angewendet. Als Filterkriterium dient das Ergebnis der InStr()-Funktion. Diese ist eine der VB-Inlinefunktionen und gibt die Position des gesuchten Strings innerhalb des zu durchsuchenden Strings zurück.
Der Filter auf Produktebene
Jetzt die separate Filterung auf die Produktbezeichnung, die den Namen “Discus” enthalten soll.
Hier erhalten wir fünf Zeilen als Ergebnis – es ist kein Kunde dabei, der “Walter” im Namen enthält.
Ein Blick auf das von DeltaMaster generierte Filter-Kriterium sieht hier ganz Ähnlich aus wie bei der Kundenauswahl:
Wenn man jetzt beide Elementeigenschaftsfilter aktivieren würde, wäre das Ergebnis eine leere Menge, da es in der Ergebnismenge für den Kundennamen “Walter” kein Produkt gibt, das den Namen Discus enthält – und anders herum natürlich das gleiche.
Die Vereinigung der Ergebnismengen
In DeltaMaster gibt es nur den Weg über MDX, um diese beiden Ergebnismengen miteinander zu kombinieren. Dabei verwenden wir die UNION()-Funktion, die mehrere Mengen miteinander vereinigt. Wichtig ist die Kombination der oben gezeigten MDX-Filter mit jeweils der gesamten Menge der Elemente aus der anderen Dimension. Also die Menge der gefilterten Kunden kombiniert mit der Menge aller Produkte und die Menge aller Kunden kombiniert mit der Menge der gefilterten Produkte. Alles klar?
Hier das MDX – damit wird es deutlicher:
Die Union-Funktion wird mit zwei Mengen gefüttert. Zuerst die Menge der Kunden, die den Namen “Walter” enthalten. Diese Menge wird über die Crossjoin-Funktion mit der Menge aller Produkte kombiniert und anschließend über die NonEmpty-Funktion wieder eingedampft, so dass nur die Kombinationen aus Kunde und Produkt in der Menge erhalten bleiben, die in Kombination mit den Elementen auf der Spaltenachse (Axis(0)) nicht leer sind.
Die zweite Menge ist das Gegenteil der ersten: Alle Kunden in Kombination mit den Produkten, die im Namen “Discus” enthalten.
Als Ergebnis erhalten wir einen Bericht mit acht Zeilen:
Drei Zeilen über den ersten Filter (Kundenname enthält “Walter”) und fünf Zeilen über den zweiten Filter (Produktname enthält “Discus”). So wie es in der Anforderung definiert wurde!