So I created a view something similar to this one:
What I have here is 2 charts and a few list boxes (main filter list-boxes in a container). The top two list boxes are for "Measure" and "Sort Order". These are "Data Island" values loaded like this:
Set HidePrefix='%';
Expressions:
Load
%MeasureID,
%Measure,
Replace(%MeasureExpression, '##', '$') As %MeasureExpression
Inline [
%MeasureID, %Measure, %MeasureExpression
1, Total Sales, Sum(LineSalesAmount)
2, Cost of Sales, Sum(COGS)
3, Sales Margin, Sum(Margin)
4, Sales Current Year, Sum({
5, Sales Last Year, Sum({
];
ExpressionSort:
Load * Inline [
%SortOrder
Y-Value
Default
];
Now, the expressions table here would probably not be inline. It is more likely to be in an Excel document or in a database and then added to based on user demand. You will note that I have to use "##" and then replace with the "$" as it doesn't work with the "$" in situ (QlikView thinks it is a dollar-expansion). You wouldn't have this problem if the source was an external one.
So, this table is a list of the most common expressions that would be used in this particular document. It could be 2, it could be 100. There is no limit here.
A couple of things to note. I have prefixed with "%" and set the HidePrefix value. This is important because your Expression selection does not then appear in Current Selections - which wouldn't make sense to the user.
The second thing to note is that you need to include the MeasureID field because we will use that later to sort the measures.
My bar chart (although it has a fast-change to line) has a Cyclic group as its dimension so I can choose any of my main dimensions. It has two expressions:
1: $(=FirstSortedValue(%MeasureExpression, %MeasureID))
and
2: if(Count(DISTINCT %Measure)=2,
$(=FirstSortedValue(%MeasureExpression, -%MeasureID)),
Null())
This structure allows me to pick up to 2 expressions (I check for this in the calculation condition of the chart). If only one is selected then the 2nd expression is Null() (I have an equivalent formula for the expression label) and QlikView treats it as if it isn't there - which is what I want.
For the sort order, I override the default group order and set as a descending expression:
if(%SortOrder='Y-Value', $(=FirstSortedValue(%MeasureExpression, %MeasureID)), Null())
If all the other sort options (e.g. Text Value) are not checked, the null in this expression will default to the default sort order of the dimension anyway.
The pivot table (which fast-changes to a straight table) is similarly constructed except I use 3 cyclic groups as the dimensions. This gives the users a lot of options.
Worth having a play with it and seeing what you can come up with.
BTW - this will, of course, work with Small Business edition of QlikView which does not support server objects. Also, users selections can be stored as bookmarks.
Stephen Redmond is CTO of CapricornVentis a QlikView Elite Partner
Do you have this example for download anywhere? Thanks.
ReplyDeleteThis comment has been removed by the author.
ReplyDelete