Forum Discussion
Conditional Formatting & Group By
- 7 years ago
Anonymous Man, this one does not want to give in! :smileyhappy:
I am guessing you have filters from other tables flowing into your visual which I think is causing the problem. I have updated the measure and as far as I can tell it is working with all scenarios.Fomatting Measure = VAR CurrentID = SELECTEDVALUE(Table1[ID]) VAR FilteredCount = CALCULATE( COUNTROWS ( FILTER ( VALUES(Table1[ID]), Table1[ID] > CurrentID ) ),ALLSELECTED() ) + 1 VAR FilterTrap = COUNTROWS(VALUES(Table1[ID])) RETURN IF ( NOT ISBLANK( FilterTrap ), IF ( ISINSCOPE(Table1[ID]), IF ( ISODD ( FilteredCount ), "#7195BE", "#68CCE4" ) ) )Sample file here: https://www.dropbox.com/s/y230n9u0wo08wjp/IDFormatting.pbix?dl=0
Here is a view with filters applied from both the table itself and from a related date table and it still works.A calculated column is not an option because the calc is static and if you filtered out an even row but left the two odd rows on either side the calculated column would not update to change the coloring. Our measure will since it is a count based on the visable IDs.
Hello Anonymous
You could add a column to your table that has the ID which would count the number of ID's that are > the current ID then use that count as an odd / even switch to base the formatting on.
FormattingColumn =
VAR CurrentID = Table1[ID]
VAR IDCount =
COUNTROWS(
FILTER (
ALL ( Table1[ID] ), Table1[ID] > CurrentID) ) + 1
Return IF( ISODD ( IDCount ) , 1, 2 )
jdbuchanan71
EDIT:
Sorry, not working well as I thought.
Maybe I am missing something?
For example (Table sorted by ID)
Amazing!
Can you please explain the logic behind the DAX?
Reading it again and again for the last 10 minutes, and not sure I understand it completely.
Understood the basic logic of counting the rows until current row, but want a more technical explanation, if possible.
Thanks a lot,
A
- jdbuchanan717 years agoSuper User
COUNTROWS works over a table.
FILTER returns a table
Our filter returns a table of ALL ID's that are > the current ID, then we count that. We add 1 because if we don't, on the highest ID it returns a blank.We then turn the count into a 1 / 2 based on even or odd.
If you want to see the steps working you can change the Return statement in the formula.
FormattingColumn = VAR CurrentID = Table1[ID] VAR IDCount = COUNTROWS( FILTER ( ALL ( Table1[ID] ), Table1[ID] > CurrentID) ) + 1 --Return IF( ISODD ( IDCount ) , 1, 2 ) Return IDCountIn the code above I commented out the switch and returned the IDCount variable instead.
- jdbuchanan717 years agoSuper User
Anonymous , lets try something a bit more dynamic.
Add a measure to your model that we will use to apply the formatting.
Fomatting Measure = VAR CurrentID = SELECTEDVALUE(Table1[ID]) VAR FilteredCount = CALCULATE( COUNTROWS ( FILTER ( VALUES(Table1[ID]), Table1[ID] > CurrentID ) ),ALLSELECTED() ) RETURN IF ( ISINSCOPE(Table1[ID]), IF ( ISODD ( FilteredCount ), "#7195BE", "#68CCE4" ) )The colors we are using are listed in the measure, then we apply the formatting based on the value of the measure:
- Anonymous7 years agoNot applicable
Hey jdbuchanan71
Not sure how you are doing it. I am not able to format according to a measure. Only a column.
So I am back to square 1 again.
I tried to put your DAX in a column, but it returns empty.
Cheers,
A- jdbuchanan717 years agoSuper User
Anonymous , That is very strange. I have uploaded a copy of my testing file here. Does the formatting work in this file for you?
https://www.dropbox.com/s/y230n9u0wo08wjp/IDFormatting.pbix?dl=0
Perhaps you need to update your PowerBI desktop app?
The file also includes the formatting calc as a column in the table if you need it.