Sometimes you need to send parameters to a data cube, which you cannot just handle via the slicers. In that case, the bridge parameters are awesome.
You can define inside your data cube a parameter (single, range, hierarchy…) and bind it to one or more placeholders in your data cube query. Then from your dashboard you can add filters bound to this bridge parameter.
I ended up using them a lot for a 3 level hierarchy, and this post explains how to do it.
Your parameter will be a “Single Member” (in opposition to range member (e.g. from and to for a calendar) or single number/string). This member will have multiple levels, depending on the hierarchy it’s bound to.
Indeed, when you create a bridge parameter, you bind it to a hierarchy. Then each level in the hierarchy is bound to a name which you will receive from the value in your parameter. In the example below, Top/Mid/Low Level are names coming from my hierarchy, A/B/C are generated by Dundas.
Those names can be used inside the Dundas script binding the bridge parameter and the placeholders. You just need to attach the bridge parameter to the placeholders, $top$, $mid$, $low$.
You will need 3 slightly different codes for each level. In my example, if the level is not filled I return a different default value, so the code is not nice to factorise, especially as it’s only 7 lines long.
This is the code for the top level. It is always filled, but there could be a second or more level.
// always Resolve() first, to handle unresolved tokens. SingleMemberValue h = (SingleMemberValue)$input$.Resolve(); // eg. top.mid.low.C or top.mid.B or top.A string fullName = h.Value.UniqueName; // Just return first element return fullName.Split('.')[0];
The second level might be empty. In that case I return -1.
// always Resolve() first, to handle unresolved tokens. SingleMemberValue h = (SingleMemberValue)$input$.Resolve(); // eg. top.mid.low.C or top.mid.B or top.A String fullName = h.Value.UniqueName; String[] bits=fullName.Split('.'); if (bits.Length >= 3) { // Note that Strings are coming in, but I need to convert to int return Convert.ToInt32(bits[1]) } else { return -1 }
Same for my third level, might be empty, is an int.
// always Resolve() first, to handle unresolved tokens. SingleMemberValue h = (SingleMemberValue)$input$.Resolve(); // eg. top.mid.low.C or top.mid.B or top.A String fullName = h.Value.UniqueName; String[] bits=fullName.Split('.'); if (bits.Length >= 4) { // Note that Strings are coming in, but I need to convert to int return Convert.ToInt32(bits[2]) } else { return -1 }