Pages

Friday, December 30, 2011

Using SSAS formatting in SSRS

Christmas time is one of my most favourite times of the year – the time when you can just lay back, relax, enjoy some quality time with your family and catch up with your old friends. While this Christmas time has been a little hectic for me considering that I changed my base from London, UK to Charlotte, USA (I promise to say more on that in a later post), I still found time to catch up with family and friends. So I was talking with an old colleague of mine, and as is with most techies, we ended up discussing work after some time (now I know what the idiom means – All roads leads to Rome). Well, I should warn you that my friend is not a great fan of SSRS, and he was cribbing about SSRS and the difficulties he faces when dealing with it. Being a SSRS enthusiast, I couldn’t resist giving solutions or workarounds to most of the problems he said. One of his major concerns was about the formatting in SSRS. He was totally annoyed that the decimal/currency formatting he did in SSAS did not carry over to SSRS and that he had to modify potentially many reports to replicate the formatting change. That is when I jumped in and said that you could achieve the same in SSRS if you want to.

1 SSAS formatting in SSRS

To demonstrate the solution, I am using the AdventureWorks database. Follow the steps below to reproduce the solution:-

1) Create a new SSRS report and use the query below to create a dataset
SELECT NON EMPTY { [Measures].[Internet Sales Amount], [Measures].[Internet Gross Profit Margin], [Measures].[Internet Order Quantity] } ON COLUMNS,
NON EMPTY { ([Product].[Category].[Category].ALLMEMBERS ) } ON ROWS
FROM [Adventure Works]

Note that [Measures].[Internet Sales Amount] is a measure expression, [Measures].[Internet Gross Profit Margin] is a calculated measure and [Measures].[Internet Order Quantity] is a base measure.

2 Different type of measures

2) Create a simple matrix in SSRS using the fields above and preview it.

3 Previewing the unformatted data

You will notice that the measures are not formatted while the same measures in SSAS are formattted, as clear from the cube browser preview.

4 SSAS formatting

3) Now, to get the same SSAS formatting in SSRS, you will have to modify the MDX query to include the cell property – format_string as shown below.
SELECT NON EMPTY { [Measures].[Internet Sales Amount], [Measures].[Internet Gross Profit Margin], [Measures].[Internet Order Quantity] } ON COLUMNS,
NON EMPTY { ([Product].[Category].[Category].ALLMEMBERS ) } ON ROWS
FROM [Adventure Works]
CELL PROPERTIES VALUE, FORMAT_STRING

4) Once the query is modified, click on each of the 3 textboxes that need to be formatted, and enter the following code in the format property
=Fields!<name>("FORMAT_STRING")
E.g., for the Internet Order Quantity, the code and image is given below
=Fields!Internet_Order_Quantity("FORMAT_STRING")
5 SSRS Format property

5) Now preview the report.

6 SSRS initial format preview

We can see that the format for Internet Order quantity is correct, but the other two has been overwritten by Currency and Percent. This is because the format strings in SSRS and SSAS is not the same for all formats. To correct this, I have used custom code in the next step.

6) Click on Report menu and then select Report Properties. Copy and paste the following code into the custom code tab

Dim public RSFormat as String
Public Function FindFormat(ByVal ASFormat AS String) AS String
If (ASFormat="Currency") then
     RSFormat="c"
ElseIf (ASFormat="Percent") then
     RSFormat="p"
ElseIf (ASFormat="Standard") then
     RSFormat="0"
Else
     RSFormat=ASFormat
End If
return RSFormat
End Function

P.S. : I have taken care of the frequently used format strings, but if there is any format that I have missed, that can be easily added to the code with a ElseIf statement.

7) Now click on each of the 3 textboxes that need to be formatted, and then replace the code used in step 4 with the following code
=Code.FindFormat(Fields!<name>("FORMAT_STRING"))
E.g., for the Internet Order Quantity, the code and image is given below
=Code.FindFormat(Fields!Internet_Order_Quantity("FORMAT_STRING"))

8) Preview the report and now you should be getting the same format that was in SSAS also.

7 SSRS final format preview

The advantage of using this technique is that you would not need to touch your reports if you change the formatting in SSAS. This would ensure that the formatting used in your reports is standardized and consistent with what has been defined in your cube. Also, if you have multiple reports, you could compile the custom code and deploy the assembly to a server. This way, you would not need to duplicate the custom code in each of the reports.


References

1) Retrieving Cell Properties
2) How to Get Extended Properties with SSAS OLE DB Provider

4 comments:

  1. Excellent example of why SSRS is far more powerful than people first imagine.

    ReplyDelete
  2. Superb article regarding formatting concept in MDX “CELL PROPERTIES VALUE, FORMAT_STRING” also very good on how to use custom code in SSRS.

    ReplyDelete
  3. In SSRS and SSAS 2012 (at least, don't know about other versions) you can also use "CELL PROPERTIES VALUE, FORMATTED_VALUE" and then Fields!.FormattedValue

    ReplyDelete
    Replies
    1. Sorry, last post should have read Fields!field_name.FormattedValue

      Delete