I have reports in SSRS where I'm able to alternate the row colors using this expression:
=IIF(ROWNUMBER(NOTHING) MOD 2, "LightSteelBlue","WhiteSmoke")
This works great. However, I have a report that has a column grouping, and this seems to mess up the alternating row colors.
The grouped columns will alternate column colors instead of row colors. I've searched and found possible solutions with row groupings but nothing with column groupings, or at least nothing I can get to work. I'm just trying to have every other row be "LightSteelBlue" or "WhiteSmoke," nothing fancy.
Any ideas?
Here is the solution that I came up with:
Add a column to the right end of the table and name the text box "RowNumber." Set the visibility to Hidden.
Add expression to RowNumber text box.
=RunningValue(Fields!last_name.Value & Fields!entity_name.Value, CountDistinct, "dataset name")
Add expression to Background Color of the Details Row:
=IIF(ReportItems!RowNumber.Value mod 2 > 0, "LightSteelBlue", "WhiteSmoke")
The RunningValue() function needs unique values. In my case the member name can be repeated several times due to one member belonging to different entities. Therefore I combined last_name and entity_name to get a unique value.
Hope this helps.
Try using runningvalue instead of rownumber where the field name is the field in your details row:
=iif(VAL(runningvalue(fields!yourfield.Value,countdistinct,nothing)) MOD 2, "LightBlueSteel", "WhiteSmoke")
Related
I have a Dashboard with different visuals.
Data is made up of different values for insurance companies.
I want my slicers/filters to not filter all data, but to only highlight the chosen company.
For example, in my slicer I choose the insurance ABN.
Instead of showing me the value for ABN only in my visuals, I want all other values to still be visible and ABN's value to be highlighted in the visuals.
Does anyone know how to do this?
You can use conditional formatting to achieve this. Lets say that we will change the background color to "highlight" a row (or cells, to be precise).
First, we need a slicer, which will not filter our data. We can do this by duplicating our source table, removing the unnecessary columns and making sure there is no relationship between the source and the duplicate. So if we have a source table, named Table, like this:
Right click on it and select Duplicate:
Then right click the title of the column you want to keep and select Remove Other Columns to get a list of company names only (you may also remove the duplicates, but it's not required). Then in the model delete the relation between both tables:
Now you can place a table showing company name and sales from your data source, and a slicer for company name from the duplicate table. At this point selecting values in the slicer should not affect the table.
Now you need to capture the value of the slicer and use it in a measure, which will determine should current row be highlighted or not. You can use SELECTEDVALUE for that, but note that it will give you a value only if there is a one selected in the slicer. If you want to support highlighting of more than one company, it gets a bit more complicated.
Make a new measure in your source table, like this:
Measure = IF(HASONEVALUE('Table (2)'[Company name]);
IF(SELECTEDVALUE('Table (2)'[Company name]) = MAX('Table'[Company name]); 1; 0);
IF(ISFILTERED('Table (2)'[Company name]) && COUNTROWS(FILTER('Table (2)'; 'Table (2)'[Company name] = MAX('Table'[Company name]))); 1; 0))
In case there is only one value selected in the slicer (see HASONEVALUE), then our measure will return 1 (highlight) or 0 (don't), comparing it with the current row.
Otherwise (i.e. there is no selection in the slicer, or there are 2 or more companies selected), then we will look at the filtered list of companies (Table (2)) - if it contains current row, then 1 (highlight), otherwise 0 (don't). But we will also handle the case, where there is no value selected in the slicer. In this case the list will contain all the companies, i.e. all rows will be highlighted. Here comes ISFILTERED. And at the end, if the list is filtered and current row exists in the filtered list, then 1 (highlight), otherwise 0 (don't).
Now, you need to use this measure to change the background of the column - right click each column in your table and select Conditional formatting -> Background color:
Then format by rules, where Measure >= 1 like this:
Now, when there is no selection in the slicer, there are no rows highlighted in the table:
If you select one company, it is highlighted:
It also work if there are multiple companies selected:
Thank you Andrey for your step-by-step explanation which as been incredible helpful. I'd like to follow up with a further question, particularly regarding the comment below.
"You can use SELECTEDVALUE for that, but note that it will give you a
value only if there is a one selected in the slicer. If you want to
support highlighting of more than one company, it gets a bit more
complicated."
In my model, I've linked a third table (Table (3)) to Table (2) with a many to one relationship with Table (2). Therefore when I click on Table (3), it will filter Table (2), which acts as a slicer for Table (1).
When only 1 value is filtered in Table (2), it conditionally formats the cells in Table (1). However, when more than 1 value is filtered in Table (2), conditional formatting fails.
As I'm looking to avoid manually selecting multiple values in the slicer (Table (2)), I was wondering if there's a workaround for SELECTEDVALUE such that it is able to conditionally format when I filter more than 1 value in Table (2).
I have preview of matrix like this:
Columns "Report#" and "Headline Indicator" are added manually, "Report Month" is number of month that is used for row grouping, "1" and "3" are column group fields (department_key_id). Design on the picture below:
I want to sort data by first column "Report#".
I tried to configure some interactive for that column but it was not worked for me(
How can I sort rows with data in the table in this way - 2, 2, 3, 3, 4, 4, 5, 5?
thanks!
So it looks to me like you might need a couple of changes to get the set-up you want here. First, I'm going to recommend adding an ORDER BY [report_month_num] to your query and you can do away with the current row grouping on report_month_num.
You'll need to add a Detail grouping row for each of your four rows. So right click in any textbox, navigate to Add Group > Row Group > Adjacent below. Make sure to select Show detail data for each of the four groups you make. You'll need to copy the data into the new rows and you should be all set.
This should ensure the ordering you are expecting.
I have a report with several interactive sort columns for sorting/ranking various metrics. I would like to highlight the column or even just the column header that is sorted. Is there a property that will tell me which column the report is sorted on?
I have not been able to find any threads that address this question.
No - there are no properties in SSRS to let the code know that the column is being sorted.
If you wanted to put in the effort, you could add a parameter with column names for the sorting. Then just set the table or Groups SORTING by your parameter using a Switch statement and the background color of the header and/or data cell(s) using an IIF for each column for the color.
SORT EXPRESSION:
=SWITCH(Parameters!SORTING.Value = "NAME", Fields!NAME.Value,
Parameters!SORTING.Value = "AGE", Fields!AGE.Value)
Background Color Expression for a NAME column:
=IIF(Parameters!SORTING.Value = "NAME", "Whitesmoke", "White")
For the other columns, just use the column name.
To be a little slicker, you could use the ACTION on the column header for each field to set the parameter and recall the report rather than forcing the user to hit View Report. You would Specify the same report but Add the SORTING parameter and hard code the columns name (which has to be the same as the SWITCH function).
Unfortunately, this would require the report to rerun each time the user wanted to sort.
Kinda lame but it's the only way that I can think of to do it.
Everything except for the name may or may not be different, but it doesn't matter.
How do you make it so the name and address (first column) can only show once if the value on multiple rows is the same? There is no way to merge the rows together due to the numbers of rows being generated from a group expression. But if there is another way to merge then can someone tell me how to do it? If not, then is there at least a way to blank out the second and third repeating names (and address)?
This is how you hide repeating values in a tablix column.
In design mode, click on the detail cell that you want to keep from repeating if the values are the same. In this case, you are referring to that one as the name and address column.
Look for the HideDuplicates property in the Properties pane. Set the value to the name of the dataset the tablix is using.
Now, when you run the report, that value should only show once. The other rows where the value had been repeating will be blank in that cell.
Set the borders appropriately (none, or solid) to make it look like the cells are merged. Doing the above alone will not merge the cells. Only a row group will do that.
I have a matrix report with 9 Row Groups and 1 Column Group (Months).
Instead of showing duplicate rows on the row groups, SSRS and Excel merge those fields. I would like them unmerged! I would like them to duplicate on my report.
I tried going to the parent group and grouping by every other field. This worked until I added two rows within the group, (which I need).
I guess you could also say that I really want my row groups to look like a table. If there's a better way to do that, I'm all ears!
enter image description here
Is it TYPE field that you need all the lines for?
The bracket to the left (under Row Groups) indicates that you are Grouping on something. Remove the Group Only (but not the rows and columns) so you are not grouping and all lines will be displayed.