Dimensionsdatensicherheit als Fehlerquelle für „unsaubere“ Sets

Hallo liebe Reportbauer, MDXler und alle die es werden wollen,

ich bin vor kurzem bei einem Kunden über ein Phänomen gestolpert, dass ich Euch nicht vorenthalten will.

 

Wie immer wieder von mir gepredigt wird, arbeiten wir in der Regel zur Ausklammerung bestimmter Dimensionsknoten mit so genannten „Negativ-Listen“. Das bedeutet, wenn wir aus der Dimension Buchstaben die Knoten A, B und E sehen wollen sagen wir nicht {A, B, E} sondern {Buchstaben.ALLE – {C, D}}. Dadurch würden neue Knoten in der Dimension (z.B. der neu eingeführte Buchstabe F ;)) nicht per Default unterdrückt, sondern wären erst mal sichtbar. In den meisten echten Anwendungsfällen ist diese Negativ-Liste oft auch deutlich kürzer als die Positiv-Liste.

Aber genug über den Sinn und Unsinn von Negativ-Listen, das Statement

 

SELECT

{}

ON COLUMNS,

{[Product].[Category].[Accessories], [Product].[Category].[Bikes], [Product].[Category].[Clothing]}

ON ROWS

FROM

[Adventure Works]

 

liefert das gleiche Ergebnis zurück, wie

 

SELECT

{}

ON COLUMNS,

{[Product].[Category].[Category].

MEMBERS – [Product].[Category].[Components]} ON ROWS

FROM

[Adventure Works]

 

Nun hat sich innerhalb des besagten Kundenprojektes heimlich durchgesetzt, dass die abgekürzte Schreibweise verwendet wird, also {– {C, D}} statt { Buchstaben.ALLE – {C, D}}. Also auch die folgende dritte Variante hat das gleiche Ergebnis wie die oberen beiden.

 

SELECT

{}

ON COLUMNS,

{-{[Product].[Category].[Components]}}

ON ROWS

FROM

[Adventure Works]

 

Dies hat eigentlich auch super funktioniert, ist an Kürze kaum noch zu übertreffen UND SOLLTE TROTZDEM NIE WIEDER GETAN WERDEN 😉

 

Implizit erkennt der AS bei dieser Schreibweise, welche Elemente auf der linken Seite dieses Komplements gehören, nämlich Buchstaben.ALLE. Sobald aber eine Dimensionssicherheit ins Spiel kommt wird’s gefährlich. AS sucht die Knoten dann nur noch in dem Bereich in dem der Nutzer berechtigt ist. Wenn er den Knoten da nicht findet, weiß er nicht, ob er nicht existiert, oder ob er nicht berechtigt ist und ersetzt ihn durch die leere Menge ({}).

 

Aus { Buchstaben.ALLE – {C, D}} würde also intern { Buchstaben.ALLE – { }}. Nicht schlimm, funktioniert super. Ihr könnt Euch aber denken, dass das nicht mehr funktioniert, wenn aus {– {C, D}} durch dieses Verhalten {-{}} wird. Und das Böse daran ist, dass das erst auftritt wenn der erste eingeschränkte Nutzer darauf zugreift. Für Euch als Entwickler sieht es aus als wäre alles fein, während der arme Benutzer mit der Meldung "Die Menge muss eine einzige Hierarchie aufweisen, um mit dem Komplementoperator verwendet zu werden." bzw. "The set must have a single hierarchy to be used with the complement operator." begrüßt wird.

 

Also kurz:

Niemals {– {C, D}}

Immer { Buchstaben.ALLE – {C, D}}  oder aber EXCEPT(Buchstaben.ALLE, {C, D})

Schreibe einen Kommentar