MDX Datasets with Date Parameters


How should date type parameters be prompted?  There are two common approaches

depending on how you want the parameter to appear.  Keep in mind that in a cube,

a date attribute is typically not stored or presented as a date type. So you can either

present the parameter as a hierarchy or as a date.  In the prior example, if

you were to parameterize the query as:

[Measures].[Internet Sales Amount] on columns
, PERIODSTODATE([Date].[Calendar].[Calendar Year], @ToDate) on rows
[Adventure Works];

...the parameter must return the string value in this format:

[Date].[Calendar].[Date].[February 5, 2004]

Unfortunately the MDX query designer is not very good at letting you customize a query

so you have to work with and around it's tendancy to take over the process. 

It often will not allow you to simply reference a parameter using syntax that it didn't

build for you.  I recommend using the graphical builder to create a simple query

that will return all the members in the order you will want to see them in your final,

customized query.  If you want the date parameter to appear as a hierarchy, use

the query builder to add a filter using a user hierarchy and check the Parameter checkbox

in the filter pane.  This will create a separate MDX dataset to drive the parameter


Next, either switch the query editor to text edit mode or replace the query using

an expression.  I find it more flexible to build string expressions to work around

the MDX query builder's quirkiness.  The expression version of the query would


="select " &
"[Measures].[Internet Sales Amount] on columns " &
", PERIODSTODATE(" & Parameters!ToDate.Value & ") on rows " & 
"from " &
"[Adventure Works]; "

The lines are concatonated together for readability.  make sure each line is

separated with a space or carriage return.  This dataset would be good to go

beacuse, the parameter was alraedy built by the graphical designer.

If you want to present the user with a real date type parameter, which will utilize

the date picker control, you will need to pass the resulting parameter value into

a function or expression to build the date member string value.  To do this in

an embedded function, open the Report Properties dialog and type this code into the

Code page:

Function DateToMember(TheDate As Date) As String
    Dim sDateString As String = Format(TheDate, "MMMM d, yyyy")
    Return "[Date].[Calendar].[Date].[" & sDateString & "]"
End Function

...and then use the function in the dataset expression:

="select " &
"[Measures].[Internet Sales Amount] on columns " &
", PERIODSTODATE(" & Code.DateToMember(Parameters!ToDate.Value) & ") on rows " & 
"from " &
"[Adventure Works]; "

Happy reporting!

Weblog by Paul Turley and SQL Server BI Blog.