<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2268159193748171866</id><updated>2012-01-30T06:49:35.567Z</updated><title type='text'>Qlik Tips</title><subtitle type='html'>Tips and tricks that I have come across over several years of QlikView development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>74</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5236400670018345469</id><published>2011-12-06T20:32:00.001Z</published><updated>2011-12-06T20:49:42.053Z</updated><title type='text'>Saving Space by Nulling Zeros</title><content type='html'>If reducing the memory requirement of your QlikView document is important, this tip might help shave a few bytes that could add up to a significant performance gain.&lt;br /&gt;&lt;br /&gt;There are several documents on performance improvement that will suggest that you should shed fields that do not contain data that will be used. &amp;nbsp;My tip is to look at fields that has data that you do use and shed the data in those that you won't!&lt;br /&gt;&lt;br /&gt;One example would be a numeric field that may contain a lot of zeros. &amp;nbsp;If the only use of this field is in a sum, then there is no different in that zero being there or not. &amp;nbsp;The only difference would be in a count or avg. &amp;nbsp;Therefore, if you have a lot of zeros in a field that will only be summed, consider transforming them to null() in your load.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; if(Field1=0,Null(),Field1) as Field1,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you need to use that field in a horizontal calculation, you can use the Alt function:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Alt(Field1, 0) + Alt(Field2, 0)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another type field that we are often told to look at getting rid of is key fields. &amp;nbsp;They are often highly unique so will take up the most space in the dataset. &amp;nbsp;It is often straightforward to remove them, but what if they are needed? &amp;nbsp;Perhaps as a key link in a 1:M relationship.&lt;br /&gt;&lt;br /&gt;For example, say you had an Account table with a key field called AccountID. &amp;nbsp;There is also an AccountHistory table which associates on AccountID. &amp;nbsp;You can't readily join the two tables so you need to keep the key field. &amp;nbsp;However, if there is not an entry for every Account in the AccountHistory table, you don't need to keep the value for that particular AccountID in the field! &amp;nbsp;Null it!&lt;br /&gt;&lt;br /&gt;I might create a mapping table:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;KeyMap:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Mapping Load Distinct&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; AccountID, AccountID&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Resident AccountHistory;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then, in my Account table load:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;ApplyMap('KeyMap', AccountID, Null()) As AccountID,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, this is not going to be significant over a million records. &amp;nbsp;However, over a hundred million, you will see a difference.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5236400670018345469?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5236400670018345469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/12/saving-space-by-nulling-zeros.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5236400670018345469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5236400670018345469'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/12/saving-space-by-nulling-zeros.html' title='Saving Space by Nulling Zeros'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7455199666491527310</id><published>2011-12-04T22:24:00.001Z</published><updated>2011-12-04T23:05:17.630Z</updated><title type='text'>The Right Background</title><content type='html'>I have talked about color choice&lt;a href="http://qliktips.blogspot.com/2011/10/color-coding-rags.html"&gt; recently&lt;/a&gt;, but whatever choice you make for the colors you are going to use, the choice of background color is critical.&lt;br /&gt;&lt;br /&gt;You may have seen an image like this before:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PibRCS23-hA/Ttv1S_bXRDI/AAAAAAAAAHc/P_e-92bPxM0/s1600/Colors+0+-+Grey+Square.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="117" src="http://4.bp.blogspot.com/-PibRCS23-hA/Ttv1S_bXRDI/AAAAAAAAAHc/P_e-92bPxM0/s400/Colors+0+-+Grey+Square.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you haven't, the question is - which of the 5 squares inside the colored box is the same color as the square outside the box. &amp;nbsp;The answer is that all of the 5 squares are the same color. &amp;nbsp;The only difference is the background.&lt;br /&gt;&lt;br /&gt;The rule, therefore, is that when choosing a background, it must be a single color. &amp;nbsp;You can't use any type of "gradient" effect or, even worse, use an image as your background.&lt;br /&gt;&lt;br /&gt;So, what is the best color to use for the background?&lt;br /&gt;&lt;br /&gt;In the world of software development, most IDEs (Integrated Developments Environments), such as Microsoft Visual Studio, have a default of a white background for the code and darker contrasting text. &amp;nbsp;There have been many debates on the use of white as a background. &amp;nbsp;The main one being that the white is wearing on the eye.&lt;br /&gt;&lt;br /&gt;Some prefer black or dark blue with lighter contrasting text. &amp;nbsp;However, there is a visual effect that works against this - well known by photography experts - called Halation. &amp;nbsp;This is the effect of brighter colors seeming to spread when on darker backgrounds and hence look a little blurred. &amp;nbsp;This can cause eye strain.&lt;br /&gt;&lt;br /&gt;Some suggest that softer grey backgrounds. &amp;nbsp;However, the issue here is that the softer contrast can have an effect on interpretation of color coding in scripting, and it is difficult to find a right choice of usable colors to offset this. &amp;nbsp;This is a feature that increases productivity in developers, so any reduction in its efficacy is not a welcome.&lt;br /&gt;&lt;br /&gt;So, it appears that white might just be the right background color for developers, but this post is not about the best color to use for developing - it is for use in the display of&amp;nbsp;quantitative&amp;nbsp;data.&lt;br /&gt;&lt;br /&gt;In an article called "&lt;a href="http://www.perceptualedge.com/articles/b-eye/choosing_colors.pdf"&gt;Choosing Colors for Data Visualization&lt;/a&gt;", Maureen Stone, of &lt;a href="http://www.stonesc.com/"&gt;StoneSoup Consulting&lt;/a&gt;&amp;nbsp;and formerly of the Xerox Palo Alto Research Center, tells us that most color palettes are designed to be printed on white paper so using a white background is the right choice in digital form. &amp;nbsp;If your presentation is going to end up on paper, then designing on a white background is the right choice.&lt;br /&gt;&lt;br /&gt;Further, Maureen tells us that there are perceptual advantages in using white as the human visual system is designed to adapt its color perception relative to the local definition of white and giving a white background gives us a stable definition of "white".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a last word on this subject, I looked at six of the worlds most popular websites:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sB2VG4XKABQ/Ttv1SeisH8I/AAAAAAAAAHY/eeHJv1LeYjw/s1600/Colors+0+-+6+Sites.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-sB2VG4XKABQ/Ttv1SeisH8I/AAAAAAAAAHY/eeHJv1LeYjw/s400/Colors+0+-+6+Sites.png" width="397" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;All use a lighter background and darker foreground &amp;nbsp;(not necessarily black, blue/purple are popular) and, with the exception of YouTube (which has only changed recently), that color is white. &amp;nbsp;These companies have the resources to spend a lot of money on choosing the right background colors. &lt;br /&gt;&lt;br /&gt;Who am I to disagree with them.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7455199666491527310?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7455199666491527310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/12/right-background.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7455199666491527310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7455199666491527310'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/12/right-background.html' title='The Right Background'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-PibRCS23-hA/Ttv1S_bXRDI/AAAAAAAAAHc/P_e-92bPxM0/s72-c/Colors+0+-+Grey+Square.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5648810544386013169</id><published>2011-12-02T23:55:00.001Z</published><updated>2011-12-03T00:14:27.479Z</updated><title type='text'>Easy Ad-Hoc Analysis in QlikView</title><content type='html'>I was demonstrating server object collaboration recently (the ability for end-user to create different charts and other objects and then share these with other users) to a group of users. &amp;nbsp;For me, it is quite straightforward to create a new chart but as their eyes glazed over, I thought to myself, "there must be an easier way."&lt;br /&gt;&lt;br /&gt;So I created a view something similar to this one:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SyTk_KsCoVo/TtlmqIV-SCI/AAAAAAAAAHQ/E0BR7_qDF1c/s1600/Ad+Hoc+Analysis.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://3.bp.blogspot.com/-SyTk_KsCoVo/TtlmqIV-SCI/AAAAAAAAAHQ/E0BR7_qDF1c/s400/Ad+Hoc+Analysis.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;What I have here is 2 charts and a few list boxes (main filter list-boxes in a container). &amp;nbsp;The top two list boxes are for "Measure" and "Sort Order". &amp;nbsp;These are "Data Island" values loaded like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Set HidePrefix='%';&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Expressions:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Load&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;%MeasureID,&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;%Measure,&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Replace(%MeasureExpression, '##', '$') As %MeasureExpression&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Inline [&lt;/b&gt;&lt;br /&gt;&lt;b&gt;%MeasureID, %Measure, %MeasureExpression&lt;/b&gt;&lt;br /&gt;&lt;b&gt;1, Total Sales, Sum(LineSalesAmount)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2, Cost of Sales, Sum(COGS)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3, Sales Margin, Sum(Margin)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;4, Sales Current Year, Sum({&lt;year={"##(=max({1} year))"}=""&gt;} LineSalesAmount)&lt;/year={"##(=max({1}&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;5, Sales Last Year, Sum({&lt;year={"##(=max({1} year)-1)"}=""&gt;} LineSalesAmount)&lt;/year={"##(=max({1}&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;];&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;ExpressionSort:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Load * Inline [&lt;/b&gt;&lt;br /&gt;&lt;b&gt;%SortOrder&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Y-Value&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Default&lt;/b&gt;&lt;br /&gt;&lt;b&gt;];&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, the expressions table here would probably not be inline. &amp;nbsp;It is more likely to be in an Excel document or in a database and then added to based on user demand. &amp;nbsp;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). &amp;nbsp;You wouldn't have this problem if the source was an external one.&lt;br /&gt;&lt;br /&gt;So, this table is a list of the most common expressions that would be used in this particular document. &amp;nbsp;It could be 2, it could be 100. &amp;nbsp;There is no limit here.&lt;br /&gt;&lt;br /&gt;A couple of things to note. &amp;nbsp;I have prefixed with "%" and set the HidePrefix value. &amp;nbsp;This is important because your Expression selection does not then appear in Current Selections - which wouldn't make sense to the user.&lt;br /&gt;&lt;br /&gt;The second thing to note is that you need to include the MeasureID field because we will use that later to sort the measures.&lt;br /&gt;&lt;br /&gt;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. &amp;nbsp;It has two expressions:&lt;br /&gt;&lt;br /&gt;1: &amp;nbsp;&lt;b&gt;$(=FirstSortedValue(%MeasureExpression, %MeasureID))&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;2: &amp;nbsp;&lt;b&gt;if(Count(DISTINCT %Measure)=2,&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;$(=FirstSortedValue(%MeasureExpression, -%MeasureID)),&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Null())&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This structure allows me to pick up to 2 expressions (I check for this in the calculation condition of the chart). &amp;nbsp;If only one is selected then the 2nd expression is Null() &amp;nbsp;(I have an equivalent formula for the expression label) and QlikView treats it as if it isn't there - which is what I want.&lt;br /&gt;&lt;br /&gt;For the sort order, I override the default group order and set as a descending expression:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;b&gt;if(%SortOrder='Y-Value', $(=FirstSortedValue(%MeasureExpression, %MeasureID)), Null())&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;The pivot table (which fast-changes to a straight table) is similarly constructed except I use 3 cyclic groups as the dimensions. &amp;nbsp;This gives the users a lot of options.&lt;br /&gt;&lt;br /&gt;Worth having a play with it and seeing what you can come up with.&lt;br /&gt;&lt;br /&gt;BTW - this will, of course, work with Small Business edition of QlikView which does not support server objects. &amp;nbsp;Also, users selections can be stored as bookmarks.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5648810544386013169?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5648810544386013169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/12/easy-ad-hoc-analysis-in-qlikview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5648810544386013169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5648810544386013169'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/12/easy-ad-hoc-analysis-in-qlikview.html' title='Easy Ad-Hoc Analysis in QlikView'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-SyTk_KsCoVo/TtlmqIV-SCI/AAAAAAAAAHQ/E0BR7_qDF1c/s72-c/Ad+Hoc+Analysis.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3969331112095323847</id><published>2011-11-26T17:30:00.001Z</published><updated>2011-11-26T17:54:14.238Z</updated><title type='text'>Delivering BI to Customers</title><content type='html'>It was great to see a project that I have been involved with being mentioned in the press:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;a href="http://news.idg.no/cw/art.cfm?id=91F8201B-BE5E-D5AE-9E3D293BAC70DD07"&gt;Electricity company pushes out BI tool to customers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It would have been nice to see&amp;nbsp;&lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt;&amp;nbsp;being mentioned in the article.&lt;br /&gt;&lt;br /&gt;We now have several clients who deliver BI to clients using QlikView. &amp;nbsp;These clients range from:&lt;br /&gt;&lt;br /&gt;Utilities - delivering usage information to end users to encourage behavior change, saving energy.&lt;br /&gt;&lt;br /&gt;Banking - delivering information to their customers to allow better decision making.&lt;br /&gt;&lt;br /&gt;Global Farm Feed Company - allowing farmers in 25 countries to measure feed efficiency.&lt;br /&gt;&lt;br /&gt;While none of these implementations is trivial, it is great to work with a great technology like QlikView as the enabler. &amp;nbsp;And looking forward to delivering many more - especially on version 11.&lt;br /&gt;&lt;br /&gt;If you need to deliver BI to your customers, feel free to give&amp;nbsp;&lt;a href="http://capventis.com/contact-us/capricornventis-locations/"&gt;CapricornVentis&lt;/a&gt;&amp;nbsp;a call.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3969331112095323847?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3969331112095323847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/11/delivering-bi-to-customers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3969331112095323847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3969331112095323847'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/11/delivering-bi-to-customers.html' title='Delivering BI to Customers'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7241224155142088164</id><published>2011-11-06T23:57:00.001Z</published><updated>2011-11-06T23:57:50.909Z</updated><title type='text'>Denormalize for Performance</title><content type='html'>It was gratifying for me to find out, after many QlikView implementations, that most of what I was doing was close to best practice in Dimensional Modelling. &amp;nbsp;I thought that I was mostly just building key tables to fix data connection issues and the denormalizing to clean the data structure and improve performance.&lt;br /&gt;&lt;br /&gt;If you are unfamiliar with &lt;a href="http://en.wikipedia.org/wiki/Dimensional_modeling"&gt;Dimensional Modelling&lt;/a&gt;, it has been around for a very long time - as long as QlikView! &amp;nbsp;Ralph Kimball, one of the early data warehouse pioneers, has literally written the book on the subject and has many great articles on his website:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kimballgroup.com/html/articles.html"&gt;http://www.kimballgroup.com/html/articles.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are not familiar with relational database theory, the idea of normalization is to remove redundancy. &amp;nbsp;For example, if I have a simple product table like this:&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;th colspan="3"&gt;Product Table&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;th&gt;ProductID&lt;/th&gt;&lt;th&gt;ProductName&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;1&lt;/td&gt;&lt;td&gt;BingBong&lt;/td&gt;&lt;td&gt;Bings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;2&lt;/td&gt;&lt;td&gt;BingBang&lt;/td&gt;&lt;td&gt;Bings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;3&lt;/td&gt;&lt;td&gt;BingBung&lt;/td&gt;&lt;td&gt;Bings&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The category name of "Bings" is repeated several times. &amp;nbsp;In a relational database this value is actually stored several times. &amp;nbsp;From a storage point of view, it is more efficient to split the product table into a product and a category table like this:&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;th colspan="3"&gt;Product Table&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;th&gt;ProductID&lt;/th&gt;&lt;th&gt;ProductName&lt;/th&gt;&lt;th&gt;CategoryID&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;1&lt;/td&gt;&lt;td&gt;BingBong&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;2&lt;/td&gt;&lt;td&gt;BingBang&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;3&lt;/td&gt;&lt;td&gt;BingBung&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;th colspan="2"&gt;Category Table&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;th&gt;CategoryID&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;1&lt;/td&gt;&lt;td&gt;Bings&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;In this case, the numeric ID "1" is stored several times but that takes up a lot less space than the word "Bings" which is now only stored once. &amp;nbsp;It also means that if I need to change the name of that category, I only need to change it in one location, thus improving my data consistency.&lt;br /&gt;&lt;br /&gt;This system has been implemented widely. &amp;nbsp;Some architectures that you might come across, such as SAP or Oracle Financials, have thousands of tables, all perfectly crafted to store the data most efficiently in the relational database. &amp;nbsp;Normalization works great for transactional databases like this.&lt;br /&gt;&lt;br /&gt;For designers, the problem occurred when people started reading data out of the transactional system, especially for reporting. &amp;nbsp;Because the queries now had to hop across several joins, the performance suffers immensely. &amp;nbsp;So, they started either undoing the normalisation process (denormalising) or, worse, keeping the normalised tables but duplicating the data into other tables so that queries ran quicker - a nightmare for data consistency. &amp;nbsp;Both approaches lead to an increase in the data storage requirements meaning that databases bloat more an more - but we can just throw hardware at that issue, right?&lt;br /&gt;&lt;br /&gt;So, what is the best thing to do in QlikView? &amp;nbsp;A colleague of mine who was recently trained asked me about this because of the exercise that was to move the category table's data into the product table, hence denormalizing. &amp;nbsp;"Why?", he asked. &amp;nbsp;"Doesn't QlikView work just as well either way?".&lt;br /&gt;&lt;br /&gt;There are a couple of reasons as to why you might do this. &amp;nbsp;And a couple of reasons why you might not.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reasons for&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In&amp;nbsp;&lt;a href="http://www.kimballgroup.com/html/articles_search/articles1997/9708d15.html"&gt;one of his articles&lt;/a&gt;, Kimball suggests that such "snow-flaking" (leaving the category out of the product table) "compromises cross-attribute browsing performance". &amp;nbsp;Not only that, it "may interfere with the legibility of the database". &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;So that gives us 2 reasons:&lt;br /&gt;&lt;br /&gt;- Performance&lt;br /&gt;- Improved schema readability&lt;br /&gt;&lt;br /&gt;And I will add a 3rd:&lt;br /&gt;&lt;br /&gt;- Data size.&lt;br /&gt;&lt;br /&gt;In the QlikView underlying data cloud, there will be an association between the product fields and the CategoryID field. &amp;nbsp;There will also be an association between the CategoryID field and the CategoryName field. &amp;nbsp;If I move the CategoryName into the product table (either map or join), I can then remove the CategoryID field and hence remove a redundant set of associations. &amp;nbsp;The CategoryName is not duplicated in QlikView because the columnar database still only stores it once.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reasons against&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;- Performance&lt;br /&gt;- Improved schema readability&lt;br /&gt;- Data size&lt;br /&gt;&lt;br /&gt;I'm sure that you will be thinking that there is some sort of error here. &amp;nbsp;How can I have the same set of reasons "against" as I did "for"?&lt;br /&gt;&lt;br /&gt;It depends! &amp;nbsp;It depends really on the number of records in each table and the number of fields. &amp;nbsp;For a relationship like product and category, there is probably only a few fields in the category table and it can really make sense to denormalise (it almost always make sense to do this for a table with only 2 fields - using ApplyMap). &amp;nbsp;However, with a couple of tables like, say, Order and Calendar, where Order may have millions of records and Calendar could have ten or more fields, it makes sense to keep them apart and just have the key association on the DateID field. &amp;nbsp;If you did join them in, it would mean that you could drop the DateID field but you would then have associations maintained between each field in the Order table and Year, and Month, and Day, and Week, etc., etc. &amp;nbsp;Many more associations being maintained than before and increasing your data size and possibly reducing your performance. &amp;nbsp;It may also become difficult to see the date fields in the schema whereas they are plain to see in their own Calendar table.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7241224155142088164?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7241224155142088164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/11/denormalize-for-performance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7241224155142088164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7241224155142088164'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/11/denormalize-for-performance.html' title='Denormalize for Performance'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3566594969055530621</id><published>2011-10-28T14:36:00.000+01:00</published><updated>2011-10-28T14:36:11.534+01:00</updated><title type='text'>Color coding RAGs</title><content type='html'>I have been thinking a lot about color and its use in data presentation recently. &amp;nbsp;Color use is something that is especially of interest to me as I find myself to be one of the 8-10% of the male population who suffers from color blindness. &amp;nbsp;In my case, I have the most common difficulty which is red-green. &amp;nbsp;Essentially what happens is that different shades of red and green become more brown to me and therefore two distinct colors, that have a similar saturation and brightness, may actually appear to be the same to me.&lt;br /&gt;&lt;br /&gt;One area where this is particularly significant is with RAGs - Red, Amber, Green indicators which will usually indicate Bad, not so bad, and good respectively.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-GC1csPLB77g/TqqqP1vcjVI/AAAAAAAAAGs/c2le0NyrrEI/s1600/RAG.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-GC1csPLB77g/TqqqP1vcjVI/AAAAAAAAAGs/c2le0NyrrEI/s320/RAG.jpg" width="177" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this example, I have shown pure red, amber and pure green. &amp;nbsp;For me, while they are relatively easy to spot here, the green and amber colors can look very similar on smaller displays or where they are not right together (like in a traffic-light or beacons on a page).&lt;br /&gt;&lt;br /&gt;I always like to use Stephen Few as a reference and he has discussed this in his books as well as this useful article: &amp;nbsp;&lt;a href="http://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf"&gt;Practical Rules for Using Colors in Charts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If we think about it, the situations of good, not so good, and bad are actually a sequence so would fall under Stephen's rule 6:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When using color to encode a sequential range of quantitative values,&amp;nbsp;stick with a single hue (or a small set of closely related hues) and vary&amp;nbsp;intensity from pale colors for low values to increasingly darker and brighter&lt;br /&gt;colors for high values.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, why should we have to use red, amber and green? &amp;nbsp;Perhaps another solution would be just to use shades of red:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-u8FBmkqjA1w/TqqqPZ_ZsSI/AAAAAAAAAGo/1se0e_zw1H0/s1600/NewRAG.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-u8FBmkqjA1w/TqqqPZ_ZsSI/AAAAAAAAAGo/1se0e_zw1H0/s320/NewRAG.jpg" width="179" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here we have an almost white color representing good (and white would be a good option too as most people are not looking for good, just for the bad). &amp;nbsp;The range gets darker along with the situation.&lt;br /&gt;&lt;br /&gt;Of course, one of the problems that might be raised with you is that people "intuitively" understand RAG and that one needs to conform to the "norm".&lt;br /&gt;&lt;br /&gt;This thinking was fresh in my mind while recently passing through a UK airport. &amp;nbsp;They have the normal type of gate signs which they have color coded for 4 statii which are to advise passengers on the status of boarding their flight: nothing happening, go to gate, plane is boarding, gate is closing.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-oHavIwXFujs/TqqqRFqZ4gI/AAAAAAAAAG4/rYGVp8GQ3G8/s1600/GateInfo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://3.bp.blogspot.com/-oHavIwXFujs/TqqqRFqZ4gI/AAAAAAAAAG4/rYGVp8GQ3G8/s400/GateInfo.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The "nothing" status is represented by no color - it matches the black background and that is probably a good choice. &amp;nbsp;The "closing" status is dark red and this is also a good choice because that indicates (in "western" society anyway) danger and the need to get a move on. &amp;nbsp;However, the "go to gate" is coded in amber and the "boarding" is green. &amp;nbsp;This doesn't appear very logical to me as, if I was some way from the gate, "boarding" would be something much more urgent than "go to gate". &amp;nbsp;I am sure that there is a logical explanation, but this doesn't come across to me.&lt;br /&gt;&lt;br /&gt;Here, I think, would be a good idea to use something like white background for "go to gate" and something like amber or yellow for "boarding" - they are logically closer to the red of "closing" and should indicate to the passenger that they should get to the gate asap.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3566594969055530621?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3566594969055530621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/10/color-coding-rags.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3566594969055530621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3566594969055530621'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/10/color-coding-rags.html' title='Color coding RAGs'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-GC1csPLB77g/TqqqP1vcjVI/AAAAAAAAAGs/c2le0NyrrEI/s72-c/RAG.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2446188425405382831</id><published>2011-09-15T22:57:00.000+01:00</published><updated>2011-09-15T22:57:22.533+01:00</updated><title type='text'>Setting default display format</title><content type='html'>Following on from the last post on &lt;a href="http://qliktips.blogspot.com/2011/09/setting-default-sort-order.html"&gt;Setting default sort order&lt;/a&gt;, there are other things that we can load up in advance that can be of assistance.&lt;br /&gt;&lt;br /&gt;For example, I have a date field called OrderDate which is coming in with a default format of DD/MM/YYYY hh:mm:ss but the time portion has no use to me because it is just 00:00:00 for all the dates.&lt;br /&gt;&lt;br /&gt;Now, I could load this using a simple:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Date(OrderDate, 'DD/MM/YYYY') As OrderDate,&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;This is what I would normally do. &amp;nbsp;However, what if the data is coming from a very large QVD and I would like to keep the optimized load. &amp;nbsp;Applying a format function like this will prevent the load being optimized. &amp;nbsp;So, I should do the format in the script that creates the QVD - but what if I am not controlling that?&lt;br /&gt;&lt;br /&gt;Simple - just as with the load order, the default format of a field is set when you first load it. &amp;nbsp;We can create a simple load like this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;FormatTable:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Load&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;Num(0, '#,##0.00') as LineSalesAmount,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;Date(Today(), 'DD/MM/YYYY') As OrderDate&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;AutoGenerate(1);&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, I go ahead and load my Order table (note that I have included a format for the sales value too - you can have as many as you need).&lt;br /&gt;&lt;br /&gt;Sometime after I have loaded the Order table, I need to drop the Format Table:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Drop Table FormatTable;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope this saves you a bit of time.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2446188425405382831?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2446188425405382831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/09/setting-default-display-format.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2446188425405382831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2446188425405382831'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/09/setting-default-display-format.html' title='Setting default display format'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4157121452308629641</id><published>2011-09-15T22:43:00.000+01:00</published><updated>2011-09-15T22:43:08.826+01:00</updated><title type='text'>Setting default sort order</title><content type='html'>Sometimes we load some categorical data (e.g. Country) that we want to display in a specific order other than the default (alphabetical for example). &amp;nbsp;Here's an example that you might have come across:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; High, Medium, Low&lt;br /&gt;&lt;br /&gt;An interesting thing about QlikView is that it remembers how things are first loaded. &amp;nbsp;We can use this little trick to load a temporary table with just the field that we want in the order that we want. &amp;nbsp;Then, even if we drop this table later, QlikView remembers that order and we can use the "Load Order" sort option.&lt;br /&gt;&lt;br /&gt;Here is an example. &amp;nbsp;If I had a sales table like this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Sales:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;CrossTable(Year, Sales)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Load * Inline [&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Country, 2009, 2010, 2011&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Ireland, 200, 300, 400&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Scotland, 100, 150, 300&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Wales, 500, 300, 400&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;England, 800, 700, 800&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;];&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But, rather than the alpha-sort of England, Ireland, Scotland, Wales, I would like to have Wales, Ireland, England, Scotland, then I can load a table just before the Sales table like this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;SortOrder:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Load * Inline [&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Country&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Wales&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Ireland&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;England&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Scotland&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;];&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then, sometime after I have loaded the Sales table, I can drop the SortOrder table:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Drop Table SortOrder;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, I can use the "Load Order" sort:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cJVJKbIMR6w/TnJxL8g9VUI/AAAAAAAAAGY/6E9ThcrQcz0/s1600/SortImage.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-cJVJKbIMR6w/TnJxL8g9VUI/AAAAAAAAAGY/6E9ThcrQcz0/s400/SortImage.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4157121452308629641?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4157121452308629641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/09/setting-default-sort-order.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4157121452308629641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4157121452308629641'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/09/setting-default-sort-order.html' title='Setting default sort order'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cJVJKbIMR6w/TnJxL8g9VUI/AAAAAAAAAGY/6E9ThcrQcz0/s72-c/SortImage.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4472216032663788409</id><published>2011-08-15T13:28:00.000+01:00</published><updated>2011-08-15T13:28:27.533+01:00</updated><title type='text'>Irish crime stats.  Sleeping easy in my bed?</title><content type='html'>I was interested to see the recent announcement of the quarterly Irish crime statistics for Q2 of 2011 by the &lt;a href="http://www.cso.ie/"&gt;Central Statistics Office&lt;/a&gt;. &amp;nbsp;The press surrounding this latest information hailed the quarter-on-quarter reduction in crime across all categories (for example, from the &lt;a href="http://www.examiner.ie/ireland/crime/crime-figures-decline-in-all-categories-162558.html"&gt;Irish Examiner&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So, I thought that I would grab the CSO figures and run them into QlikView. &amp;nbsp;You can download the resulting document from &lt;a href="http://community.qlikview.com/qlikviews/1132"&gt;QlikCommunity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0HylGDU-sy8/TkkMfV-BOAI/AAAAAAAAAGA/K2nVUzXlaJc/s1600/Crime-Image1.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://2.bp.blogspot.com/-0HylGDU-sy8/TkkMfV-BOAI/AAAAAAAAAGA/K2nVUzXlaJc/s400/Crime-Image1.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It does indeed appear that the crime figures are down across all categories. &amp;nbsp;Of course, one swallow does not make a summer and neither does a change between one period and another indicate a trend. &amp;nbsp;This is where a control charts come in most usefully - is there a downward trend?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mFh8agOjFR4/TkkMfp7RtaI/AAAAAAAAAGE/ZafrOqQ35pY/s1600/Crime-Image2.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://2.bp.blogspot.com/-mFh8agOjFR4/TkkMfp7RtaI/AAAAAAAAAGE/ZafrOqQ35pY/s400/Crime-Image2.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Looking at the national figures in a control chart, it does look like there is a steady downward trend. &amp;nbsp;The latest figures have dropped below the control limits (my limits are based on the 2006-2008 data). &amp;nbsp;There is a certain seasonality about the crime figures so I have added a 4 period mean here. &amp;nbsp;Even that appears to be dropping. &amp;nbsp;Looks like the police are doing a great job.&lt;br /&gt;&lt;br /&gt;I thought that I might have a delve around in the figures and thought about which if the different crime categories would be more of a concern to me. &amp;nbsp;For example, I am not terribly worried about public order offences, but I am a little more worried about my car being broken into. &amp;nbsp;I don't worry about homicide (Ireland has one of the lowest rates in the world) but I do have concerns about being assaulted. &amp;nbsp;There are some crimes that are more "personal" than others.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-n5nDFHPx6E4/TkkMgA9JTEI/AAAAAAAAAGM/LfR861zLu7k/s1600/Crime-Image4.jpeg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://4.bp.blogspot.com/-n5nDFHPx6E4/TkkMgA9JTEI/AAAAAAAAAGM/LfR861zLu7k/s400/Crime-Image4.jpeg.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If I break down the categories into the ones that I am more concerned about (assaults,&amp;nbsp;burglary, robbery, theft, sexual assault), I see that these represent 45% of the total figures for the whole data set. &amp;nbsp;Interestingly, this is now 48.6% for just 2011!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5k1_Pl1lcOw/TkkMf8mzpoI/AAAAAAAAAGI/xSdLYQJk030/s1600/Crime-Image3.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://2.bp.blogspot.com/-5k1_Pl1lcOw/TkkMf8mzpoI/AAAAAAAAAGI/xSdLYQJk030/s400/Crime-Image3.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When I look at these categories in the control chart, I see that these are not decreasing. &amp;nbsp;They are steadily above the mean line for the last 16 quarters. &amp;nbsp;While some have associated increases with the recessionary times, it appears that the increase started in 2007 - a year before Lehman Brothers collapsed.&lt;br /&gt;&lt;br /&gt;So, while the Gardaí (Irish police) are doing a good job in reducing crime in some areas, there are some that perhaps need more attention.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4472216032663788409?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4472216032663788409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/08/irish-crime-stats-sleeping-easy-in-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4472216032663788409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4472216032663788409'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/08/irish-crime-stats-sleeping-easy-in-my.html' title='Irish crime stats.  Sleeping easy in my bed?'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-0HylGDU-sy8/TkkMfV-BOAI/AAAAAAAAAGA/K2nVUzXlaJc/s72-c/Crime-Image1.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-6426567359055332558</id><published>2011-07-29T11:10:00.000+01:00</published><updated>2011-07-29T11:10:45.706+01:00</updated><title type='text'>Out of Control?  Dublin Climate Data</title><content type='html'>Last year, I attended&amp;nbsp;&lt;a href="http://www.staceybarr.com/"&gt;Performance Measure Blueprint training with Stacey Barr&lt;/a&gt;. &amp;nbsp;One of Stacey's recommended visualizations was the &lt;a href="http://en.wikipedia.org/wiki/Control_chart"&gt;statistical control chart&lt;/a&gt;. &amp;nbsp;Stacey also recommended&amp;nbsp;&lt;a href="http://www.amazon.com/Understanding-Variation-Key-Managing-Chaos/dp/0945320531"&gt;"Understanding Variation: The Key to Managing Chaos" by Donald J. Wheeler&lt;/a&gt;&amp;nbsp;in this regard.&lt;br /&gt;&lt;br /&gt;Essentially, the control chart introduces some solid statistical thinking into the analysis of data. &amp;nbsp;Quite often, people might have a bipolar view of variation in data - things are up on last month, everything is good, things are down on last month, everything is bad and we need to start changing the process to make sure that things are up next month! &amp;nbsp;The control chart allows us to see that these up/down variations are part of a statistically expected change and, unless they are outside of the control lines or, repeatedly above or below the mean.&lt;br /&gt;&lt;br /&gt;An after-dinner discussion recently, on the probability of having a good/bad summer or a cold/mild winter, led me to think of applying control charts to climate data for Dublin.&lt;br /&gt;&lt;br /&gt;I was able to obtain historical data from &lt;a href="http://eca.knmi.nl/"&gt;European Climate Assessment &amp;amp; Dataset&lt;/a&gt;&amp;nbsp;and more recent data from &lt;a href="http://www.met.ie/"&gt;MET Éireann&lt;/a&gt; (the Irish&amp;nbsp;meteorological&amp;nbsp;service).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The QlikView document that I created is available to download from &lt;a href="http://community.qlikview.com/qlikviews/1129"&gt;QlikCommunity&lt;/a&gt;&amp;nbsp;and will shortly be available to view on &lt;a href="http://share.qlikview.com/"&gt;share.qlikview.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some interesting analysis!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--vmdPCVEUNs/TjKCQUXW60I/AAAAAAAAAFg/GB8s0K7CacA/s1600/01+Avg.+Temp+Per+Year.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/--vmdPCVEUNs/TjKCQUXW60I/AAAAAAAAAFg/GB8s0K7CacA/s400/01+Avg.+Temp+Per+Year.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is a perception amongst Irish people (especially after a very unusual period of snow last December) that winters are getting much colder and hence we are likely to have a cold winter again this year.&lt;br /&gt;&lt;br /&gt;Looking at the data since 1881 (control is based on average between 1961 and 1990 - this is the comparison period used by MET Éireann), it appears that the Dublin climate has been up and down through the 150 years but has always been within the Control - except for 2010. &amp;nbsp;The average temperature for 2010 made a huge dive south and is now out of control. &amp;nbsp;It would appear that yes, the winters are getting colder and we should all invest in snow chains and shovels that we never needed before.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-xAg4nWaEPRs/TjKDnNm1czI/AAAAAAAAAFk/NDphBhMghRM/s1600/02+Avg.+Temp+Per+YearMonth+-+Outside+Control.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="108" src="http://2.bp.blogspot.com/-xAg4nWaEPRs/TjKDnNm1czI/AAAAAAAAAFk/NDphBhMghRM/s400/02+Avg.+Temp+Per+YearMonth+-+Outside+Control.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Looking at the data by month, it appears to be even more apparent. &amp;nbsp;The last couple of winters both have troughs outside the control. &amp;nbsp;I do need a new woolen coat - I might get it cheaper if I buy it now.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9OgT3QdU7Fk/TjKEHzwpi9I/AAAAAAAAAFo/Y_fB_b7EUps/s1600/03+Avg.+Temp+Per+Month+2010+-+Outside+Control.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="98" src="http://4.bp.blogspot.com/-9OgT3QdU7Fk/TjKEHzwpi9I/AAAAAAAAAFo/Y_fB_b7EUps/s400/03+Avg.+Temp+Per+Month+2010+-+Outside+Control.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;An interesting thing about the two troughs in the monthly chart though, they are both representing months that are in one year period - 2010. &amp;nbsp;2010 had 2 of the coldest months for a long time (December was the coldest on record) so that would be why the year as a whole was so far south of the control line. &amp;nbsp;But those 2 months were not concurrent - they were at either end of the year. &amp;nbsp;Maybe I don't need to get that coat yet?&lt;br /&gt;&lt;br /&gt;Perhaps, if I want to look at "winter", I should look at the data in seasons instead. &amp;nbsp;So, in my QlikView document, I created a dimension called Season and one called YearSeason - breaking the data into "traditional" seasons of winter = Nov-Jan, spring = Feb-Apr, etc.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rhIxTiv9MOU/TjKFT-txLoI/AAAAAAAAAFs/4jW6Ssm2C58/s1600/04+Avg.+Temp+Per+Winter+1960-2010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="102" src="http://4.bp.blogspot.com/-rhIxTiv9MOU/TjKFT-txLoI/AAAAAAAAAFs/4jW6Ssm2C58/s400/04+Avg.+Temp+Per+Winter+1960-2010.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hmm. &amp;nbsp;This data is every winter from 1960 to 2010 (which includes January 2011). &amp;nbsp;This is quite interesting because it shows that, despite having the coldest December on record, the winter of 2010 was still inside the control. &amp;nbsp;In fact, other cold winters such as 1962 and 1976 also are within the control.&lt;br /&gt;&lt;br /&gt;So, how cold will the winter of 2011 be? &amp;nbsp;I can't say for sure but, I do have a good level of statistical confidence that it will be less severe than 2010. &amp;nbsp;The system is still in control and the historical evidence is that it will stay in control.&lt;br /&gt;&lt;br /&gt;Maybe I don't need those snow chains - not just yet anyway.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-6426567359055332558?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/6426567359055332558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/07/out-of-control-dublin-climate-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6426567359055332558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6426567359055332558'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/07/out-of-control-dublin-climate-data.html' title='Out of Control?  Dublin Climate Data'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--vmdPCVEUNs/TjKCQUXW60I/AAAAAAAAAFg/GB8s0K7CacA/s72-c/01+Avg.+Temp+Per+Year.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7217664716518883769</id><published>2011-07-12T22:21:00.000+01:00</published><updated>2011-07-12T22:21:34.747+01:00</updated><title type='text'>Is it time to replace the Quick Chart Wizard?</title><content type='html'>I have been contemplating the Quick Chart Wizard in QlikView recently.&lt;br /&gt;&lt;br /&gt;Creating charts in QlikView is very easy once you have a reasonably good grasp of the properties and where everything is. &amp;nbsp;However, for "business" users, this is not always simple. &amp;nbsp;Enter the Quick Chart Wizard. &amp;nbsp;My experience, however, is that the output of the Quick Chart Wizard is almost never an immediately usable chart - you almost always have to then go into the properties to clean it up.&lt;br /&gt;&lt;br /&gt;There are, I believe, only a couple of options that need to be set in the Wizard to make it produce immediately usable charts almost all the time. &amp;nbsp;And while we are at it, why not do away with a "Wizard" at all and just have everything visible on one page with a preview of what you are building.&lt;br /&gt;&lt;br /&gt;Here is my proposed solution:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JHzw3ydGcwM/Thy6Vfk5H7I/AAAAAAAAAFc/re8I3q1n72I/s1600/Proposed+New+Quick+Chart+Wizard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="293" src="http://4.bp.blogspot.com/-JHzw3ydGcwM/Thy6Vfk5H7I/AAAAAAAAAFc/re8I3q1n72I/s400/Proposed+New+Quick+Chart+Wizard.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;What do you think?&lt;br /&gt;&lt;br /&gt;Design reasoning:&lt;br /&gt;&lt;br /&gt;Dimensions - only 2 (instead of 3 in current Wizard). &amp;nbsp;Vast majority of charts will have 1 dimension. &amp;nbsp;3 is a rarer requirement so remove from Quick Wizard.&lt;br /&gt;&lt;br /&gt;Expression - Only one option (as per current Wizard). &amp;nbsp;Added option to label the expression.&lt;br /&gt;&lt;br /&gt;Chart options - reduced to 4 of the most common used (removed Pie and Guage from existing Wizard). &amp;nbsp;Give options on Orientation and Mode (which grey out if not relevant)&lt;br /&gt;&lt;br /&gt;Titles - not available in current Wizard but something that users will almost always want to change.&lt;br /&gt;&lt;br /&gt;Sort by: &amp;nbsp;I never create a Bar chart that I don't specify a sort order on, so this should be available as an option.&lt;br /&gt;&lt;br /&gt;Dimension Limitations: &amp;nbsp;With bar charts, this is something that I probably do more often than not.&lt;br /&gt;&lt;br /&gt;Preview Window: &amp;nbsp;Show the user exactly what they are building as they are building it.&lt;br /&gt;&lt;br /&gt;I am really interested in all opinions on this. &amp;nbsp;Does anyone think that the existing Wizard has value?&lt;br /&gt;&lt;br /&gt;Join the discussion on &lt;a href="http://community.qlikview.com/thread/31643"&gt;QlikCommunity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7217664716518883769?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7217664716518883769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/07/is-it-time-to-replace-quick-chart.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7217664716518883769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7217664716518883769'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/07/is-it-time-to-replace-quick-chart.html' title='Is it time to replace the Quick Chart Wizard?'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-JHzw3ydGcwM/Thy6Vfk5H7I/AAAAAAAAAFc/re8I3q1n72I/s72-c/Proposed+New+Quick+Chart+Wizard.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1465058763790463064</id><published>2011-07-12T19:31:00.001+01:00</published><updated>2011-07-12T19:32:51.062+01:00</updated><title type='text'>Alternative to Grid-Style Multi-Boxes in Ajax</title><content type='html'>I quite like the "grid style" format for multi-boxes. &amp;nbsp;In a limited width, I think that it is a better format for the drop-downs because you get the full width of the control rather than the truncated width of just the drop-down part in the standard view.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-iB0c7COSn7k/ThyQSgzwCJI/AAAAAAAAAFU/jSDVVuhjKhM/s1600/MB_Grid1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://1.bp.blogspot.com/-iB0c7COSn7k/ThyQSgzwCJI/AAAAAAAAAFU/jSDVVuhjKhM/s320/MB_Grid1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A problem for me is that "grid style" does not render at all in Ajax (I can't understand why!)&lt;br /&gt;&lt;br /&gt;I picked up an interesting tip yesterday from QlikView's &lt;a href="http://www.linkedin.com/in/kennethlewis"&gt;Kenneth Lewis&lt;/a&gt;. &amp;nbsp;How about using a Container control with multiple list boxes? &amp;nbsp;I thought about it and then tried it out. &amp;nbsp;I think that it works quite nicely. &amp;nbsp;By adding several list boxes and then setting the Appearance property of the Container to "dropdown at top", I get a result that works in both QV and Ajax.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XPuPVWDPYdY/ThyRi04gpQI/AAAAAAAAAFY/C2HHtRGGDHI/s1600/MB_Grid2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://3.bp.blogspot.com/-XPuPVWDPYdY/ThyRi04gpQI/AAAAAAAAAFY/C2HHtRGGDHI/s320/MB_Grid2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It is not a perfect replacement for the grid-style multibox but, in some ways, it is better. &amp;nbsp;I like the fact that you have the list box icons available and it is easier to see the Green/White/Grey.&lt;br /&gt;&lt;br /&gt;Have a play with it and see what you think.&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1465058763790463064?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1465058763790463064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/07/grid-style-multi-boxes-in-ajax.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1465058763790463064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1465058763790463064'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/07/grid-style-multi-boxes-in-ajax.html' title='Alternative to Grid-Style Multi-Boxes in Ajax'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-iB0c7COSn7k/ThyQSgzwCJI/AAAAAAAAAFU/jSDVVuhjKhM/s72-c/MB_Grid1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1926761580964319003</id><published>2011-06-30T13:00:00.000+01:00</published><updated>2011-06-30T13:00:49.439+01:00</updated><title type='text'>Nobody said it was easy ... Configuring LDAP</title><content type='html'>Recently I was in discussions with a client where they wanted to authenticate users against a Netscape LDAP server. &amp;nbsp;Of course, I told them that this would be no problem because QlikView 10 now comes with a Configurable LDAP directory service connector. &amp;nbsp;Easy peasy!&lt;br /&gt;&lt;br /&gt;The client was satisfied and look like they will go ahead and order the new licenses (yay!) and hardware to implement it on.&lt;br /&gt;&lt;br /&gt;Gulp! &amp;nbsp;I still hadn't played with this LDAP connector so I though I better get some handle on it before the implementation went ahead. &amp;nbsp;Of course, there is bountiful documentation on it in the server reference manual (well, just under 2 pages). &amp;nbsp;Luckily I had recently met the genius that is &lt;a href="http://nl.linkedin.com/in/michaelrobertshaw"&gt;Michael Robertshaw&lt;/a&gt;, a Solutions Consultant for QlikView in the Netherlands. &amp;nbsp;With some guidance from him, I was able to get up and running.&lt;br /&gt;&lt;br /&gt;I found a distribution of &lt;a href="http://www.userbooster.de/en/download/openldap-for-windows.aspx"&gt;OpenLDAP&lt;/a&gt;&amp;nbsp;for Windows and installed it on my PC. &amp;nbsp;Once I had an idea of what I was doing, it was actually quite straightforward (Note - choose BDB database, not LDAP during setup and all will be well!) &amp;nbsp;Once I was up and running, I used a tool called &lt;a href="http://ldapadmin.sourceforge.net/"&gt;LDAP Admin&lt;/a&gt; to add new users and groups.&lt;br /&gt;&lt;br /&gt;Now to the QlikView side of things. &amp;nbsp;I had thought that this should be quite straightforward. &amp;nbsp;It wasn't initially, but with the help of Michael I got there in the end. &amp;nbsp;The important thing to know is that LDAP and Active Directory LDAP are not&amp;nbsp;necessarily&amp;nbsp;the same thing. &amp;nbsp;There are a lot of differences. &amp;nbsp;Unfortunately, the defaults for the DSP entries are AD ones so these needed to change. &amp;nbsp;Also, the way that the server is specified is not as easy as I thought it should be, but easy to get right once you know.&lt;br /&gt;&lt;br /&gt;I had thought that the correct Path entry for my server should have been:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;LDAP://myserver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is what you will see for AD. &amp;nbsp;However, I also found that you need to specify the base search path in this string for me, with my settings of "mydomain.com", this was:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;LDAP://myserver/dc=mydomain,dc=com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once I added this and the correct username and password (note that the username needs to be the fully qualified name, e.g. cn=Manager,dc=mydomain,dc=com), I was able to think about the DSP settings. &amp;nbsp;These are accessed via the pencil icon beside the password box. &amp;nbsp;Now, this is where the Active Directory defaults will need to be changed. &amp;nbsp;The defaults are:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Account Name &amp;nbsp; &amp;nbsp; &amp;nbsp; : sAMAccountName&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Directory Label &amp;nbsp; &amp;nbsp;: DSP1 *&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Display Name &amp;nbsp; &amp;nbsp; &amp;nbsp; : name&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Distinguished Name : distinguishedName&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Group member &amp;nbsp; &amp;nbsp; &amp;nbsp; :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Group object class : group&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Id Property name &amp;nbsp; : sAMAccountName&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;LDAP Filter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:&amp;nbsp;(&amp;amp;(!(objectclass=computer))(objectGUID=*))&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;User member of &amp;nbsp; &amp;nbsp; : memberOf&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;User object class &amp;nbsp;: user&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* the directory label is how you will identify users to QlikView, e.g. in this case - DSP1\username.&lt;br /&gt;&lt;br /&gt;With advice from Michael and some testing, I found the best settings for OpenLDAP (other LDAPs may be different - use the LDIF information to help you work it out) to be:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Account Name &amp;nbsp; &amp;nbsp; &amp;nbsp; : cn&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Directory Label &amp;nbsp; &amp;nbsp;: MyDomain&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Display Name &amp;nbsp; &amp;nbsp; &amp;nbsp; : displayName&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Distinguished Name : dn&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Group member &amp;nbsp; &amp;nbsp; &amp;nbsp; :&amp;nbsp;memberUid&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Group object class : posixGroup&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Id Property name &amp;nbsp; : cn&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;LDAP Filter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;(yes, this is blank!)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;User member of &amp;nbsp; &amp;nbsp; : memberOf &amp;nbsp;**&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;User object class &amp;nbsp;: posixAccount&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;** memberOf (used to check users are in a group) will only work in OpenLDAP if the memberOf overlay is enabled and working.&lt;br /&gt;&lt;br /&gt;With these settings, I am now able to use the UserManagement in Enterprise Management Console to query the LDAP directory.&lt;br /&gt;&lt;br /&gt;I tested that it was working by creating a new document on my server and used DMS to give access to a user called MyDomain\jdoe (who was a valid user in my LDAP). &amp;nbsp;I then generated a ticket for the user and connected successfully to the document.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1926761580964319003?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1926761580964319003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/06/nobody-said-it-was-easy-configuring.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1926761580964319003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1926761580964319003'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/06/nobody-said-it-was-easy-configuring.html' title='Nobody said it was easy ... Configuring LDAP'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5953377893539573297</id><published>2011-06-14T11:41:00.000+01:00</published><updated>2011-06-14T11:41:25.605+01:00</updated><title type='text'>AND Mode in Set Analysis</title><content type='html'>Was on QlikCommunity recently and answered a query by Lawrence Chapman -&amp;nbsp;&lt;a href="http://community.qlikview.com/message/123624"&gt;Like for Like&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When Lawrence replied, he said that he was looking for something quite reasonable in his chart - only sites that had records for all the 4 years.&lt;br /&gt;&lt;br /&gt;I was thinking that this should be quite straightforward and then had to have another think! &amp;nbsp;The thing about QlikView set analysis is that it is just a set of selections. &amp;nbsp;The default selection mode in a field in QlikView is "OR". &amp;nbsp;So, if I select all the 4 years, I will still select all the sites because all of them are in at least one year. &amp;nbsp;Creating a set based in the year field wouldn't work for what Lawrence wanted.&lt;br /&gt;&lt;br /&gt;I thought about how I would select those sites if I was just doing it in the layout (which is a great strategy for designing a set). &amp;nbsp;The only way that I can think of doing it is to have a selection box using QlikView's AND-mode.&lt;br /&gt;&lt;br /&gt;Now, for AND-mode to be enabled, there are a certain number of criteria that need to be fulfilled. &amp;nbsp;Basically, the field needs to be in a table of only 2 fields and it is the 2nd field (the first is the key field associating the rest of the data set). &amp;nbsp;Also, the table needs to be loaded with the DISTINCT keyword to remove duplicates (have a look in the help file for more info).&lt;br /&gt;&lt;br /&gt;Let me create a quick example to show this in action. &amp;nbsp;Here is a sales table:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Sales:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;LOAD * INLINE [&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer, Year, Sales&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer A, 2009, 111&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer B, 2009, 111&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer C, 2009, 111&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer A, 2010, 222&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer B, 2010, 222&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer C, 2010, 222&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer A, 2011, 333&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Customer C, 2011, 333&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;];&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You will note that only Customer A and Customer C exist in all years. &amp;nbsp;However, if I load this data, there is no set that I can create that shows me just the totals for those 2 customers based only on the fact that they have sales in each of the years.&lt;br /&gt;&lt;br /&gt;So, I will create an AND-mode field:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;SalesYear:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Load Distinct&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Customer,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Year As SalesYear&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Resident Sales;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once loaded, I add this field to the layout and select the "AND-mode" option in the List Box properties (this option will be&amp;nbsp;grayed&amp;nbsp;out unless the field&amp;nbsp;fulfills&amp;nbsp;the&amp;nbsp;criteria&amp;nbsp;above).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;N.B.&lt;/b&gt; &amp;nbsp;At this stage, just after setting "AND-mode" in the list box, you may need to just run a re-load to set the internal flag that makes everything else below work.&lt;br /&gt;&lt;br /&gt;Now, I can create a set expression like this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Sum({&amp;lt;SalesYear={2009,2010,2011}&amp;gt;} Sales)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And it will only show me the sales for Customer A and C.&lt;br /&gt;&lt;br /&gt;I could make this more generic by limiting the SalesYear to the currently selected Years:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;Sum({&amp;lt;SalesYear=P({$} Year)&amp;gt;} Sales) &lt;/div&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5953377893539573297?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5953377893539573297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/06/and-mode-in-set-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5953377893539573297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5953377893539573297'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/06/and-mode-in-set-analysis.html' title='AND Mode in Set Analysis'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2456761664020603832</id><published>2011-05-20T17:20:00.000+01:00</published><updated>2011-05-20T17:20:56.698+01:00</updated><title type='text'>It's the discovery, stupid!</title><content type='html'>QlikView is Qool. &amp;nbsp;It looks great. &amp;nbsp;It is easy to create great looking content. &amp;nbsp;It is fantastically easy to create content and distribute to multiple users. &amp;nbsp;What could possibly be bad? &amp;nbsp;I love QlikView, I think it looks great.&lt;br /&gt;&lt;br /&gt;I was surprised recently to read&amp;nbsp;Jay Jakosky's blog entry entitled,&amp;nbsp;&lt;a href="http://andpointsbeyond.com/2011/04/01/can-a-humble-chart-object-get-some-love/"&gt;"Can a humble chart object get some love"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Amazingly, after 5 years working with QlikView, this was the first time that I have heard anyone suggest that QlikView displays are anything but fantastically beautiful. &amp;nbsp;Jay makes some valid points about displays and about how QlikView's competitors do things. &amp;nbsp;The real point is that it's not about the display!&lt;br /&gt;&lt;br /&gt;You see, 99 times out of a 100, you don't need to think about displays like these. &amp;nbsp;For the other 1 time, you can probably do it another way - probably a much simpler and more effective way.&lt;br /&gt;&lt;br /&gt;It's not about the display. &amp;nbsp;It's not about the bells and whistles. &amp;nbsp;It is about the effective presentation of lots of data in an intuitive and easy to use fashion that users love to use. &amp;nbsp;It is about allowing users to navigate around their data so that they can find real answers to real business problems real quickly.&lt;br /&gt;&lt;br /&gt;It's the discovery, stupid!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S. &amp;nbsp;I'm not really calling anyone stupid just because they have a different opinion to mine - just paraphrasing the famous Clinton camp slogan from the 1992 US Presidential election.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2456761664020603832?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2456761664020603832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/05/its-discovery-stupid.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2456761664020603832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2456761664020603832'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/05/its-discovery-stupid.html' title='It&apos;s the discovery, stupid!'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-915323876382523352</id><published>2011-05-17T17:16:00.000+01:00</published><updated>2011-05-17T17:16:08.073+01:00</updated><title type='text'>Rules for creating a Key/Link Table in QlikView</title><content type='html'>A key/link table is frequently required in QlikView to resolve Synthetic Key or Circular Join issues. &amp;nbsp;It can also help to tidy &amp;nbsp;up a schema that has tables all over the place. &amp;nbsp;The goal is to create a star (and sometimes snowflake) schema with dimension tables connected to a central key table. &amp;nbsp;Unlike in classical data warehousing, the central table doesn't often have the measures - they generally stay in the dimension tables.&lt;br /&gt;&lt;br /&gt;There are 3 rules for creating a key table. &amp;nbsp;The first 2 are very straightforward - the last is where you need to use your skill and judgement to create the right result. &amp;nbsp;So, here are the rules:&lt;br /&gt;&lt;br /&gt;1. &amp;nbsp;All tables should have a primary key. &amp;nbsp;If a table doesn't have one unique key, derive one using a function like autonumber or autonumberhash256.&lt;br /&gt;&lt;br /&gt;2. &amp;nbsp;Break all the existing joins by renaming foreign keys (e.g. in the Orders table, rename CustomerID to O_CustomerID). &amp;nbsp;For a "pure" star schema, there should be no QlikView Associations remaining and all the tables should be standalone. &amp;nbsp;From a pragmatic point of view, it is fine to leave some hierarchical tables associated (e.g. Product to ProductCategory) to have a more "snowflake" schema.&lt;br /&gt;&lt;br /&gt;3. &amp;nbsp;Use a mixture of Concatenate and Join to generate the Key table using the Resident data. &amp;nbsp;You will load the previously renamed foreign key with the correct name so that they connect to the right dimension table (e.g. ... O_CustomerID As CustomerID).&lt;br /&gt;&lt;br /&gt;For an example, if I have a simple structure with Customer, Calendar, Order, OrderDetail and Product.&lt;br /&gt;&lt;br /&gt;Step 1 - Customer, Product, Calendar (DateKey), and Order already have a primary key. &amp;nbsp;In OrderDetail I will create an ID from OrderID and LineNo (we will do a bit of step 2 while we are at it):&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;AutoNumberHash256(OrderID, LineNo) As OrderDetailID,&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;OrderID as OD_OrderID, &amp;nbsp; // rename order foreign key&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;ProductID as OD_ProductID, // rename product foreign key&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 2 - Customer and Product are not an issue because they don't have a foreign key. &amp;nbsp;I already renamed my foreign keys in OrderDetail so I need to attend to Order:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;OrderID,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;CustomerID as O_CustomerID,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;DateKey as O_DateKey,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now all my links will be broken.&lt;br /&gt;&lt;br /&gt;Step 3 - Now I load my key table. &amp;nbsp;I will begin with data from the Order table:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Key:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Load&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; OrderID,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_CustomerID As CustomerID,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_DateKey as DateKey,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp; &amp;nbsp;Resident Order;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now Join in the Product and OrderDetail keys from the OrderDetail table.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Join (Key) Load&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; OD_OrderID As OrderID,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; OD_ProductID As ProductID,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; OrderDetailID,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Resident OrderDetail;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now I have a key table which will connect all my detail. &amp;nbsp;I can extend this by Joining or Concatenating additional tables. &amp;nbsp;For example, I could concatenate data from Purchases that also has Date and ProductID information.&lt;br /&gt;&lt;br /&gt;Any of the previously renamed foreign keys (e.g. O_CustomerID) can actually be dropped now - their information is encapsulated in the key table so that keeping them is just duplicating data. &amp;nbsp;I might choose to hang onto them for a while, just to test my relations, but best practice will be to remove them.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-915323876382523352?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/915323876382523352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/05/rules-for-creating-keylink-table-in.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/915323876382523352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/915323876382523352'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/05/rules-for-creating-keylink-table-in.html' title='Rules for creating a Key/Link Table in QlikView'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-824888947643902252</id><published>2011-05-12T16:50:00.000+01:00</published><updated>2011-05-16T02:57:41.691+01:00</updated><title type='text'>Part-to-Whole Time Series</title><content type='html'>I recently talked (&lt;a href="http://qliktips.blogspot.com/2011/04/defending-pie-charts.html"&gt;here&lt;/a&gt;) about using pie charts for Part-to-Whole comparisons. &amp;nbsp;As&amp;nbsp;Stephen Few explains in his excellent article,&amp;nbsp;&lt;a href="http://www.perceptualedge.com/articles/visual_business_intelligence/displays_for_combining_time-series_and_part-to-whole.pdf"&gt;Displays for combining time-series and part-to-whole&lt;/a&gt;, you can't really use pie charts like this in a time-series. &amp;nbsp;It just doesn't work.&lt;br /&gt;&lt;br /&gt;Stephen suggests the use of line charts (which are always a good idea for time-series) with one line showing the total and then the "normal" line chart showing how the total is broken down.&lt;br /&gt;&lt;br /&gt;So, how do I create this type of chart in QlikView?&lt;br /&gt;&lt;br /&gt;The easiest way is just to create 2 charts, one for the total line and one for the split values. &amp;nbsp;This works fine - unless you want to minimize the objects or want to put them in a container control. &amp;nbsp;Then you run into problems.&lt;br /&gt;&lt;br /&gt;There are a couple of solutions for this that I have been playing with. &amp;nbsp;The first one, which is more "dynamic" for the values in the dimension, does not always work out great. &amp;nbsp;Here it is:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9RZ9_C9CZLg/TcwC7UPfF2I/AAAAAAAAACM/ioE9jsyVqZU/s1600/TimeSeriesPartToWhole1.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://2.bp.blogspot.com/-9RZ9_C9CZLg/TcwC7UPfF2I/AAAAAAAAACM/ioE9jsyVqZU/s400/TimeSeriesPartToWhole1.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So, how did I do this?&lt;br /&gt;&lt;br /&gt;I have 3 dimensions in this chart. &amp;nbsp;The 2nd and 3rd dimensions are the Year and Category - just as they would be for the normal split out chart. &amp;nbsp;The first is using the ValueList function in QlikView. &amp;nbsp;ValueList creates a pseudo dimension containing, as its values, the list of values that you provide in the function.&lt;br /&gt;&lt;br /&gt;My calculated dimension expression is:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;=ValueList('Total', 'Categories')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, I have a dimension that contains 2 values. &amp;nbsp;I then turned on the Trellis function for this dimension which achieves 2 separate charts for Total and Categories.&lt;br /&gt;&lt;br /&gt;I then use ValueList again in the expression to test which of the values I am at so that I can use a different expression for each of them:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;if(ValueList('Total', 'Categories') = 'Total',&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Sum(TOTAL&amp;lt;Year&amp;gt; LineSalesAmount),&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Sum(LineSalesAmount))&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, if it is the Category then I just use the simple expression. &amp;nbsp;For the total I use Total&lt;year&gt; to get the same value for each category and hence achieving just one line in that chart (although there are actually 3!).&lt;/year&gt;&lt;br /&gt;&lt;br /&gt;All very clever but there is one flaw with this. &amp;nbsp;Because of the trellis, the axis are going to be the same height. &amp;nbsp;This means that in the bottom chart, the lines for each category are a bit squashed down in the lower half.&lt;br /&gt;&lt;br /&gt;So, another solution. &amp;nbsp;This one is a little more "static" on the values because I need to define an expression for each of the values in the dimension. &amp;nbsp;I am not sure that this is such a problem because, in the "real world", many of these dimensions are quite static anyway.&lt;br /&gt;&lt;br /&gt;So, I have a simple chart with Year and Category for dimensions. &amp;nbsp;I have an expression using a set for each of the 3 category values like this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Sum({&amp;lt;CategoryType={"Footwear"}&amp;gt;} LineSalesAmount)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and one expression for the total like this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Sum(TOTAL&amp;lt;Year&amp;gt; LineSalesAmount)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So I do something that has been in QlikView for years (so this will work in v8.5 where there is no Trellis). &amp;nbsp;In the "Axes" tab of the chart properties I set the option for the Total expression to appear on the Right Position and then turn on the "Split Axis" option - like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YCsKtaXZfzM/TcwGb9mNx6I/AAAAAAAAACQ/7XHIm353WzQ/s1600/TimeSeriesPartToWhole-Settings.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="348" src="http://2.bp.blogspot.com/-YCsKtaXZfzM/TcwGb9mNx6I/AAAAAAAAACQ/7XHIm353WzQ/s400/TimeSeriesPartToWhole-Settings.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This gives me a display pretty much exactly as I wanted:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XagyehRh6v0/TcwGuxgrk8I/AAAAAAAAACU/Yz535dmoevc/s1600/TimeSeriesPartToWhole2.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://3.bp.blogspot.com/-XagyehRh6v0/TcwGuxgrk8I/AAAAAAAAACU/Yz535dmoevc/s400/TimeSeriesPartToWhole2.jpeg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I might tweak the split percentage from the default of 67, but it may not be necessary.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-824888947643902252?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/824888947643902252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/05/part-to-whole-time-series.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/824888947643902252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/824888947643902252'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/05/part-to-whole-time-series.html' title='Part-to-Whole Time Series'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-9RZ9_C9CZLg/TcwC7UPfF2I/AAAAAAAAACM/ioE9jsyVqZU/s72-c/TimeSeriesPartToWhole1.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7768617590976502531</id><published>2011-05-11T17:13:00.000+01:00</published><updated>2011-05-11T17:13:29.971+01:00</updated><title type='text'>Alternative to Null</title><content type='html'>There are lots of Null values floating around in data and QlikView has some interesting ways to deal with it.&lt;br /&gt;&lt;br /&gt;For example, we can turn on the NullAsValue option for a field that we are going to load:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;NullAsValue A, B;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Any values that were previously Null (and do not display in a list box) will now display as blank strings.&lt;br /&gt;&lt;br /&gt;There is a small problem when I want to do any maths on a field that might have a Null value and that is that any number plus Null is Null. &amp;nbsp;A great way to deal with this is, if I expect there might be Null values in a field, to use the Alt() function.&lt;br /&gt;&lt;br /&gt;Alt accepts a list of values and will return the first of those values that has a valid number. &amp;nbsp;So, instead of:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Load A+B as AB, ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I can have:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier; font-weight: bold;"&gt;Load Alt(A,0)+Alt(B,0) As AB, ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, if either A or B have a Null value, it is treated as zero and my calculation can continue and give a good result.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7768617590976502531?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7768617590976502531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/05/alternative-to-null.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7768617590976502531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7768617590976502531'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/05/alternative-to-null.html' title='Alternative to Null'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1825576399473481718</id><published>2011-04-21T16:18:00.000+01:00</published><updated>2011-04-21T16:18:05.047+01:00</updated><title type='text'>Better BI Dashboards</title><content type='html'>In CapricornVentis, we've been delivering great business discovery solutions in QlikView for several years now. &amp;nbsp;QlikView really helps you build great user interfaces that help people interrogate their data in new ways that they have never thought of before.&lt;br /&gt;&lt;br /&gt;Before QlikView, much of my "Dashboard" design work would have been in SalesLogix CRM where we plugged various chart controls into the CRM data to display information such as Sales Pipeline, Performance, etc. &amp;nbsp;Similar things can be achieved with Oracle CRM On Demand Analytics.&lt;br /&gt;&lt;br /&gt;No matter what system you use - BI, CRM, Database, you probably have access to some wonderful tools that allow you to present data to users in lots of different ways.&lt;br /&gt;&lt;br /&gt;"What do you want to see on your dashboard", says the chart designer. &amp;nbsp;"Everything", says the customer. &amp;nbsp;"OK", says the designer.&lt;br /&gt;&lt;br /&gt;Stop! &amp;nbsp;"Everything" is the wrong answer when it comes to dashboard design.&lt;br /&gt;&lt;br /&gt;Think of your car dashboard. &amp;nbsp;It doesn't tell you everything that is happening in your car. &amp;nbsp;It does tell you everything that you need to know, right now, to drive your car.&lt;br /&gt;&lt;br /&gt;Think about it. &amp;nbsp;Many car dashboards don't include a clock. &amp;nbsp;A clock is a "nice to have" on a dashboard - it isn't critical to the running of the vehicle.&lt;br /&gt;&lt;br /&gt;A "pure" car dashboard probably needs to have only 3 things - a speedometer, a fuel guage and an oil temperature guage. &amp;nbsp;Someone might argue that a tachometer is useful because it lets me know if I am over-revving the engine and also lets me know when is the best time to change gear. &amp;nbsp;We could have the argument but lets just add it in. &amp;nbsp;So, 4 things. &amp;nbsp;Everything else is "nice to have" and you don't need it.&lt;br /&gt;&lt;br /&gt;There are other things that I need to know about to run my car. &amp;nbsp;I need to know that my oil levels are good. &amp;nbsp;I need to know that my brake fluid is in between min and max. &amp;nbsp;These are things that I should check every week or so - but I don't need to know about them right now as I drive this car.&lt;br /&gt;&lt;br /&gt;It is the same with the business dashboard.&lt;br /&gt;&lt;br /&gt;What do you need to know, right now, to run your business?&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1825576399473481718?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1825576399473481718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/better-bi-dashboards.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1825576399473481718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1825576399473481718'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/better-bi-dashboards.html' title='Better BI Dashboards'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4221129096631561420</id><published>2011-04-20T20:15:00.000+01:00</published><updated>2011-04-20T20:15:26.357+01:00</updated><title type='text'>Improve load performance by writing better script!</title><content type='html'>I came across a document recently where a date was being loaded from a text field in YYYYMMDD format. &amp;nbsp;The developer had used left, right and mid functions along with MakeDate to parse the date. &lt;br /&gt;&lt;br /&gt;This is something that I might have done myself several years ago - before I knew better. &amp;nbsp;I wondered to myself if there would be much of a load speed differential between this method and Date# - which is the method that I would use today. &amp;nbsp;So I did some testing.&lt;br /&gt;&lt;br /&gt;This particular machine was running v9 so it could have used some load speed tweaking. &amp;nbsp;I took a data set of 3 million records and compared both using the two methods. &amp;nbsp;The left, right, mid method took about 2 minutes (not a fast machine). &amp;nbsp;The Date# method was under 1:30 - 3/4 the time for the other method.&lt;br /&gt;&lt;br /&gt;I wonder if you went back and reviewed some of your old code, if you might speed it up a little by just doing things better, just because you now know better.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4221129096631561420?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4221129096631561420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/improve-load-performance-by-writing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4221129096631561420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4221129096631561420'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/improve-load-performance-by-writing.html' title='Improve load performance by writing better script!'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5839477319357832262</id><published>2011-04-18T14:27:00.000+01:00</published><updated>2011-04-18T14:27:47.761+01:00</updated><title type='text'>Blocking user access to a field using OMIT</title><content type='html'>This is something that comes up every so often. &amp;nbsp;A question like, "we have&amp;nbsp;sensitive&amp;nbsp;data (such as salary!) in our system that we only want some users to see". &lt;br /&gt;&lt;br /&gt;This is all very straightforward on SBS where collaboration is not available. &amp;nbsp;Simply lock down the tab which has the sensitive data displayed using, for example, a condition based on the OSUser() function.&lt;br /&gt;&lt;br /&gt;On an Enterprise server, where users can create their own objects, you don't want them to even see that the field is there.&lt;br /&gt;&lt;br /&gt;We can achieve this using the OMIT field in Section Access. &amp;nbsp;At a simple level, if you only have one field to hide, you can have the OMIT in the main Section Access table. &amp;nbsp;If you want to perhaps OMIT several fields, then the creation of a group of fields is the thing to do and then just link the user to the group ID.&lt;br /&gt;&lt;br /&gt;In the example below, when user1 logs in they will not see Field1 or Field2. &amp;nbsp;When user2 logs in, they will not see Field2 or Field3.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Section Access;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;LOAD * INLINE [&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ACCESS, USERID, OMITGROUP&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ADMIN, admin,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;USER, user1, group1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;USER, user2, group2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;];&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;LOAD * INLINE [&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;OMITGROUP, OMIT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;group1, Field1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;group1, Field2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;group2, Field2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;group2, Field3&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;];&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Section Application;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;Fields:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;LOAD * INLINE [&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Field1, Field2, Field3, Field4, Field5&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Value1, Value2, Value3, Value4, Value5&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier;"&gt;&lt;b&gt;];&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5839477319357832262?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5839477319357832262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/blocking-user-access-to-field-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5839477319357832262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5839477319357832262'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/blocking-user-access-to-field-using.html' title='Blocking user access to a field using OMIT'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7243795764536709874</id><published>2011-04-15T21:13:00.000+01:00</published><updated>2011-04-15T21:13:15.903+01:00</updated><title type='text'>Defending Pie Charts!</title><content type='html'>Anyone who knows me (in the BI world) knows that I have a certain lack of respect for the humble Pie chart. &amp;nbsp;I am supportive of Stephen Few's idea that we should, in general, &lt;a href="http://www.perceptualedge.com/articles/08-21-07.pdf"&gt;Save the Pies for Desert&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-O9qhMqDFJr8/Taif14uG8oI/AAAAAAAAACI/wr0ae2N172A/s1600/PoorPie.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/-O9qhMqDFJr8/Taif14uG8oI/AAAAAAAAACI/wr0ae2N172A/s320/PoorPie.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A Pie chart, as it&amp;nbsp;ubiquitously appears in many presentations, used to compare one value against several others, is a very poor choice for the task. &amp;nbsp;A simple bar chart is by far the better choice for the job.&lt;br /&gt;&lt;br /&gt;I have been quite happy, up till now, to reject any use of a pie chart for any purpose. &amp;nbsp;That was until I came across Robert Kosara's blog entry, &lt;a href="http://eagereyes.org/criticism/in-defense-of-pie-charts"&gt;In Defence of Pie Charts&lt;/a&gt;. &amp;nbsp;Robert discusses&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: calluna-1, calluna-2, serif; font-size: 16px; line-height: 20px;"&gt;Spence and Lewandowsky's study which shows that pie charts were interpreted more accurately than bar charts in some circumstances.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: calluna-1, calluna-2, serif; font-size: 16px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: calluna-1, calluna-2, serif; font-size: 16px; line-height: 20px;"&gt;So, perhaps there is a good use for the Pie chart after all - not in comparison of multiple values, but in simple part-to-whole comparison.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: calluna-1, calluna-2, serif; font-size: 16px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: calluna-1, calluna-2, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;Take, for example, the following Pie chart where we are comparing the performance of Germany versus all other countries.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-N2pEv2uhN4U/Taif1X3FVDI/AAAAAAAAACE/PeA5qXHLFPw/s1600/PiePartToWhole.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://1.bp.blogspot.com/-N2pEv2uhN4U/Taif1X3FVDI/AAAAAAAAACE/PeA5qXHLFPw/s320/PiePartToWhole.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now, this chart doesn't give me any numbers but what it does give me is an intuitive feel for how much of the market Germany has.&lt;br /&gt;&lt;br /&gt;Now, compare that to an equivalent bar chart.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SRTH9TWG_rk/Taif1DotcnI/AAAAAAAAACA/WJPjgpv2nDc/s1600/BarPartToWhole.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://3.bp.blogspot.com/-SRTH9TWG_rk/Taif1DotcnI/AAAAAAAAACA/WJPjgpv2nDc/s320/BarPartToWhole.jpeg" style="cursor: move;" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Here we have a perfectly formed bar chart where we can get a good grasp of the numbers that are involved. &amp;nbsp;However, if I want to get an idea of what percentage the German total is versus the whole, I have to do a little more work to get the answer - I can't intuit it.&lt;br /&gt;&lt;br /&gt;So, for this specific purpose, a Pie chart might be a better choice than the bar.&lt;br /&gt;&lt;br /&gt;These charts are easily achieved in QlikView using implicit set analysis (available since version 9).&lt;br /&gt;&lt;br /&gt;The chart has no dimension but has 2 expressions. &amp;nbsp;In my case, the expressions are:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&amp;nbsp;&amp;nbsp; Sum({&lt;country=p({$})&gt;} LineSalesAmount) &lt;/country=p({$})&gt;&lt;/div&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;and&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Courier; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; Sum({&lt;country=e({$})&gt;} LineSalesAmount)&lt;/country=e({$})&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;When I select one or more countries, the first expression will give me the total for the selected countries. &amp;nbsp;The second expression gives me the reverse, the total for all the other values.&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The labels for these can be achieved using Concat. &amp;nbsp;For the selected countries:&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Courier; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; ='Selected: ' &amp;amp; Concat(DISTINCT Country, ', ')&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;For the other countries:&lt;/div&gt;&lt;div style="font-family: Courier; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Courier; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; ='Others: ' &amp;amp; Concat({&lt;country=e({$})&gt;} DISTINCT Country, ', ')&lt;/country=e({$})&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Courier; font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7243795764536709874?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7243795764536709874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/defending-pie-charts.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7243795764536709874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7243795764536709874'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/defending-pie-charts.html' title='Defending Pie Charts!'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-O9qhMqDFJr8/Taif14uG8oI/AAAAAAAAACI/wr0ae2N172A/s72-c/PoorPie.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1566425692466202217</id><published>2011-04-14T16:48:00.000+01:00</published><updated>2011-04-14T16:48:53.078+01:00</updated><title type='text'>Data for Humans</title><content type='html'>I am a great fan of Stephen Few. &amp;nbsp;Any of his books are worth reading for anyone who works in the data visualization space.&lt;br /&gt;&lt;br /&gt;If you can't get a copy of one of his books right now, then 5 minutes reading his article, "&lt;a href="http://www.interaction-design.org/encyclopedia/data_visualization_for_human_perception.html"&gt;Data Visualization for Human Perception&lt;/a&gt;", is a great introduction. &amp;nbsp;The commentaries by Ronald Rensink, Naomi Robbins and Robert Kosara are equally worth reading.&lt;br /&gt;&lt;br /&gt;My belief is that the study of human perception to create great data visualization is fantastically interesting. &amp;nbsp;There is some fascinating research going on in the area of pre-attentive processing.&lt;br /&gt;&lt;br /&gt;As computers get more powerful and the&amp;nbsp;cognitive&amp;nbsp;psychologists keep going with their ground-breaking research, we really are entering a golden age. &amp;nbsp;I look forward to being a part of it.&lt;br /&gt;&lt;br /&gt;Even so, I have a feeling that we will still be using the humble bar chart for many years to come. &amp;nbsp;It is such an intuitive and simple visual data display method. &amp;nbsp;I wonder if the real breakthroughs will, in fact, be in enabling people to work more collaboratively with their data to discover new insights.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1566425692466202217?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1566425692466202217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/data-for-humans.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1566425692466202217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1566425692466202217'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/data-for-humans.html' title='Data for Humans'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5492814721967089946</id><published>2011-04-14T12:54:00.001+01:00</published><updated>2011-04-14T12:58:03.973+01:00</updated><title type='text'>Best practice on iPad user interface design</title><content type='html'>Thanks to Colin Hancox, who pointed me to this article on the QlikView Blog by Chris Mabardy, Director of Product Marketing at QlikView.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://community.qlikview.com/blogs/theqlikviewblog/archive/2011/04/13/best-practices-for-qlikview-ipad-user-interface-design.aspx"&gt;http://community.qlikview.com/blogs/theqlikviewblog/archive/2011/04/13/best-practices-for-qlikview-ipad-user-interface-design.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new mobile platform coming out in QV10 SR2 is new to all of us so it is great to have good guidance on building apps.&lt;br /&gt;&lt;br /&gt;In general, all your old applications will work on the mobile platform. &amp;nbsp;The main considerations for iPad are screen real-estate (1024x768) and gestures instead of mouse. &amp;nbsp;If you expect that users will want access to right-mouse features, you need to turn on the new "Menu" icon in the caption.&lt;br /&gt;&lt;br /&gt;After that, you just follow good design principals for screen layout. &amp;nbsp;If you haven't already come across it, I recommend Stephen Few's &lt;a href="http://perceptualedge.com/"&gt;perceptualedge.com&lt;/a&gt; and any of Stephen's books.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5492814721967089946?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5492814721967089946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/best-practice-on-ipad-user-interface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5492814721967089946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5492814721967089946'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/best-practice-on-ipad-user-interface.html' title='Best practice on iPad user interface design'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-466811734651677542</id><published>2011-04-14T10:36:00.000+01:00</published><updated>2011-04-14T10:36:01.474+01:00</updated><title type='text'>Your call...Qlikview Server and AccessPoint</title><content type='html'>&lt;dt class="comment-author " id="c2866458635380877393" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.blogblog.com/rounders3/icon_comment_left.gif); background-origin: initial; background-position: 2px 0.3em; background-repeat: no-repeat no-repeat; color: #333333; font-family: Verdana, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 20px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://www.blogger.com/profile/04962790006317225340" rel="nofollow" style="color: #445566;"&gt;kaushik&lt;/a&gt;&amp;nbsp;said...&lt;/dt&gt;&lt;br /&gt;&lt;dd class="comment-body" id="Blog1_cmt-2866458635380877393" style="color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 18px; margin-bottom: 1.25em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 20px; padding-right: 0px; padding-top: 0px;"&gt;&lt;div style="margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I would like to learn more about Qlikview Server and AccessPoint.&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;A brief guide to QlikView Server (QVS). &amp;nbsp;It is worth noting that the QVS Reference Manual is really good now and explains the specifics of this subject really well.&lt;br /&gt;&lt;br /&gt;So, QlikView Server is a version of QlikView that runs on a server! &amp;nbsp;Simple, eh? &amp;nbsp;QVS will load documents into memory on the server. &amp;nbsp;When a client connects, QVS will send enough information to that clients so that they can display the information on their screens. &amp;nbsp;When the client makes a selection, QVS uses the memory and CPU power of the server to process that selection and then sends the screen updates to the client. &amp;nbsp;This means that the client doesn't require to have enough memory and CPU to handle large volumes of data and complex calculations - hence why simple clients such as iPhone and iPad work so well. &amp;nbsp;The client just needs enough CPU and memory to render the screens.&lt;br /&gt;&lt;br /&gt;QVS only loads each document once. &amp;nbsp;As each client connects, QVS will apportion them a separate area of memory to handle their data requirements (mostly cache of charts). &amp;nbsp;A "rule of thumb" is that each client will require and additional 10% of the document's memory requirement. &amp;nbsp;So if the document loads into 1GB of memory on the server, each client will require approx. 100Mb of additional memory. &amp;nbsp;As each version of QlikView has been released, their memory handling technology has got better and better and v10 will handle many more clients in the same memory than, say, v8.5.&lt;br /&gt;&lt;br /&gt;There are now just 3 main client types (previous versions supported a Java client also). &amp;nbsp;First, QlikView Desktop can be used as a client to access documents from a server. &amp;nbsp;When used as a client, you would notice that buttons such as "Save" and "Reload" are disabled because they make no sense for a client - the server will handle all of that.&lt;br /&gt;&lt;br /&gt;The second client is the QlikView plugin for IE. &amp;nbsp;This is an ActiveX plugin that sits inside Internet Explorer. &amp;nbsp;It shares the same code base as QlikView Desktop so the experience is very similar. &amp;nbsp;It is still a "thick" client so does require installation - although it comes with an MSI for automated installation.&lt;br /&gt;&lt;br /&gt;The third, an easiest to deploy, is the AJAX client. &amp;nbsp;This doesn't require any installation because it works within a browser such as IE, Firefox, Chrome, etc. &amp;nbsp;As of QlikView 10 SR2, it is also supported in mobile devices such as Safari for iPad using HTML5.&lt;br /&gt;&lt;br /&gt;The majority of Plugin or AJAX end users will access their documents via AccessPoint. &amp;nbsp;AccessPoint, by default, takes a user's Windows Authentication information and will be able to present to them all of the documents that they have access to. &amp;nbsp;This means users won't be confused by seeing documents that they won't be able to open. &amp;nbsp;Users can also set "favorites" in AccessPoint so that they can default to seeing their most used documents.&lt;br /&gt;&lt;br /&gt;Windows security is the default for QlikView server but not the only method available. &amp;nbsp;By turning on QlikView's DMS authentication (not available in Small Business Server), the task of authenticating the users can be given to any other type of directory service or even a completely custom form.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-466811734651677542?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/466811734651677542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/your-callqlikview-server-and.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/466811734651677542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/466811734651677542'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/your-callqlikview-server-and.html' title='Your call...Qlikview Server and AccessPoint'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-745402272743297587</id><published>2011-04-12T16:14:00.000+01:00</published><updated>2011-04-12T16:14:54.200+01:00</updated><title type='text'>Your call...</title><content type='html'>I am training in some QlikView newbies right now and it makes me really aware about the huge number of things that you can learn in QlikView.&lt;br /&gt;&lt;br /&gt;Please feel free to comment below and tell me what feature of QlikView you are interested in learning more about and I can use your comments as the basis for future posts.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-745402272743297587?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/745402272743297587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/your-call.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/745402272743297587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/745402272743297587'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/your-call.html' title='Your call...'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8068462703945264936</id><published>2011-04-06T11:08:00.003+01:00</published><updated>2011-04-12T16:10:38.153+01:00</updated><title type='text'>Load testing QlikView with JMeter</title><content type='html'>Another really interesting session that I attended at Qonnections was on scalability.  Here, we looked at using the JMeter tool (an open source product from Apache: http://jakarta.apache.org/jmeter/) to first record a set of interactions and then play them back multiple times with multiple sessions.&lt;br /&gt;&lt;br /&gt;This is a really powerful tool.  Not just for QlikView but for anyone developing web products.&lt;br /&gt;&lt;br /&gt;I can't record all the steps here, but there is a tutorial document and some sample files available from the Community page @ http://community.qlikview.com/groups/qlikview-scalability/forum/default.aspx&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Stephen Redmond is CTO of &lt;a href="http://www.capventis.com/"&gt;CapricornVentis&lt;/a&gt; a  &lt;a href="http://www.qlikview.com/us/explore/experience/free-download?id=/&amp;amp;sourcepartner=CapricornVentis"&gt;QlikView&lt;/a&gt; Elite Partner&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8068462703945264936?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8068462703945264936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/load-testing-qlikview-with-jmeter.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8068462703945264936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8068462703945264936'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/load-testing-qlikview-with-jmeter.html' title='Load testing QlikView with JMeter'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8887579514121959339</id><published>2011-04-06T10:51:00.004+01:00</published><updated>2011-04-06T11:23:03.743+01:00</updated><title type='text'>QlikView Mobile</title><content type='html'>I attended a great session at Qonnections yesterday where the new mobile app for ipad was presented.&lt;br /&gt;&lt;br /&gt;Up till now, QlikView have had a specific mobile application for iPhone which they then enhanced to a "HD" version for iPad.  This client was very different from the traditional QlikView.  They also had a Java mobile client that worked on devices like BlackBerry.  There was also, at one stage, an Android client - lots of clients to have had to support.&lt;br /&gt;&lt;br /&gt;Essentially what has been done with new client is that the existing AJAX client has been enhanced to support gestures on mobile devices.  The AJAX client has worked on these devices before but many things didn't work as expected and it was a less than satisfactory experience.  With the new gesture support, using your finger instead of a mouse is just simple.&lt;br /&gt;&lt;br /&gt;From QlikView's point of view, this move makes a lot of sense.  Not having to create an support multiple clients means that they can focus effort on making their core clients even better.  From an implementation point of view, there is nothing extra left to do - it works off Access Point same as other clients.  All of the security, etc., works with it.  It is worth sizing screens to the expected end user tablet size - but that is just best practice anyway.&lt;br /&gt;&lt;br /&gt;This is already available for people to have a look at - point your tablet device to demo.qlikview.com.  Any of the existing demos will work.  Nothing special has been done to them.  There are a couple of "iPad optimized demos" which you should find a link to off the main window.&lt;br /&gt;&lt;br /&gt;For customers, this will be available in SR2 for QlikView 10 - which is due out in the next week or so.&lt;br /&gt;&lt;br /&gt;There is a video available showing some of the new features here: &lt;a href="http://www.qlikview.com/us/landing/ipad2"&gt;http://www.qlikview.com/us/landing/ipad2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8887579514121959339?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8887579514121959339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/qlikview-mobile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8887579514121959339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8887579514121959339'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/qlikview-mobile.html' title='QlikView Mobile'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-6182633449640255773</id><published>2011-04-05T15:36:00.002+01:00</published><updated>2011-04-05T15:42:38.521+01:00</updated><title type='text'>No printing in Ajax</title><content type='html'>I have come across this a number of times, most recently on a post on Community.QlikView.com, so I thought it was worth sharing.&lt;br /&gt;&lt;br /&gt;If you have any type of printing enabled in QlikView, the QlikView Desktop and Plugin will render the printing and submit to the relevant printer.  This also gives facility for Print Preview.  This facility is not available in Ajax - a limitation of the thin client.&lt;br /&gt;&lt;br /&gt;To have printing in Ajax, any print jobs need to be rendered on the server into PDF and then presented to the user as a download.&lt;br /&gt;&lt;br /&gt;The problem occurs if the IT department has "hardened" your QlikView Server.  One of the common steps in hardening is to disable the Print Spooler Service.  This is often built into a Group Policy rule also.&lt;br /&gt;&lt;br /&gt;The problem for QlikView is that during installation of QlikView Server, the installer attempts to install the PDF XChange drivers.  This step will fail if the Print Spooler service is not running.&lt;br /&gt;&lt;br /&gt;Once you have sorted out the Print Spooler Service, you don't need to re-install QlikView Server.  There is a PDF driver available as a separate download in the QlikView downloads area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-6182633449640255773?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/6182633449640255773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/no-printing-in-ajax.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6182633449640255773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6182633449640255773'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/no-printing-in-ajax.html' title='No printing in Ajax'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7982910716754752565</id><published>2011-04-04T12:15:00.003+01:00</published><updated>2011-04-04T12:26:18.230+01:00</updated><title type='text'>Beginners Guide to QlikView Extension Objects : Part 4 - Headers</title><content type='html'>Here at Qonnections, I am meeting some interesting folks and having some good chats.  Meeting people that read your blog is interesting in itself!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I met Andrew last night and he had been playing around with Extension Objects using my previous 3 steps as a starter.  He pointed out one glaring omission - how do you add headers!  Doh!  I had done it before but just failed to add it to the table example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Headers are actually pretty easy (like a lot of this stuff).  We have already seen the this.Data.rows property.  Well the Data class also exposes a HeaderRows property.  This has a length value but I can't really see where there would be more than one row.  Anyway, we just need to extract the text values from the property just as we have done before:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: courier"&gt;&lt;div&gt;&lt;b&gt;// Add the Header row&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;var headerRow = this.Data.HeaderRows[0];&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;html += "&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;" + headerRow[0].text + "&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;" + headerRow[1].text + "&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;";&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simple!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7982910716754752565?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7982910716754752565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/04/beginners-guide-to-qlikview-extension.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7982910716754752565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7982910716754752565'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/04/beginners-guide-to-qlikview-extension.html' title='Beginners Guide to QlikView Extension Objects : Part 4 - Headers'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8137913845588689936</id><published>2011-03-29T17:13:00.002+01:00</published><updated>2011-03-29T17:24:25.177+01:00</updated><title type='text'>Parameters in Dollar Expansion</title><content type='html'>I had come across this subject in the documentation before but never had a use for it - until today.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was faced with several fields that each had a code and description embedded in them that needed to be parsed out.  Generally, I would just use SubField() for this but unfortunately the separator was a period (.) so I couldn't be sure to get the full text out using SubField because the text could contain periods (a period is not a good choice as a separator!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I decided that the easiest thing to do would be to use the Left() and Mid() functions in conjunction with the Index() function.  This started looking like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Load&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Field1,&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Left(Field1, Index(Field1, '.')-1) As Field1.Code,&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Mid(Field1, Index(Field1, '.')+1) As Field1.Desc,&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;...&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There were 5 fields involved and I wondered if there were a different way that I could go about it.  I re-checked the help file on Dollar Sign Expansion and came up with this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;SET mLefty=Left($1, index($1, '.')-1);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;SET mRighty=Mid($1, index($1, '.')+1);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;&lt;span class="Apple-style-span" &gt;$1&lt;/span&gt;&lt;/b&gt; in this variable is a parameter.  So I can pass a parameter to a variable!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I can use these "functions" in my code:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Load&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;Field1, &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$(mLefty(Field1)) as Field1.Code, &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$(mRighty(Field1)) as Field1.Desc,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt;Field2, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mLefty(Field2)) as Field2.Code, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mRighty(Field2)) as Field2.Desc,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt;Field3, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mLefty(Field3)) as Field3.Code, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mRighty(Field3)) as Field3.Desc,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt;Field4, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mLefty(Field4)) as Field4.Code, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mRighty(Field4)) as Field4.Desc,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt;Field5, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mLefty(Field5)) as Field5.Code, &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;$(mRighty(Field5)) as Field5.Desc,&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;...&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now this is not something that is incredibly advanced - but I can imagine a lot of possibilities.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8137913845588689936?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8137913845588689936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/03/parameters-in-dollar-expansion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8137913845588689936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8137913845588689936'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/03/parameters-in-dollar-expansion.html' title='Parameters in Dollar Expansion'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2292278719995776943</id><published>2011-01-09T23:23:00.001Z</published><updated>2011-01-09T23:23:43.130Z</updated><title type='text'>Beginners Guide to QlikView Extension Objects : Part 3</title><content type='html'>&lt;p&gt;So, we have created custom extensions that display data from QlikView.&amp;#160; However, we need to make that object respond to clicks and make selections back in the QlikView document.&lt;/p&gt;  &lt;p&gt;This is achieved using the SelectRow function of the Data object.&amp;#160; When we write out our data, we need to make sure that we keep track of what row that data came from so that we can execute an “onclick” function to call SelectRow with that row number.&amp;#160; QlikView will then make that selection and refresh the data.&lt;/p&gt;  &lt;p&gt;Here is the adjusted code to handle this:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Qva.AddExtension('CVL/BasicTable', function() { &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Create a variable to hold generated html     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var html = &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Local variable to hold the reference to QlikView      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var _this = this; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // function to handle users clicking on a row     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; window.oncvlrowclick = function(rowIx)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _this.Data.SelectRow(rowIx);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Cycle Through the data     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i = 0; i &amp;lt; this.Data.Rows.length; i++) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // get the row      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var row = this.Data.Rows [i]; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Generate html     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; html += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td onclick='oncvlrowclick(&amp;quot;+i+&amp;quot;)'&amp;gt;&amp;quot; + row[0].text + &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td onclick='oncvlrowclick(&amp;quot;+i+&amp;quot;)'&amp;gt;&amp;quot; + row[1].text + &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Finalise the html     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; html += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Set the HTML     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Element.innerHTML = html; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;},true);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;OK, that is it.&amp;#160; Time for you to take over and start creating your own objects.&amp;#160; You now have the tools to create an object, populate it with QlikView data, and make it respond to clicks.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2292278719995776943?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2292278719995776943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/01/beginners-guide-to-qlikview-extension_4612.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2292278719995776943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2292278719995776943'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/01/beginners-guide-to-qlikview-extension_4612.html' title='Beginners Guide to QlikView Extension Objects : Part 3'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3913571474468595075</id><published>2011-01-09T23:10:00.001Z</published><updated>2011-01-09T23:10:57.362Z</updated><title type='text'>Beginners Guide to QlikView Extension Objects : Part 2</title><content type='html'>&lt;p&gt;In the last part, I showed how to create a really basic extension object.&amp;#160; Now, I will build on that to use data from my QlikView application.&lt;/p&gt;  &lt;p&gt;I am going to add a sub-folder to my CVL folder called “BasicTable” (so, CVL\BasicTable will be the sub-folder).&lt;/p&gt;  &lt;p&gt;I need a definition.xml, icon.png and script.js.&amp;#160; The quickest way to build these is to copy them from the previous project and then modify.&lt;/p&gt;  &lt;p&gt;The initial contents of my definition will be:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;     &lt;br /&gt;&amp;lt;ExtensionObject&amp;#160; Label=&amp;quot;CVL Basic Table&amp;quot; /&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now, we can concentrate on the JavaScript to generate the output.&lt;/p&gt;  &lt;p&gt;The QlikView object holder (which we can access via “this” in our JavaScript) defines an object called “Data” which will define the data passed by the object from the QlikView document.&amp;#160; The data passed will depend on the Dimensions and Expressions defined in the properties of the object.&lt;/p&gt;  &lt;p&gt;The Data object has a Rows property.&amp;#160; Each Row in Rows is an array of values.&amp;#160; The index corresponds to the number of Dimensions and Expressions.&amp;#160; In a simple example, with one Dimension and one Expression, there will be 2 values in the array – 0 and 1.&amp;#160; In multi-dimensional or multi-expression objects, the Dimensions will be the first values in the array, followed by the Expressions.&lt;/p&gt;  &lt;p&gt;Lets define some code to cycle through the data and present it in a simple html table.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Qva.AddExtension('CVL/BasicTable', function() { &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Create a variable to hold generated html     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var html = &amp;quot;&amp;lt;table&amp;gt;&amp;quot;; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Cycle Through the data     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i = 0; i &amp;lt; this.Data.Rows.length; i++) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // get the row      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var row = this.Data.Rows [i]; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Generate html     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; html += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; + row[0].text + &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; + row[1].text + &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Finalise the html     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; html += &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Set the HTML     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Element.innerHTML = html; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;},true);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now, if you add this object to a document, you won’t see anything.&amp;#160; This is because we need to specify the Dimension and Expression first before any data will become available.&lt;/p&gt;  &lt;p&gt;It is possible to define a default, of sorts, for Dimension and Expression.&amp;#160; You could define an actual name or expression but, not every document might have that name and this could cause problems.&amp;#160; If we set a blank default for Dimension and Expression, then QlikView will pick the first dimension and the sum of the first number value in the document as defaults.&amp;#160; This gives something to show when the object adds (which might cause other problems!).&amp;#160; To do this, we modify the definition.xml file.&amp;#160; I am also going to define a default caption here:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;     &lt;br /&gt;&amp;lt;ExtensionObject Label=&amp;quot;CVL Basic Table&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Dimension Initial=&amp;quot;&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Measurement Initial=&amp;quot;&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Initiate Name=&amp;quot;Caption.Text&amp;quot; value=&amp;quot;CVL Basic Table&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;lt;/ExtensionObject&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;By the way, if you do make changes to the definition.xml or script.js files, it is not necessary to close and reopen QlikView to see those changes.&amp;#160; Simply press F5 and QlikView will refresh.&amp;#160; This is very useful in debugging.&lt;/p&gt;  &lt;p&gt;Speaking of debugging, I’m afraid that the best way I have found to debug these JavaScript files is to add alert statements.&lt;/p&gt;  &lt;p&gt;In the next part, I will show how to add code to handle when a user clicks in your custom object that will make a selection in your QlikView document.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3913571474468595075?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3913571474468595075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/01/beginners-guide-to-qlikview-extension_09.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3913571474468595075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3913571474468595075'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/01/beginners-guide-to-qlikview-extension_09.html' title='Beginners Guide to QlikView Extension Objects : Part 2'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-800745818616135632</id><published>2011-01-09T22:21:00.001Z</published><updated>2011-01-09T22:21:42.377Z</updated><title type='text'>Beginners Guide to QlikView Extension Objects : Part 1</title><content type='html'>&lt;p&gt;I thought that I might write a quick guide to creating an extension objects for QlikView 10.&lt;/p&gt;  &lt;p&gt;What is an extension object?&amp;#160; Well, it allows us to create a chart using html and javascript or consume a 3rd party flash/silverlight object.&amp;#160; Our chart can use data from QlikView and it can pass click events back to QlikView.&amp;#160; Basically, we can create any chart that we want that doesn’t exist already.&lt;/p&gt;  &lt;p&gt;You might think that there would be a whole lot of work to do to create this, but it is actually really simple to get a chart up and running and consuming QlikView data.&lt;/p&gt;  &lt;p&gt;Extension objects live in the C:\Users\your.username\AppData\Local\QlikTech\QlikView\Extensions\Objects folder for desktop users.&amp;#160; Each extension must have a folder for itself.&amp;#160; However, you can have multiple sub-folder levels if you want.&lt;/p&gt;  &lt;p&gt;The first thing that I will do in the Objects folder is create a sub-folder for my company’s extensions.&amp;#160; My company is &lt;a href="http://www.capventis.com/"&gt;Capricorn Ventis Ltd.&lt;/a&gt; so I will create a folder called CVL.&amp;#160; In this folder, I will create a sub-folder for each extension.&amp;#160; First one that I am going to create is HelloWorld (doesn’t every example have to start with a Hello World!).&amp;#160; Now, under the Objects folder, I have CVL\HelloWorld.&lt;/p&gt;  &lt;p&gt;Every extension has a minimum of 1 file associated with it - Definition.xml.&amp;#160; This file will define the element, ExtensionObject (which can have other sub elements to, for example, set some default values):&lt;/p&gt;  &lt;p style="font-family: courier"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;    &lt;br /&gt;&amp;lt;ExtensionObject /&amp;gt;&lt;/p&gt;  &lt;p&gt;That’s it – simple.&amp;#160; We will have a look at some additional options for this file in the next part.&lt;/p&gt;  &lt;p&gt;With this one file in the HelloWorld folder, I can now see in QlikView (in Web View mode) when I right-click and select New Sheet Object, Extension Objects, I will see my new CVL/HelloWorld object (with no icon) which I can drag onto the sheet and it will create an object.&amp;#160; It won’t be a very awe inspiring object (a blank box) but you can set properties (such as caption) just as you would for other charts.&lt;/p&gt;  &lt;p&gt;We need to add a couple of things to make this just a little more advanced.&amp;#160; First, if we want to have an icon (and you really should), we need to add a 24x24 PNG file called icon.PNG to the folder – any design that you want.&amp;#160; Next, I am going to make a small modification to the Definition.xml file:&lt;/p&gt;  &lt;p style="font-family: courier"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;    &lt;br /&gt;&amp;lt;ExtensionObject&amp;#160; Label=&amp;quot;CVL Hello World&amp;quot; /&amp;gt;&lt;/p&gt;  &lt;p&gt;This label will be what is displayed in the New Sheet Object dialog – next to the icon defined by the PNG file.&lt;/p&gt;  &lt;p&gt;Now that those aesthetics are sorted out, we can make the object actually do something.&amp;#160; We need to add a JavaScript file that will define the code that will be run by this object.&amp;#160; The file is always called script.js.&amp;#160; This js file must define a call to Qva.AddExtension which defines a name and function that will be called when the extension loads:&lt;/p&gt;  &lt;p style="font-family: courier"&gt;Qva.AddExtension('CVL/HelloWorld', function() {    &lt;br /&gt;&amp;#160;&amp;#160; // Set the HTML     &lt;br /&gt;&amp;#160;&amp;#160; this.Element.innerHTML = &amp;quot;&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&amp;quot;;     &lt;br /&gt;},true);&lt;/p&gt;  &lt;p&gt;Note that the name defined in AddExtension is the same as the path to the folder as it would be from the Objects folder.&amp;#160; This is required.&lt;/p&gt;  &lt;p&gt;This code is very simple – it just outputs some simple html – but it reveals how we can do some much more advanced stuff.&amp;#160; If we can generate html, we can output it to our application and do so much!&amp;#160; All we need now is some data.&lt;/p&gt;  &lt;p&gt;In the next part, I will show you how to consume QlikView data.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-800745818616135632?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/800745818616135632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/01/beginners-guide-to-qlikview-extension.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/800745818616135632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/800745818616135632'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/01/beginners-guide-to-qlikview-extension.html' title='Beginners Guide to QlikView Extension Objects : Part 1'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3469732523468853955</id><published>2011-01-07T16:03:00.002Z</published><updated>2011-01-07T16:06:58.151Z</updated><title type='text'>Things I like about QlikView 10 - Part 3: Extension Objects</title><content type='html'>This is possibly the coolest thing in QlikView.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We were working with a client a while ago who had a very specific requirement for a visualisation.  We worked several options with different show/hide options around bar charts and pivot tables but, while they were close to what was required (close enough anyway), they didn't quite hit the mark.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I know that i can build exactly what they want with an extension object.  I know that I can do this because I know HTML and JavaScript - I know what I can do with it.  I don't even need to go to flash/silverlight, I can work wonders in notepad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have you had a go yet?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3469732523468853955?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3469732523468853955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/01/things-i-like-about-qlikview-10-part-3.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3469732523468853955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3469732523468853955'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/01/things-i-like-about-qlikview-10-part-3.html' title='Things I like about QlikView 10 - Part 3: Extension Objects'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-141636723861042767</id><published>2011-01-07T15:57:00.002Z</published><updated>2011-01-07T16:02:46.727Z</updated><title type='text'>Things I like about QlikView 10 - Part 2: UI</title><content type='html'>I am quite liking the new container object.  My only problem is that I keep forgetting about it and creating loads of separate charts with minimized icons - then it's "Doh!"  It is cool though.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Linked objects are starting to save a whole load of time - especially those date list boxes that I will have on most every sheet in a document.  Being able to link and then change once is a great boon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many of our customers now use Ajax as their primary client.  Therefore the WebView option in QlikView desktop is really cool.  Being able to wysiwyg in Ajax is great.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-141636723861042767?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/141636723861042767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/01/things-i-like-about-qlikview-10-part-2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/141636723861042767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/141636723861042767'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/01/things-i-like-about-qlikview-10-part-2.html' title='Things I like about QlikView 10 - Part 2: UI'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2608664766510154493</id><published>2011-01-07T15:48:00.003Z</published><updated>2011-01-07T15:57:37.335Z</updated><title type='text'>Things I like about QlikView 10 - Part 1: Script</title><content type='html'>One of my favourite things about v10 is the changes that they have made to the load algorythm to multi-thread the symbol table creation.  While you won't notice it so much up to a couple of hundred thousand rows of data, when you get into the millions it makes such a difference.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am also a big fan of the new QVConnect process that allows you to use a 32bit driver on a 64bit server.  It isn't something that we have run into everywhere but we have had a few customers with Accounting systems that only provided 32bit ODBC drivers.  Now, it isn't even a consideration.  Yay!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Within the script editor itself, the script syntax checking is taking some getting used to but is starting to save me a whole load of time.  I am really enjoying the auto-complete here too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2608664766510154493?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2608664766510154493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2011/01/things-i-like-about-qlikview-10-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2608664766510154493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2608664766510154493'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2011/01/things-i-like-about-qlikview-10-part-1.html' title='Things I like about QlikView 10 - Part 1: Script'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-53328508790010037</id><published>2010-11-19T00:46:00.002Z</published><updated>2010-11-19T13:43:31.392Z</updated><title type='text'>Do we really need maps for analysis?</title><content type='html'>This is a response to Barry's QlikFix post - http://t.co/q4jPQAs&lt;br /&gt;&lt;br /&gt;While interesting that 80% of data may have a spatial component (depending on how you define it), the reality is that the majority of that data does not have a special dependency – it is not really that suitable for display on a map.&lt;br /&gt;&lt;br /&gt;A common example for such displays might be something like sales by state. These are often displayed as bubbles geographically positioned over the state in question but do they really help with the analysis? Sure, you may be able to easily see that sales in California are larger than in Oregan, but how do they compare against sales in New York, New Jersey and Rhode Island that may be smudged together on the far side of the map. What might look “cool” on a demo may turn out to be something that is easier to analyse in a bar chart.&lt;br /&gt;&lt;br /&gt;One other unfortunate flaw is the level of education that might be encountered. Studies have shown that percentages of schoolchildren in the UK have difficulty picking out their own country versus France or Germany! Can we expect that everyone who needs to analyse European data is actually aware that the boot shaped country is Italy?&lt;br /&gt;&lt;br /&gt;Maps can be cool and have some great applications (many of which can be easily done in just Google maps without QlikView). Real world analysis can mostly do without them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-53328508790010037?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/53328508790010037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/11/do-we-really-need-maps-for-analysis.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/53328508790010037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/53328508790010037'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/11/do-we-really-need-maps-for-analysis.html' title='Do we really need maps for analysis?'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4075491966721621131</id><published>2010-11-14T20:57:00.002Z</published><updated>2010-11-14T21:13:54.144Z</updated><title type='text'>It is often simpler than it looks</title><content type='html'>Often, as we encounter more and more diverse data, we encounter data structures that would appear to call for more and more complex workings to associate them in QlikView.  What we need to do though is take a step back and see if there is a different way.  My experience is that once I do this, I find that it is often simpler than it looked.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, you have 2 or 3 tables that have several fields in common.  Some might start down the route of generating complex keys (for example, with autonumber or autonumberhash256) and one or more key tables.  A second look might reveal that if we simply concatenate all the tables - even though it appears that they are unlikely candidates for concatenation - then we will suddenly be left with a simple key table and some dimension tables.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another way of simplifying things that I use all the time is ApplyMap.  This is a really useful function (not unlike vlookup in excel) that enables us to map small tables into larger tables.  Always look to see if you can do a mapping load.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is often simpler than it looks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4075491966721621131?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4075491966721621131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/11/it-is-often-simpler-than-it-looks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4075491966721621131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4075491966721621131'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/11/it-is-often-simpler-than-it-looks.html' title='It is often simpler than it looks'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4194539189487284144</id><published>2010-09-30T19:25:00.002+01:00</published><updated>2010-09-30T19:32:16.079+01:00</updated><title type='text'>Access DBs on 64bit</title><content type='html'>I have written before about the issues of 32bit drivers on 64bit QlikView.  It is great to see that version 10 will get past this but, if you need to get Access data into your server now, on earlier versions, that is not a help.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am writing this because it is fresh in my mind because I have had the exact problem with a client.  They had an old Access database that they needed to get data into on 64bit QlikView.  Now, I have a 64bit Access driver because I have 64bit Office 2010 and it works great in QlikView.  Microsoft have released this as a separate download so you don't need office installed on your server:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=C06B8369-60DD-4B64-A44B-84B371EDE16D&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=C06B8369-60DD-4B64-A44B-84B371EDE16D&amp;amp;displaylang=en&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You don't need newer format Access databases, it works with older mdb files too.  Only criticism that I have is that the DataLinks properties box doesn't have an ellipse button to allow you browse for your database.  This isn't the most difficult thing to get past, just paste the path into the properties box.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hope this helps.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4194539189487284144?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4194539189487284144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/09/access-dbs-on-64bit.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4194539189487284144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4194539189487284144'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/09/access-dbs-on-64bit.html' title='Access DBs on 64bit'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1969830771683346108</id><published>2010-08-10T11:48:00.002+01:00</published><updated>2010-08-10T11:55:44.779+01:00</updated><title type='text'>Installation ended prematurely because of an error</title><content type='html'>I had started having this problem recently and decided to blog the solution because I couldn't find it elsewhere.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was happening when I went to install QlikView 9 SR5 but it is actually an issue with the Wise installer rather than QlikView specifically.  My problem is on Windows 7 64bit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What happens is that the Wise installer is trying to use VBScript and if it fails then it will give this message.  If you log the installer you will see messages like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;   DEBUG: Error 2896:  Executing action WiseNextDlg failed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Googling the message led me to try re-registering the VBScript.dll file (both in System32 and SysWOW64).  However, that did not help.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using Process Viewer (sysinternals) I noticed that it was loading the following registry entry:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{B54F3741-5B07-11CF-A4B0-00AA004A55E8}&lt;/div&gt;&lt;div&gt;&lt;p class="MsoPlainText"&gt;This GUID - B54F3741-5B07-11CF-A4B0-00AA004A55E8 - is the GUID for VBScript.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;However, the entries under it were invalid. There was also another HKEY_LOCAL_MACHINE entry that was valid.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;It appears that Windows will go for the current user entry first.&lt;/p&gt;&lt;p class="MsoPlainText"&gt;I renamed the registry entry under HKCU and re-ran the installer and all is now well.&lt;/p&gt;&lt;p class="MsoPlainText"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1969830771683346108?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1969830771683346108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/08/installation-ended-prematurely-because.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1969830771683346108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1969830771683346108'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/08/installation-ended-prematurely-because.html' title='Installation ended prematurely because of an error'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7006828128384176671</id><published>2010-06-23T21:28:00.006+01:00</published><updated>2010-06-23T21:46:35.889+01:00</updated><title type='text'>More on Dual - "Others" in chart using AGGR</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In a previous blog post (More On Dual - &lt;a href="http://qliktips.blogspot.com/2009/09/more-on-dual.html"&gt;http://qliktips.blogspot.com/2009/09/more-on-dual.html&lt;/a&gt;) I proposed a method for getting better labels in a Pie chart by using Dual to create the label and the value in the expression:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Dual(Country &amp;amp; ' (' &amp;amp; Num(Sum(Sales)/Sum(Total Sales),'0.00%') &amp;amp; ')' &amp;amp; chr(13) &amp;amp; Num(Sum(Sales),'#,##0'), Sum(Sales))&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A problem has been pointed out to me by one of my readers - if the number of slices is restricted (10 by default), then the "Others" does not display correctly:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8p5AsveJuFw/TCJwNfwxHxI/AAAAAAAAAAw/8Xm5Z3XWAb8/s1600/Pie+Others+1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://3.bp.blogspot.com/_8p5AsveJuFw/TCJwNfwxHxI/AAAAAAAAAAw/8Xm5Z3XWAb8/s320/Pie+Others+1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5486070673257340690" /&gt;&lt;/a&gt;We can fix this by limiting the number of dimensions using an AGGR statement with RANK in a calculated dimension:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;=If(aggr(rank(Sum(Sales)), Country) &lt;= 4, Country, 'Others')&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here, I am checking if the rank of the dimension is less than or equal to 4.  If so, just use the Country name, if not, use "Others".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, there is still a slight problem with this and the Dual - the name is still blank.  So, we need to modify the expression to check for a blank name:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Dual(If(Len(Country)&gt;0,Country,'Others') &amp;amp; ' (' &amp;amp; Num(Sum(Sales)/Sum(Total Sales),'0.00%') &amp;amp; ')' &amp;amp; chr(13) &amp;amp; Num(Sum(Sales),'#,##0'), Sum(Sales))&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(It will be blank because there are actually multiple values).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, all should be well!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_8p5AsveJuFw/TCJx2qnYSmI/AAAAAAAAAA4/0SZCHBH3ycI/s1600/Pie+Others+2.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_8p5AsveJuFw/TCJx2qnYSmI/AAAAAAAAAA4/0SZCHBH3ycI/s320/Pie+Others+2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5486072480057018978" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 266px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, this doesn't just apply to Pie charts (thankfully!) - this method of restricting the dimension using Rank and AGGR can be used in any chart - including Straight Tables!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7006828128384176671?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7006828128384176671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/06/more-on-dual-others-in-chart-using-aggr.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7006828128384176671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7006828128384176671'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/06/more-on-dual-others-in-chart-using-aggr.html' title='More on Dual - &quot;Others&quot; in chart using AGGR'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8p5AsveJuFw/TCJwNfwxHxI/AAAAAAAAAAw/8Xm5Z3XWAb8/s72-c/Pie+Others+1.jpg' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-6502997738628017537</id><published>2010-04-29T13:26:00.002+01:00</published><updated>2010-04-29T13:34:55.200+01:00</updated><title type='text'>Use a ramdrive!</title><content type='html'>Thanks to Håkan (the inventor of QlikView) for this handy tip.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are storing a temporary file to QVD and then reading it instead of using Resident (because it is way faster - something that you may find is improved greatly in version 10), if you configure a RamDisk (there are several options for this) and use that as the temporary location for the QVD, then it will be even faster!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hadn't come across a RamDisk for many years (I think since MSDOS 6) but this is a very interesting tip if saving seconds is critical to you.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-6502997738628017537?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/6502997738628017537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/04/use-ramdrive.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6502997738628017537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6502997738628017537'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/04/use-ramdrive.html' title='Use a ramdrive!'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8757273487953319837</id><published>2010-04-29T10:42:00.002+01:00</published><updated>2010-04-29T10:47:57.196+01:00</updated><title type='text'>Beta testing QlikView 10</title><content type='html'>Just back from Qonnections - the annual QlikView Partner conference.  This year it was held in the Fontainebleau Hotel, Miami Beach.  Good time was had by all.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We got to hear about the new features coming in version 10.  I can't say too much about it now, but there are some pretty cool things in there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They have had a first beta internally for a couple of months now and beta 2 was launched to partners at the conference (and downloaded by me a few minutes later!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There should be a public beta release in and around June - but that will depend on how beta 2 goes.  Release in the autumn.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the longest beta cycle that QlikView have ever run.  In fact, they are shortly going to upgrade all their own internal systems (including demo.qlikview.com) to version 10 - really eating their own dog food.  Expect version 10 to be the most stable new release ever.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8757273487953319837?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8757273487953319837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/04/beta-testing-qlikview-10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8757273487953319837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8757273487953319837'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/04/beta-testing-qlikview-10.html' title='Beta testing QlikView 10'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2888103673141919173</id><published>2010-04-16T11:16:00.002+01:00</published><updated>2010-04-16T11:36:24.847+01:00</updated><title type='text'>How QlikView stores data</title><content type='html'>To become really good at QlikView, you have to really understand how QlikView stores data.  This is an introduction that should help you along that road.&lt;br /&gt;&lt;br /&gt;If I load a very simple dataset:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Fruit:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;LOAD *&lt;br /&gt;INLINE [&lt;br /&gt;   Fruit, Color&lt;br /&gt;   Banana, Yellow&lt;br /&gt;   Blueberry, Blue&lt;br /&gt;   Tomato, Red&lt;br /&gt;   Tomato, Green&lt;br /&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And then add both fields as list boxes, I see that there are only 3 fruit listed - even though I have loaded 4 entries.  "Tomato" is only stored once by QlikView.  Internally, there are binary keys keeping track of the association between "Tomato" along with "Red" and "Green".&lt;br /&gt;&lt;br /&gt;In a large data set with a lot of repeating values (especially text values) the fact that each field value is only stored once means that there is a huge saving in the amount of memory needed to store the information.  This is why QlikView can store so much data in memory.&lt;br /&gt;&lt;br /&gt;Let's add another table of data:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Colors:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;LOAD * INLINE [&lt;br /&gt;   Color, Red, Green, Blue&lt;br /&gt;   Yellow, 255, 255, 0&lt;br /&gt;   Blue, 0, 0, 255&lt;br /&gt;   Red, 255, 0, 0&lt;br /&gt;   Green, 0, 255, 0&lt;br /&gt;   Amber, 255, 121, 0&lt;br /&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I now might think that I have 2 tables of data - both of which have a field called "Color".  But I don't!  There is only one field called "Color" in our dataset and this field will have 5 values.  Internally, the association between each of them and their associated values are maintained with binary keys.  It just so happens that one of the values - "Amber" - is not associated with any of the values in the "Fruit" field.&lt;br /&gt;&lt;br /&gt;Note that there is probably no direct association between "Fruit" and "Red".  The association is indirect.  However, because of the smaller data set in memory and the binary keys, the association is very fast.&lt;br /&gt;&lt;br /&gt;Hope this is useful!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2888103673141919173?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2888103673141919173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/04/how-qlikview-stores-data.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2888103673141919173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2888103673141919173'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/04/how-qlikview-stores-data.html' title='How QlikView stores data'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8340814189911227646</id><published>2010-04-08T13:31:00.001+01:00</published><updated>2010-04-08T13:32:54.000+01:00</updated><title type='text'>Radish Bits</title><content type='html'>A long-time news group buddy of mine, Walter Shpuntoff, has his own blog that covers QlikView.  Well worth the read:&lt;br /&gt;&lt;br /&gt;http://radishbits.wordpress.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8340814189911227646?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8340814189911227646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/04/radish-bits.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8340814189911227646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8340814189911227646'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/04/radish-bits.html' title='Radish Bits'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8564287811879335536</id><published>2010-04-08T08:22:00.003+01:00</published><updated>2010-04-08T08:30:13.201+01:00</updated><title type='text'>Watch your Security Connections</title><content type='html'>QlikView security is quite simple to implement - you just need to link the security information to the data and you can enable automatic reduction of the information that a user sees.  However, you need to watch out for the data that is linking the user to the data - if it is a text field then all of the values in that text field must be uppercase (you know that all the field names in Section Access must be uppercase too, right?)&lt;br /&gt;&lt;br /&gt;For example, this straightforward load will enable Tom, Jane or Bill to login:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Section Access;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    ACCESS, USERID, LNK&lt;br /&gt;    ADMIN, TOM, TOM&lt;br /&gt;    USER, JANE, JANE&lt;br /&gt;    USER, BILL, BILL&lt;br /&gt;];&lt;br /&gt;Section Application;&lt;br /&gt;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    LNK, Name, Month, Sales&lt;br /&gt;    TOM, Tom, Jan, 12321&lt;br /&gt;    JANE, Jane, Jan, 31232&lt;br /&gt;    BILL, Bill, Jan, 32131&lt;br /&gt;    TOM, Tom, Feb, 34342&lt;br /&gt;    JANE, Jane, Feb, 34545&lt;br /&gt;    BILL, Bill, Feb, 76575&lt;br /&gt;    TOM, Tom, Mar, 32133&lt;br /&gt;    JANE, Jane, Mar, 12123&lt;br /&gt;    BILL, Bill, Mar, 21321&lt;br /&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you enable the "Initial Data Reduction Based On Section Access" in the "Opening" tab of the Document Properties then they will be restricted to their own data.&lt;br /&gt;&lt;br /&gt;However, if I make a slight change:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Section Access;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    ACCESS, USERID, LNK&lt;br /&gt;    ADMIN, TOM, TOM&lt;br /&gt;    USER, JANE, Jane&lt;br /&gt;    USER, BILL, BILL&lt;br /&gt;];&lt;br /&gt;Section Application;&lt;br /&gt;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    LNK, Name, Month, Sales&lt;br /&gt;    TOM, Tom, Jan, 12321&lt;br /&gt;    Jane, Jane, Jan, 31232&lt;br /&gt;    BILL, Bill, Jan, 32131&lt;br /&gt;    TOM, Tom, Feb, 34342&lt;br /&gt;    Jane, Jane, Feb, 34545&lt;br /&gt;    BILL, Bill, Feb, 76575&lt;br /&gt;    TOM, Tom, Mar, 32133&lt;br /&gt;    Jane, Jane, Mar, 12123&lt;br /&gt;    BILL, Bill, Mar, 21321&lt;br /&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, Jane will not be able to login to this document - because the LNK field has mixed case!&lt;br /&gt;&lt;br /&gt;Best advice is to use an integer where possible:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Section Access;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    ACCESS, USERID, LNK&lt;br /&gt;    ADMIN, TOM, 1&lt;br /&gt;    USER, JANE, 2&lt;br /&gt;    USER, BILL, 3&lt;br /&gt;];&lt;br /&gt;Section Application;&lt;br /&gt;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    LNK, Name, Month, Sales&lt;br /&gt;    1, Tom, Jan, 12321&lt;br /&gt;    2, Jane, Jan, 31232&lt;br /&gt;    3, Bill, Jan, 32131&lt;br /&gt;    1, Tom, Feb, 34342&lt;br /&gt;    2, Jane, Feb, 34545&lt;br /&gt;    3, Bill, Feb, 76575&lt;br /&gt;    1, Tom, Mar, 32133&lt;br /&gt;    2, Jane, Mar, 12123&lt;br /&gt;    3, Bill, Mar, 21321&lt;br /&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you need to link on a text field, make sure that you have all capitals - use the UPPER function if necessary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8564287811879335536?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8564287811879335536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/04/watch-your-security-connections.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8564287811879335536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8564287811879335536'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/04/watch-your-security-connections.html' title='Watch your Security Connections'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3524156793446850277</id><published>2010-02-22T21:53:00.003Z</published><updated>2010-02-22T22:12:21.573Z</updated><title type='text'>Seeing the Blindingly Obvious</title><content type='html'>Recently on QlikCommunity, I have proposed a solution however the very brilliant Oleg Troyansky proposed an even better solution: http://community.qlikview.com/forums/p/25381/96915.aspx#96915&lt;br /&gt;&lt;br /&gt;Hi answer to the problem (excluding nulls, zero length strings, etc.) was this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sum({$ &amp;lt TextField = {"=len(trim(TextField))&gt;0"}&amp;gt} Qty )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Brilliantly fantastic!  Of course, it is even more brilliant if you understand it and, alas, I just couldn't fathom it.  It works.  It works great.  But I didn't see it.&lt;br /&gt;&lt;br /&gt;Then my genius colleague, Karol Dorniak, spelt it out for me :- anything that you can type into a search dialog in QlikView can be used in a set!  And that includes any "advanced" search syntax!!!&lt;br /&gt;&lt;br /&gt;So this is what Oleg was doing - using advanced search.  Brilliant.&lt;br /&gt;&lt;br /&gt;When you right-click on a List Box in QlikView, there are 3 search options available - Search, Fuzzy Search and Advanced Search.  When you click on a list box and just start typing, you get the default search for that List Box (usually the normal search but you can set it to Fuzzy as default on the General tab of the List Box properties).  Did you know that you can delete the "**" from the default search and change it to a "~" to start doing a fuzzy search.  You can also start typing an "=" followed by an expression (e.g. "=Sum(SalesAmount) &gt; 5000") to do an advanced search - you don't need to go through the advanced search dialog.&lt;br /&gt;&lt;br /&gt;So, you can use any of the 3 standard searches by just replacing the search condition with something else ("**", "&gt;", "&gt;&lt;", "&gt;=", "~", "=...")  Anything that you can type into a search can be used inside a Set!&lt;br /&gt;&lt;br /&gt;Man, does this QlikView rock!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3524156793446850277?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3524156793446850277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/02/seeing-blindingly-obvious.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3524156793446850277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3524156793446850277'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/02/seeing-blindingly-obvious.html' title='Seeing the Blindingly Obvious'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8220502612473359686</id><published>2010-01-25T18:40:00.003Z</published><updated>2010-01-27T10:55:54.873Z</updated><title type='text'>More on Dual - Problem in Sets</title><content type='html'>I have discussed using Dual a couple of times in the past.  It can be enormously useful.  Sometimes it can throw you a bit - especially if you do not realise that you are using a Dual.&lt;br /&gt;&lt;br /&gt;An example comes up in my response to the post of jhoffmann on &lt;a href="http://community.qlikview.com/forums/p/24900/95200.aspx#95200"&gt;QlikCommunity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He was asking about doing calculations in a Set.  This is, of course, eminently achievable using the dollar-expansion syntax.  You do have to watch it when using a Dual value.&lt;br /&gt;&lt;br /&gt;He was using a field called "RollingMonth".  I assume, because it comes from the (old) training manual, that this was created in the Script using:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;...&lt;br /&gt;Date(MonthStart(date_field), 'MM/YY') As RollingMonth,&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This syntax creates a Dual value - with the month's date (as an integer) and the text as per the format string.&lt;br /&gt;&lt;br /&gt;This is quite fine in a Set if you use a simple calculation such as Max:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sum({&amp;lt;RollingMonth = {"$(=Max(RollingMonth))"}&amp;gt;} Amount)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You see, Max knows about Dual and will return the correct value so that the comparison will work - it returns the Text value.  It is the text value that is required in the Set comparison.  If the max month is January 2010, Max will correctly return (in this case) "01/10" - even though it is alphabetically less than the "12/09" before it.  Max does the Dual sort on the number and returns the text.  Simple.&lt;br /&gt;&lt;br /&gt;The problem arises with some other functions that are not so "Dual aware".  For example, if we wanted to see the values from the same month last year, we might try this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sum({&amp;lt;RollingMonth = {"$(=AddMonths(Max(RollingMonth),-12))"}&amp;gt;} Amount)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The problem is that AddMonths takes a date value as a parameter and returns a date.  It doesn't care about the text value.  It uses the Dual's numeric value to do the calculation and then returns a date/numeric value.  For example, it might be "01/01/2009".  This will not work in our Set above (RollingMonth={"01/01/2009"}) because the text doesn't match and the Sum will return 0.&lt;br /&gt;&lt;br /&gt;To fix this one, we just need to re-establish the Dual value:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sum({&amp;lt;RollingMonth = {"$(=Date(AddMonths(Max(RollingMonth),-12),'MM/YY'))"}&amp;gt;} Amount)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now the calculations will work perfectly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8220502612473359686?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8220502612473359686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/01/more-on-dual-problem-in-sets.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8220502612473359686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8220502612473359686'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/01/more-on-dual-problem-in-sets.html' title='More on Dual - Problem in Sets'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8411794426736613809</id><published>2010-01-25T16:59:00.003Z</published><updated>2010-01-25T17:08:25.579Z</updated><title type='text'>More on "Sets =- or -=???"</title><content type='html'>A while ago I blogged about using =- or -= in a set.&lt;br /&gt;&lt;br /&gt;I answered a post in QlikCommunity today (&lt;a href="http://community.qlikview.com/forums/p/24894/95176.aspx#95176"&gt;http://community.qlikview.com/forums/p/24894/95176.aspx#95176&lt;/a&gt;) that demonstrates the use very well.&lt;br /&gt;&lt;br /&gt;The question was from sebagiar.  He asked how to get an average out of values while ignoring 0s.  For example if I have 3 values: 100, 0, 200 then he wants a result of 150, not the 100 that the straight Avg function will give.&lt;br /&gt;&lt;br /&gt;My response is to use the following set on the field:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;=Avg({&lt; F1 -= {0}&gt;} F1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, why "-=" instead of "=-"?  Well, the later just tells the field to use all values except 0 - it will exclude any selections on that field.  The first one is "additive" (well, I guess I should say "subtractive") and will include and selections on that field and then drop out the zeros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8411794426736613809?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8411794426736613809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2010/01/more-on-sets-or.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8411794426736613809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8411794426736613809'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2010/01/more-on-sets-or.html' title='More on &quot;Sets =- or -=???&quot;'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3909355305861497400</id><published>2009-12-22T09:16:00.004Z</published><updated>2009-12-22T09:23:57.923Z</updated><title type='text'>The right negative</title><content type='html'>I recently had a situation where a customer was not happy with the values returned in a budget variance column.&lt;br /&gt;&lt;br /&gt;Simple calculation for variance - (Spend - Budget)/Budget&lt;br /&gt;&lt;br /&gt;However, in some of their profit centers there was no budget but there was spend!  I.e.: (Spend)/0.&lt;br /&gt;&lt;br /&gt;Rather than just display a "-" or 0, they wanted this to display as -100%, to really flag it up.&lt;br /&gt;&lt;br /&gt;Following on from my previous post about the RangeMax function in QlikView, I thought about it but then, deciding that wouldn't work for me here, I decided on the Alt function.&lt;br /&gt;&lt;br /&gt;The Alt function is quite useful because, like RangeMax, you give it a series of Expressions but what it does is returns you the first one that results in a valid number.  So, if I use:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Alt((Spend-Budget)/Budget, -1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When the variance percentage is Null (when Budget is 0), then the value returned will be -1 (-100%).  Exactly what I needed.&lt;br /&gt;&lt;br /&gt;Alt can also be useful where you have mixed date formats in a date stream - using multiple Date# functions in an Alt and one of them should give you a number.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3909355305861497400?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3909355305861497400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/12/right-negative.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3909355305861497400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3909355305861497400'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/12/right-negative.html' title='The right negative'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-6318892633021098948</id><published>2009-11-26T10:21:00.002Z</published><updated>2009-11-26T10:26:43.795Z</updated><title type='text'>Keeping it positive</title><content type='html'>I had a request that when the result of a particular expression was negative, then it should just display as zero (it was a measure of how far out of compliance the result was - a negative result meant that they were in compliance so zero was appropriate).&lt;br /&gt;&lt;br /&gt;So I could do a simple:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;if(myExpression &gt; 0, myExpression, 0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That is OK if the expression is simple, but if the expression is more complex then it becomes unwieldy and long and hence difficult to maintain.&lt;br /&gt;&lt;br /&gt;A much more elegant way is to use RangeMax like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RangeMax(0, myExpression)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Very simple, if my expression dips into the negative then the max value in the range becomes 0.  Exactly what I want to achieve and much easier to maintain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-6318892633021098948?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/6318892633021098948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/11/keeping-it-positive.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6318892633021098948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6318892633021098948'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/11/keeping-it-positive.html' title='Keeping it positive'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1225839140419381300</id><published>2009-11-20T17:19:00.002Z</published><updated>2009-11-20T17:29:33.521Z</updated><title type='text'>Lies, damned lies...and then there is statistics</title><content type='html'>I spotted this in a Microstrategy publication which showed the "TCO" for Microstrategy over other operators:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microstrategy.co.uk/graphics/TCOSlide.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 203px;" src="http://www.microstrategy.co.uk/graphics/TCOSlide.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a fairly typical use of a flawed statistic to prove a point.&lt;br /&gt;&lt;br /&gt;You see, if you have a 10 user QlikView system, you have 1 IT person looking after it - the same guy that is looking after Windows, Email, buying coffee, etc.  The same guy can probably look after QlikView as the company grows.  So that is a 1 IT person for 10.  Push that out to 1000 users and it become a "statistic" of 100 IT people per 1000.&lt;br /&gt;&lt;br /&gt;Given that, until recently, QlikView has been playing more in the SME sector, then these numbers are going to be more than less typical.  Therefore it probably says something that the "statistic" is only 21.9/1000.&lt;br /&gt;&lt;br /&gt;At the other end, of course Microstrategy are best because of only 4.9 IT people per 1000.  There is no real qualatitive data behind this.  Microstrategy play in the Enterprise sector where they will regularly sell large CAL deals as well as open ended deals - we have no idea how many, exactly, users there are.  &lt;br /&gt;&lt;br /&gt;Its probably good to know that while your 21.9 QlikView IT people are busy looking after the Email server and making the coffee, your 4.9 Microstrategy guys are busy doing Microstrategy and nothing else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1225839140419381300?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1225839140419381300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/11/lies-damned-liesand-then-there-is.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1225839140419381300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1225839140419381300'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/11/lies-damned-liesand-then-there-is.html' title='Lies, damned lies...and then there is statistics'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8812486422215603114</id><published>2009-11-20T13:59:00.002Z</published><updated>2009-11-20T14:57:47.395Z</updated><title type='text'>Using Alerts in QlikView</title><content type='html'>Alerts are quite easy to set up.  With a few tricks, they can become quite powerful.&lt;br /&gt;&lt;br /&gt;Let me start with a very simple data set:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;CountrySales:&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;LOAD * INLINE [&lt;br /&gt;    Country, Sales&lt;br /&gt;    England, 400&lt;br /&gt;    Ireland, 300&lt;br /&gt;    Scotland, 200&lt;br /&gt;    Wales, 100&lt;br /&gt;];&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Now, I want to create an Alert when there are any countries that have Sales &gt; 200.&lt;br /&gt;&lt;br /&gt;To create an alert, I need to be able to create an expression that will return a true value.  I could use a simple aggr expression like:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;=Sum(Aggr(If(Sum(Sales)&gt;1, 1), Country)) &gt; 0&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This will work.  However, it means that we are going to be limited to what information we can include in the Alert message.  We can include the number of Countries, but we couldn't, for example, say which ones they were.&lt;br /&gt;&lt;br /&gt;A more powerful way is to combine Advanced Search, Bookmarks and Alerts.&lt;br /&gt;&lt;br /&gt;If I create an Advanced Search against the Country field such as:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;   =Sum(Sales)&gt;200&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Then I save this search as a Bookmark.  Now, I can create an Alert with this Bookmark used where the Alert is simply:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;   =Count(Distinct Country) &gt; 0&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;And the Alert message could be something like:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;   ='Number of countries exceeding 200 = ' &amp; Count(Distinct Country) &amp; chr(13) &amp; &lt;br /&gt;   'Countries: ' &amp; Concat(Country, ', ')&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Of course, I can bring any other information into this message that is related to the countries that match the Bookmark.&lt;br /&gt;&lt;br /&gt;Now, if I set-up the "Mail" options under User Preferences, I can have this document email an alert to someone.&lt;br /&gt;&lt;br /&gt;If I turn on the alert to use "Batch Mode", this can happen on the server when the document is reloaded.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8812486422215603114?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8812486422215603114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/11/using-alerts-in-qlikview.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8812486422215603114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8812486422215603114'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/11/using-alerts-in-qlikview.html' title='Using Alerts in QlikView'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5780944908104832341</id><published>2009-11-08T18:37:00.006Z</published><updated>2009-11-08T19:09:43.329Z</updated><title type='text'>AND Mode in list boxes</title><content type='html'>By default, multiple selections in list boxes are "OR" mode.  For most applications this is exactly what we need.&lt;br /&gt;&lt;br /&gt;However, there are situations, such as that requested by Wolfgang Praschnig on QlikCommunity this week: &lt;br /&gt;http://community.qlikview.com/forums/p/22224/84898.aspx.&lt;br /&gt;&lt;br /&gt;Wolfgang wants to be able to see customers who have bought one product AND bought another product.  The default action of QlikView would be to show customers who had bought one product or the other.&lt;br /&gt;&lt;br /&gt;To enable "AND mode" in a list box, there are a couple of rules that we need to follow:&lt;br /&gt;&lt;br /&gt;1.  The field in the list box must be contained in a table that has only 2 fields.&lt;br /&gt;&lt;br /&gt;2.  The other field in the table is the association (or ID) field.  This field is only contained in this table.&lt;br /&gt;&lt;br /&gt;3.  The table must have been loaded with the "DISTINCT" keyword.&lt;br /&gt;&lt;br /&gt;This can sometimes be tricky to achieve, so hopefully an example will help demonstrate.&lt;br /&gt;&lt;br /&gt;Lets say that we have 3 tables:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Orders&lt;/span&gt;&lt;br /&gt;OrderID, CustomerID, OrderDate&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;OrderDetails&lt;/span&gt;&lt;br /&gt;OrderID, LineNo, ProductID, Quantity, Price&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Product&lt;/span&gt;&lt;br /&gt;ProductID, ProductName&lt;br /&gt;&lt;br /&gt;What we want to do is connect the product name to the Orders table in a way that we can employ AND mode.&lt;br /&gt;&lt;br /&gt;This means that we will need to create a table that has the OrderID (to associate to Orders) and a ProductName field (which we will call "ProductNameAND") that we can put in our List Box with AND mode on.&lt;br /&gt;&lt;br /&gt;So, first we need to create a table with the OrderID and ProductID from the OrderDetails table:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;ProductAND:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier;"&gt;LOAD DISTINCT&lt;br /&gt;   OrderID, ProductID As PID&lt;br /&gt;RESIDENT&lt;br /&gt;   OrderDetails;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note that I have aliased the ProductID field as PID - this is because I am going to drop it in a minute.  Also note the DISTINCT keyword.&lt;br /&gt;&lt;br /&gt;Now, bring in the Product name:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier;"&gt;LEFT JOIN (ProductAND)&lt;br /&gt;LOAD DISTINCT&lt;br /&gt;   ProductID As PID, ProductName As ProductNameAND&lt;br /&gt;RESIDENT&lt;br /&gt;   Product;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finally, drop the PID field so we are left with only the 2 fields as required.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier;"&gt;DROP FIELD PID;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, we can add the ProductNameAND field in a List Box and the AND mode will be available.&lt;br /&gt;&lt;br /&gt;Interesting feature here.  When you click on an item in an AND mode box, an "&amp;" will appear to the left of it.  Pressing CTRL and clicking on additional "possible" (in white) items will add further "&amp;"s beside those items.  However, if you click on an "excluded" item or you click and hold the mouse down for a second on "possible" items, it turns to a "!" instead - i.e. "NOT".  This can be really powerful for queries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5780944908104832341?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5780944908104832341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/11/and-mode-in-list-boxes.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5780944908104832341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5780944908104832341'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/11/and-mode-in-list-boxes.html' title='AND Mode in list boxes'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1474792462308795801</id><published>2009-11-08T18:25:00.002Z</published><updated>2009-11-08T18:36:25.731Z</updated><title type='text'>SR2 released and looking good</title><content type='html'>Well SR2 for QlikView 9 was released last week.&lt;br /&gt;&lt;br /&gt;So far, so good.  Looks like all my reported bugs have been fixed.&lt;br /&gt;&lt;br /&gt;My opinion is that this Service Release is really what SR1 should have been if it hadn't been rushed forward to get some of the bad bugs from the initial release fixed.&lt;br /&gt;&lt;br /&gt;With all of the great things that are in v9, we can now get on with the business of implementing it freely without having to worry about bugs that just shouldn't have been there.&lt;br /&gt;&lt;br /&gt;Hurry over to QlikCommunity - http://community.qlikview.com - to get your copy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1474792462308795801?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1474792462308795801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/11/sr2-released-and-looking-good.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1474792462308795801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1474792462308795801'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/11/sr2-released-and-looking-good.html' title='SR2 released and looking good'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5957610773938732272</id><published>2009-10-06T15:39:00.002+01:00</published><updated>2009-10-06T15:50:38.001+01:00</updated><title type='text'>Retrieving Database Values from within a document</title><content type='html'>There may be many reasons why you might want to get a value from outside of QlikView at any time, without having to reload your document (even partially).&lt;br /&gt;&lt;br /&gt;The obvious method is to use macros to retrieve the data using ADO calls.&lt;br /&gt;&lt;br /&gt;However, there is a function in QlikView that can do this - but only to retrieve one value (e.g. a record count).  The function is called SqlValue.&lt;br /&gt;&lt;br /&gt;The function takes 3 parameters:&lt;br /&gt;&lt;br /&gt;- Connection&lt;br /&gt;- Query&lt;br /&gt;- Connection Type&lt;br /&gt;&lt;br /&gt;Connection Type is only one of 'OLEDB' or 'ODBC'.  If you leave it out, ODBC is assumed.&lt;br /&gt;&lt;br /&gt;The Query is a string that should (although not absolutely required) return one row and one value.  If it returns more, only the first value in the first row is returned.&lt;br /&gt;&lt;br /&gt;The Connection is straightforward if using ODBC because you just use the predefined ODBC connection name.  For OLEDB, you need to pass an OLEDB connection string.  Now, this can be messy (as they can get quite long and include single quotes which can throw you a bit.  For me, the easiest way is to set up a variable with the Connection string in it (perhaps it could be stored in the registry and retrieved using GetRegistryString!)&lt;br /&gt;&lt;br /&gt;Once you have it, then you just call like this:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;=Num(SqlValue(MyDatasource, 'SELECT Distinct Count(*) As MyCount From Orders', 'OLEDB'))&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Note that I have used the Num function here to cast the return value as a numeric.  The SqlValue function returns a dual so, if you want to display it, you need to cast as numeric or it will display as blank (no Text value in the Dual).&lt;br /&gt;&lt;br /&gt;The query that you pass can be as complex as the target database supports and can use values from your QlikView document:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;=Num(SqlValue(MyDatasource, 'SELECT Distinct Count(*) As MyCount From Orders Where CustomerID in (' &amp; Concat(Distinct CustomerID, ',') &amp; ')', 'OLEDB'))&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Obviously, and this is flagged in the help file, if you have queries running in your document, they can slow things down while waiting for the database query to return.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5957610773938732272?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5957610773938732272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/10/retrieving-database-values-from-within.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5957610773938732272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5957610773938732272'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/10/retrieving-database-values-from-within.html' title='Retrieving Database Values from within a document'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5639909567402560552</id><published>2009-10-06T14:36:00.002+01:00</published><updated>2009-10-06T14:44:36.547+01:00</updated><title type='text'>Removing Fields with a Wildcard</title><content type='html'>One of my clients asked an interesting question.  They will have a standard set of QVDs to load data from that may be used in various documents.  In each document, they will also have a mapping table to mass rename the fields that they need for that particular document.&lt;br /&gt;&lt;br /&gt;Now, with their dataset, they will be left with a load of fields that start with the word "Custom_" - sometimes some of these fields will be aliased, sometimes they will not be used.  If they are not used, then they will want to drop the fields from the document (to keep things nice).&lt;br /&gt;&lt;br /&gt;Unfortunately, QlikView does not accept a command like &lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;DROP FIELDS "Custom*";&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;So, we can use a couple of functions that are available in the script to do this for us.  Here is a script sample:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;MyTable:&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    F1, F2, F3, F4&lt;br /&gt;    1, 2, 3, 4&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;Rename Field F1 to NewField;&lt;br /&gt;Rename Field F3 to NewField2;&lt;br /&gt;&lt;br /&gt;Let i = 1;&lt;br /&gt;&lt;br /&gt;Do While i &lt;= NoOfFields('MyTable')&lt;br /&gt; &lt;br /&gt; Trace Getting Field $(i) From MyTable;&lt;br /&gt; &lt;br /&gt; Let FieldName = FieldName($(i), 'MyTable');&lt;br /&gt; &lt;br /&gt; Trace FieldName = $(FieldName);&lt;br /&gt; &lt;br /&gt; Let Command = If('$(FieldName)' Like 'F*', 'Drop Field $(FieldName);', '');&lt;br /&gt; &lt;br /&gt; Trace Command = $(Command);&lt;br /&gt; &lt;br /&gt; $(Command)&lt;br /&gt; &lt;br /&gt; Let i = $(i) + If('$(Command)' = '', 1, 0);&lt;br /&gt;&lt;br /&gt;Loop&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;So, I load 4 fields, rename 2 of them, then loop through all the fields looking for a match ('F*') for the original names and create a command to execute in the script.  (This is also a good example of using a dynamically created command in a script!)&lt;br /&gt;&lt;br /&gt;The reload window should look like this:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;MyTable &lt;&lt; INL47EA 1 lines fetched&lt;br /&gt;Getting Field 1 From MyTable&lt;br /&gt;FieldName = NewField&lt;br /&gt;Command = &lt;br /&gt;Getting Field 2 From MyTable&lt;br /&gt;FieldName = F2&lt;br /&gt;Command = Drop Field F2&lt;br /&gt;Getting Field 2 From MyTable&lt;br /&gt;FieldName = NewField2&lt;br /&gt;Command = &lt;br /&gt;Getting Field 3 From MyTable&lt;br /&gt;FieldName = F4&lt;br /&gt;Command = Drop Field F4&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Note that you need to use a While statement here not a For loop.  This is because once you drop a field, say Field #2, the next field becomes that field number - Field #3 becomes Field #2 - so you will end up skipping fields.  The While statement prevents this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5639909567402560552?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5639909567402560552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/10/removing-fields-with-wildcard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5639909567402560552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5639909567402560552'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/10/removing-fields-with-wildcard.html' title='Removing Fields with a Wildcard'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1886521608451220536</id><published>2009-09-17T17:37:00.006+01:00</published><updated>2009-09-17T19:33:33.652+01:00</updated><title type='text'>Using Sets to avoid Key Tables</title><content type='html'>This may not appeal to purists, but it might be a good way to get out of a fix when you are in a hurry to get something in front of people.&lt;br /&gt;&lt;br /&gt;Let's create a QlikView Script:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;Sales:&lt;br /&gt;Load * INLINE [&lt;br /&gt;Date, Item, Store, Quantity, Price, NetValue&lt;br /&gt;1/1/2009, 1, 1, 1, 2.00, 2.00&lt;br /&gt;1/1/2009, 1, 2, 2, 2.00, 4.00&lt;br /&gt;1/1/2009, 2, 1, 1, 2.00, 2.00&lt;br /&gt;1/2/2009, 2, 2, 1, 3.00, 3.00&lt;br /&gt;1/2/2009, 1, 1, 3, 3.00, 9.00&lt;br /&gt;1/2/2009, 2, 2, 1, 3.00, 3.00&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;Product:&lt;br /&gt;Load * INLINE [&lt;br /&gt;Item, Description&lt;br /&gt;1, Product A&lt;br /&gt;2, Product B&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;Store:&lt;br /&gt;Load * INLINE [&lt;br /&gt;Store, Name&lt;br /&gt;1, Store 1A&lt;br /&gt;2, Store 2B&lt;br /&gt;];&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Now, this will create a nicely connected QlikView document.  Now, I am going to introduce a Stock table that tells us the stock levels for the products in each store:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;Stock:&lt;br /&gt;Load * INLINE [&lt;br /&gt;Store, Item, OnHand&lt;br /&gt;1, 1, 55&lt;br /&gt;1, 2, 33&lt;br /&gt;2, 1, 23&lt;br /&gt;2, 2, 12&lt;br /&gt;];&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;This will create a nice Synthetic Key!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_8p5AsveJuFw/SrJmvQsyuCI/AAAAAAAAAAk/tF3r7h-jngQ/s1600-h/BadJoin.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 195px;" src="http://4.bp.blogspot.com/_8p5AsveJuFw/SrJmvQsyuCI/AAAAAAAAAAk/tF3r7h-jngQ/s320/BadJoin.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5382477466783889442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, the normal approach to avoiding the Synthetic Key is to start creating a Key table to nicely join all the tables.  This, of course, uses lots of Joins and Concatenation and Resident loads (which are slow!!!).  All of this means that your document loading takes a lot longer - losing any QVD optimisation that you might have.&lt;br /&gt;&lt;br /&gt;Here is my solution to resolve this Synthetic Key:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;Stock:&lt;br /&gt;Load * INLINE [&lt;br /&gt;StockStore, Item, OnHand&lt;br /&gt;1, 1, 55&lt;br /&gt;1, 2, 33&lt;br /&gt;2, 1, 23&lt;br /&gt;2, 2, 12&lt;br /&gt;];&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;"Hey!  You can't do that", I hear you all shouting.  You have broken your links!  How can you see the correct stock levels?  If someone selects a Store, then the value of the stock in the chart won't change!  If you chart it now, you will just get the same value because there is no association.&lt;br /&gt;&lt;br /&gt;And this, of course, is true.  If I, for example, create a Straight Table with a dimension of "Description" (the Product Name) and use the expression:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;Sum(OnHand)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;I will get the 78 for Product A and 45 for Product B.  Now, if I select Store 1A, the values will not change - which is incorrect.&lt;br /&gt;&lt;br /&gt;But how about if I use this expression:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family:courier new"&gt;&lt;br /&gt;Sum({&amp;lt;StockStore = P({$} Store)&amp;gt;} OnHand)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Now the values do change if I make selections on Store.&lt;br /&gt;&lt;br /&gt;This is using the new "P" option in Set Analysis to allow me to make a set of the relative values.  So, my "P" returns a set of the selected Stores in this document and then I am using that to filter the StockStore value.&lt;br /&gt;&lt;br /&gt;One downside - and I would love to hear from someone who can overcome it - is that it doesn't work if the dimension is Store instead of Product.   I need to work on that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1886521608451220536?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1886521608451220536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/09/using-sets-to-avoid-key-tables.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1886521608451220536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1886521608451220536'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/09/using-sets-to-avoid-key-tables.html' title='Using Sets to avoid Key Tables'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8p5AsveJuFw/SrJmvQsyuCI/AAAAAAAAAAk/tF3r7h-jngQ/s72-c/BadJoin.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3254622244677931377</id><published>2009-09-17T00:23:00.003+01:00</published><updated>2009-09-17T00:36:35.680+01:00</updated><title type='text'>Microsoft Gemini</title><content type='html'>I just rewatched this video again: http://www.youtube.com/watch?v=MzgMMO-P9F0 - A preview of Microsoft Gemini in Excel 2010.&lt;br /&gt;&lt;br /&gt;Why is it that when he says, 'we call them "Slicers"', I can hear Dr. Evil saying 'I call it a "LASER"' ;-)&lt;br /&gt;&lt;br /&gt;Well, Gemini is now available as a Community Preview.  You can get access to the Gemini CTP if you are a member of the Office 2010 Tech Preview by visiting http://www.microsoft.com/officebusiness/office2010/Default.aspx?vid=Gemini (if you go to that link, click on "Videos", there is a really bad "Project Gemini for Excel 2010" video that you can watch).&lt;br /&gt;&lt;br /&gt;Is Gemini a "QlikView Killer"?  I am not sure.  All I can say is that my experience tells me that QlikView rocks compared to this demo.  My experience also tells me that Microsoft are into marathon's, not sprints.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3254622244677931377?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3254622244677931377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/09/microsoft-gemini.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3254622244677931377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3254622244677931377'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/09/microsoft-gemini.html' title='Microsoft Gemini'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1969509981144463750</id><published>2009-09-16T15:00:00.002+01:00</published><updated>2009-09-16T15:05:24.815+01:00</updated><title type='text'>Avoid Resident for large data sets</title><content type='html'>As part of your training, you were probably taught to us Resident loads to re-use data that has already been loaded.  I have used this and taught this for several years.&lt;br /&gt;&lt;br /&gt;However, my experience recently with larger data sets is that resident load is very slow!&lt;br /&gt;&lt;br /&gt;A much better choice is to re-use a QVD if you have one.  In fact, if you write the in memory table to a QVD (using STORE), and then use that QVD for your next load, it is still faster than using Resident!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1969509981144463750?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1969509981144463750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/09/avoid-resident-for-large-data-sets.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1969509981144463750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1969509981144463750'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/09/avoid-resident-for-large-data-sets.html' title='Avoid Resident for large data sets'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4983007709668612499</id><published>2009-09-16T13:26:00.004+01:00</published><updated>2009-09-16T13:35:28.874+01:00</updated><title type='text'>Custom popup labels on bar chart</title><content type='html'>The default pop-up for a QlikView bar chart is not always the most friendly.  It shows the values for dimensions and expressions in the form:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dimension 1 = Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dimension 2 = Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;Expression = Value&lt;br /&gt;&lt;br /&gt;Now, we may not like this popup and wish to display the values differently or add different formats.  We may even want to include additional information.&lt;br /&gt;&lt;br /&gt;Well, you can.  There are a couple of steps:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;br /&gt;For your existing expression, make sure that the "Text as Popup" option is turned off.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;br /&gt;Add a new Expression that calculates out the correct string that you want to display in your popop with all the correct formatting.  For this expression, turn on that "Text as popup" option.  But we don't want the chart trying to display a real bar for this expression so take off the "Bar" option (the icon for the expression will change from the Bar icon to a text bubble icon).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;br /&gt;We need to stop the default popup - on the Presentation tab, turn off the "Pop-up labels" option.&lt;br /&gt;&lt;br /&gt;Job done.&lt;br /&gt;&lt;br /&gt;If you are on QlikCommunity (and if you aren't, why on earth not???) then you can grab a demo of this created by me from:&lt;br /&gt;http://community.qlikview.com/media/p/78614.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4983007709668612499?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4983007709668612499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/09/custom-popup-labels-on-bar-chart.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4983007709668612499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4983007709668612499'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/09/custom-popup-labels-on-bar-chart.html' title='Custom popup labels on bar chart'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2037825019166871198</id><published>2009-09-14T12:10:00.003+01:00</published><updated>2009-09-14T12:17:23.204+01:00</updated><title type='text'>More on Dual</title><content type='html'>I posted recently about the very useful Dual function (to store a numeric value and a text value - e.g. for Months).&lt;br /&gt;&lt;br /&gt;Another good application of this function is in a chart calculation.  If your calculation includes a dual, e.g.:&lt;br /&gt;&lt;br /&gt;   &lt;strong&gt;Dual(Country &amp; ' (' &amp; Num(Sum(Sales)/Sum(Total Sales),'0.00%') &amp; ')', Sum(Sales))&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Then you will have both a Number and a Text value - either or both can be displayed on the chart using the "Text on Datapoint" and/or the "Numbers on Datapoint" options in the Express Tab of the chart.&lt;br /&gt;&lt;br /&gt;One use of this is to display 2 disfferent calculations on, say, a pie chart.  In the above example, the Pie chart could be set to display both the total values and the percentages - something that is not achievable any other way.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_8p5AsveJuFw/Sq4mJOwyArI/AAAAAAAAAAc/GuXuonpqQWM/s1600-h/DualExample.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 212px;" src="http://3.bp.blogspot.com/_8p5AsveJuFw/Sq4mJOwyArI/AAAAAAAAAAc/GuXuonpqQWM/s320/DualExample.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5381280544777700018" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2037825019166871198?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2037825019166871198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/09/more-on-dual.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2037825019166871198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2037825019166871198'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/09/more-on-dual.html' title='More on Dual'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8p5AsveJuFw/Sq4mJOwyArI/AAAAAAAAAAc/GuXuonpqQWM/s72-c/DualExample.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3234688625417586690</id><published>2009-09-10T13:34:00.002+01:00</published><updated>2009-09-10T13:49:56.599+01:00</updated><title type='text'>Keeping a Trace on things</title><content type='html'>I love QlikView.  I love the way that I find new things all the time.&lt;br /&gt;&lt;br /&gt;Occasionally, when I am very bored, I sometimes have a look in the help file for things that I am not familiar with.  That is how I learned about Trace.&lt;br /&gt;&lt;br /&gt;Trace is very cool in that it allows you to both comment your code and have those comments appear in the Script Execution dialog.  It also supports variable use.&lt;br /&gt;&lt;br /&gt;So, I could have a script like this:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family : courier new;"&gt;For i = 1 to 10&lt;br /&gt;&lt;br /&gt;   Info:&lt;br /&gt;   Load&lt;br /&gt;      Information&lt;br /&gt;   From File$(i).qvd (QVD);&lt;br /&gt;&lt;br /&gt;Next&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;In the past, I may not have been exactly sure where in the look I am without having to physically count the entries in the Script Execution dialog.  Now, I can add a trace into the loop:&lt;br /&gt;&lt;br /&gt;   &lt;p style="font-family : courier new;"&gt;Trace Loading from file:  File$(i).qvd;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;And it will appear in the Script Execution like:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family : courier new;"&gt;Loading from file: File1.qvd&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;What's more, it also appears in the script execution log file (you have to turn that on in the Document Properties - General - Generate Log File).&lt;br /&gt;&lt;br /&gt;I wonder what interesting things that you might find in the help file?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3234688625417586690?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3234688625417586690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/09/keeping-trace-on-things.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3234688625417586690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3234688625417586690'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/09/keeping-trace-on-things.html' title='Keeping a Trace on things'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-8350523505293911796</id><published>2009-08-29T15:46:00.002+01:00</published><updated>2009-08-29T16:00:22.244+01:00</updated><title type='text'>Using Dual</title><content type='html'>QlikView has a really cool data type called "Dual".  This type allows you to mix text and numeric values which can be very useful.&lt;br /&gt;&lt;br /&gt;For example, imagine that you had some pieces of text, say:&lt;br /&gt;&lt;br /&gt;Apr, Aug, Dec, Feb, Jan, Jul, Jun, Mar, May, Nov, Oct, Sep&lt;br /&gt;&lt;br /&gt;And you would prefer to have them sorted in another order, say:&lt;br /&gt;&lt;br /&gt;Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec&lt;br /&gt;&lt;br /&gt;Then we could load this something like:&lt;br /&gt;&lt;br /&gt;Load&lt;br /&gt; Dual(Name, Num) As Month;&lt;br /&gt;LOAD * INLINE [&lt;br /&gt;    Num, Name&lt;br /&gt;    1, Jan&lt;br /&gt;    2, Feb&lt;br /&gt;    3, Mar&lt;br /&gt;    4, Apr&lt;br /&gt;    5, May&lt;br /&gt;    6, Jun&lt;br /&gt;    7, Jul&lt;br /&gt;    8, Aug&lt;br /&gt;    9, Sep&lt;br /&gt;    10, Oct&lt;br /&gt;    11, Nov&lt;br /&gt;    12, Dec&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;And the Month field would be sorted in the correct order.&lt;br /&gt;&lt;br /&gt;If we need to get the component values spearately out of a Dual value, we can use Num and Text:&lt;br /&gt;&lt;br /&gt;  Text(Month) &amp; ' (' &amp; Num(Month) &amp; ')'&lt;br /&gt;&lt;br /&gt;Might give us a result of:&lt;br /&gt;&lt;br /&gt;  Apr (4)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-8350523505293911796?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/8350523505293911796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/using-dual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8350523505293911796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/8350523505293911796'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/using-dual.html' title='Using Dual'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-6212043849111250688</id><published>2009-08-25T14:42:00.006+01:00</published><updated>2009-08-25T14:49:36.305+01:00</updated><title type='text'>Change the Command Centre port in v8.5</title><content type='html'>Thought that I might document this here while I still have an 8.5 server to play with.&lt;br /&gt;&lt;br /&gt;Often, other applications will grab the ports that QVP processes use on your server (e.g. McAfee AV will often use 8081).  To change the QVP ports there are a couple of places that you need to make changes.&lt;br /&gt;&lt;br /&gt;In Program Files\Qlikview\ControlPanel, edit web.config and change the entry:&lt;br /&gt;&lt;br /&gt;   &amp;lt; add key="CommandCenterURL" value="http://localhost:8081/qtcc.asmx"/ &amp;gt;&lt;br /&gt;&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;   &amp;lt; add key="CommandCenterURL" value="http://localhost:8765/qtcc.asmx"/ &amp;gt;&lt;br /&gt;&lt;br /&gt;(I am using 8765 as the example port to change to).&lt;br /&gt;&lt;br /&gt;In Program Files\Qlikview\CommandCenterService, edit QVPublisherCommandCenterService.exe.config and change the entry&lt;br /&gt;&lt;br /&gt;   &amp;lt; add key="WebservicePort" value="8081" / &amp;gt;&lt;br /&gt;&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;   &amp;lt; add key="WebservicePort" value="8765" / &amp;gt;&lt;br /&gt;&lt;br /&gt;Stop and start the services and you should be OK.  You can always test the service on the server by calling the web service:&lt;br /&gt;&lt;br /&gt;   http://localhost:8765/qtcc.asmx&lt;br /&gt;&lt;br /&gt;It should respond:&lt;br /&gt;&lt;br /&gt;CommandCenterService v 2.0.50727.3082 says, "Hello world. The time is: 8/25/2009 14:39:39.8992663". For wsdl, add ?WSDL at the end of the request.&lt;br /&gt;&lt;br /&gt;There are similar processes to change and/or test the other services:&lt;br /&gt;&lt;br /&gt;Execution Service:  http://localhost:8082/qtxs.asmx&lt;br /&gt;&lt;br /&gt;or  http://localhost:8082/debug&lt;br /&gt;&lt;br /&gt;Directory Service: http://localhost:8083/qtds.asmx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-6212043849111250688?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/6212043849111250688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/change-command-centre-port-in-v85.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6212043849111250688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/6212043849111250688'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/change-command-centre-port-in-v85.html' title='Change the Command Centre port in v8.5'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1811486807856358224</id><published>2009-08-20T12:08:00.005+01:00</published><updated>2009-08-20T12:20:42.958+01:00</updated><title type='text'>32bit ODBC/OLEDB on 64bit Server</title><content type='html'>This is something that I see questions about all the time.  The quick answer is that QlikView 64bit cannot use a driver that is compiled for 32bits.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;If I run an application on a 64bit server in 32bit mode, it has access to all the 32bit OLEDB/ODBC drivers.  For example, I have a VBScript that generates OLEDB connection strings.  If I run this using the %sysdir%\SysWOW64\csript.exe (the 32bit version of vbscript), I get the following list of OLEDB drivers:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_8p5AsveJuFw/So0vv5AvxTI/AAAAAAAAAAM/jYNbN-2fufQ/s1600-h/32bitOLEDB.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 255px; height: 320px;" src="http://2.bp.blogspot.com/_8p5AsveJuFw/So0vv5AvxTI/AAAAAAAAAAM/jYNbN-2fufQ/s320/32bitOLEDB.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5372002430327178546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I can see that the Microsoft Jet driver (for Access) is available.&lt;br /&gt;&lt;br /&gt;However, when I run my VBScript application in 64bit mode, I get a different list:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_8p5AsveJuFw/So0wGaFkOyI/AAAAAAAAAAU/yBNCHfBvIbs/s1600-h/64bitOLEDB.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 255px; height: 320px;" src="http://1.bp.blogspot.com/_8p5AsveJuFw/So0wGaFkOyI/AAAAAAAAAAU/yBNCHfBvIbs/s320/64bitOLEDB.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5372002817162885922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No Access driver anymore!&lt;br /&gt;&lt;br /&gt;The Microsoft Access drivers are old and have never been compiled for 64bits.  This means that a 64bit application running on a Windows 64bit server cannot see them or use them.&lt;br /&gt;&lt;br /&gt;QlikView 64bit is not a 32bit application that just runs on a 64bit server, it is an application that is fully compiled to operate in 64bits.  I doesn't even know that the Access driver exists because Windows doesn't tell it about it.&lt;br /&gt;&lt;br /&gt;So, the limitation is not to do with QlikView, it is a limitation of the company who have delivered the driver.&lt;br /&gt;&lt;br /&gt;Luckily, most large database companies (Oracle 10g+, Teradata, Microsoft, etc.) have either OLEDB or ODBC drivers that work in 64bits.&lt;br /&gt;&lt;br /&gt;If you just can't get your hands on a 32bit driver?  Well, you could go down the route of installing 32bit QlikView client on your server (or another server?) and use that in Command Line mode to access the 32bit driver, read the data and store into QVDs that your 64bit publisher can read.  This will of course consume one of your CALs or a developer license, so it is not idea.&lt;br /&gt;&lt;br /&gt;The ideal solution is to see what you can do to get a 64bit version of the driver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1811486807856358224?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1811486807856358224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/32bit-odbcoledb-on-64bit-server.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1811486807856358224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1811486807856358224'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/32bit-odbcoledb-on-64bit-server.html' title='32bit ODBC/OLEDB on 64bit Server'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8p5AsveJuFw/So0vv5AvxTI/AAAAAAAAAAM/jYNbN-2fufQ/s72-c/32bitOLEDB.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-7331408679656136062</id><published>2009-08-19T12:14:00.004+01:00</published><updated>2009-08-19T14:20:32.409+01:00</updated><title type='text'>Google Maps QVW broken</title><content type='html'>The Google Maps example that comes with QlikView 9 has stopped working.&lt;br /&gt;&lt;br /&gt;This is because Google have made a couple of changes.  Luckily, it is resolveable.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Go to http://code.google.com/apis/maps/signup.html and sign up for a Google Maps API key.&lt;br /&gt;&lt;br /&gt;This key, once you receive it, should be put into the document variable, gmap_key (the default value of "xx" will no longer work).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The .jpg that we need to put at the end of the URL so that QlikView knows the result is an image will break the URL because it is currently tagged onto the end of the API key.  We need to add an additional '&amp;' before the '.jpg' so that Google Maps can interpret the values correctly.  It will ignore the "&amp;.jpg" at the end.&lt;br /&gt;&lt;br /&gt; - this appears to work OK (in the Colors tab of the Chart properies - Dynamic Image):&lt;br /&gt;&lt;br /&gt;='http://maps.google.com/staticmap?center='&lt;br /&gt;&amp;&lt;br /&gt;num(var_mid_lat, '##############', '.', ',' ) &lt;br /&gt;&amp;&lt;br /&gt;','&lt;br /&gt;&amp;&lt;br /&gt;num(var_mid_long, '##############', '.', ',' ) &lt;br /&gt;&amp;&lt;br /&gt;'&amp;zoom=$(var_zoom)'&lt;br /&gt;&amp;&lt;br /&gt;'&amp;size='&amp;map_size_x&amp;'x'&amp;map_size_y&lt;br /&gt;&amp;&lt;br /&gt;'&amp;key='&amp;gmap_key &lt;br /&gt;&amp;&lt;br /&gt;'&amp;maptype='&amp;var_maptype&lt;br /&gt;&amp; '&amp;.jpg'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Working fine for me now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-7331408679656136062?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/7331408679656136062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/google-maps-qvw-broken.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7331408679656136062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/7331408679656136062'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/google-maps-qvw-broken.html' title='Google Maps QVW broken'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-5489929199726255512</id><published>2009-08-18T10:29:00.002+01:00</published><updated>2009-08-18T10:40:08.250+01:00</updated><title type='text'>Very Useful YearToDate</title><content type='html'>Many people will have used YearToDate (or Year2Date) to calculate out whether the current date is Year to date for this year, last year, etc.:&lt;br /&gt;&lt;br /&gt;   YearToDate(date_value)&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;   YearToDate(date_value, -1)&lt;br /&gt;&lt;br /&gt;But there are some other values of YearToDate that make it very useful.  The full syntax is:&lt;br /&gt;&lt;br /&gt;   YearToDate( date [ , yearoffset [ , firstmonth [ , todaydate] ] ] )&lt;br /&gt;&lt;br /&gt;The third parameter is very useful because it allows us to use the one function for MonthToDate and QuarterToDate to compare Year-on-Year or dynamically change between YTD, MTD and QTD (there are functions InMonthToDate and InQuarterToDate that could be used but they would require different Year offset calculations and are less easy to make dynamic use of)&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;   YearToDate(date_value, 0, Month(Today()))&lt;br /&gt;&lt;br /&gt;gives us Month to date this year.&lt;br /&gt;&lt;br /&gt;   YearToDate(date_value, -1, Month(Today()))&lt;br /&gt;&lt;br /&gt;gives us Month to date last year.&lt;br /&gt;&lt;br /&gt;With a handy use of the Ceil function, we can also calculate Quarter to date:&lt;br /&gt;&lt;br /&gt;   Ceil(Month(Today())/3) * 3 - 2&lt;br /&gt;&lt;br /&gt;This value will always return the first month of the quarter containing the Month number passed (in this case, Month(Today()) )&lt;br /&gt;&lt;br /&gt;So, plugging this into our YearToDate:&lt;br /&gt;&lt;br /&gt;   YearToDate(date_value, 0, Ceil(Month(Today())/3) * 3 - 2 )&lt;br /&gt;&lt;br /&gt;gives us Quarter to date.&lt;br /&gt;&lt;br /&gt;   YearToDate(date_value, -1, Ceil(Month(Today())/3) * 3 - 2 )&lt;br /&gt;&lt;br /&gt;gives us Quarter to date last year.&lt;br /&gt;&lt;br /&gt;Use of appropriate variables means that we can give the user a very useful dynamic swap between YTD, QTD and MTD - if that is required.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-5489929199726255512?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/5489929199726255512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/very-useful-yeartodate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5489929199726255512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/5489929199726255512'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/very-useful-yeartodate.html' title='Very Useful YearToDate'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4860500237200879015</id><published>2009-08-18T10:07:00.002+01:00</published><updated>2009-08-18T10:26:26.058+01:00</updated><title type='text'>"=" sign in the expression builder</title><content type='html'>There is a very simple explanation for using the "=" sign in the expression builder - it tells QlikView to evaluate everything after the "=" and return the result.&lt;br /&gt;&lt;br /&gt;Where there is some confusion is that within charts (and, in successive versions it has been removed in other places) the "=" is not necessary because it is assumed - you wouldn't put an expression in a chart unless you wanted it to be evaluated, would you?&lt;br /&gt;&lt;br /&gt;In a text box, the need for the "=" becomes more apparent.  If I add a Text Box to my layout and set the text expression to:&lt;br /&gt;&lt;br /&gt;   Sum(Sales)&lt;br /&gt;&lt;br /&gt;Then the Text Box will come to the screen and have a value of "Sum(Sales)".  This makes sense because the default interpretation of a Text Box should be that the values in the expression are just text.  Now, if I add the "=" into the expression:&lt;br /&gt;&lt;br /&gt;   =Sum(Sales)&lt;br /&gt;&lt;br /&gt;Then the calculation is performed and the result, the sum of all sales based on current selections in the document, is displayed in the Text Box.&lt;br /&gt;&lt;br /&gt;It becomes more interesting when we use, or do not use, the "=" in a variable.&lt;br /&gt;&lt;br /&gt;For example, if I set up 2 variables, vSales and vTotalSales.  &lt;br /&gt;&lt;br /&gt;vSales is going to have a value set up in the Expression Builder of:&lt;br /&gt;&lt;br /&gt;   Sum(Sales)&lt;br /&gt;&lt;br /&gt;vTotalSales is going to have a value set up in the Builder of:&lt;br /&gt;&lt;br /&gt;   =Sum(Sales)&lt;br /&gt;&lt;br /&gt;Now, if I set up a straight table and add a dimension, say "Year", and then add 2 expressions - one that is just $(vSales) and the other is $(vTotalSales), then the first column will show sales by Year and the second will show the same value in each row - the total sales for the document.&lt;br /&gt;&lt;br /&gt;This happens because the first variable is simply a piece of text - "Sum(Sales)" - that is replaced into the chart expression and evaluated against each dimension.  The "=" in the second variable causes it to be evaluated at the document level and it is the result rather than the expression that is inserted into the chart.&lt;br /&gt;&lt;br /&gt;The "=" is also interesting in Dollar Expansion.  We could achieve the same result as vTotalSales in the chart by using the expression:&lt;br /&gt;&lt;br /&gt;   $(=Sum(Sales))&lt;br /&gt;&lt;br /&gt;This Sum(Sales) is now calculated outside the chart - i.e. at the document level - and the result, not the expression, is returned to the chart.&lt;br /&gt;&lt;br /&gt;Knowing about the "=" sign in Expression Builder is very useful to avoid confusion and also to give you a new weapon in your arsenal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4860500237200879015?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4860500237200879015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/sign-in-expression-builder.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4860500237200879015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4860500237200879015'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/sign-in-expression-builder.html' title='&quot;=&quot; sign in the expression builder'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-3436536519343239231</id><published>2009-08-14T14:23:00.002+01:00</published><updated>2009-08-14T14:25:22.347+01:00</updated><title type='text'>Section Access Gotcha's</title><content type='html'>Couple of things that can cause you problems in Section Access:&lt;br /&gt;&lt;br /&gt;-  Loading Null values into the USERID field.  You won't get back into your document!&lt;br /&gt;&lt;br /&gt;-  Loading mixed/lower case values into USERID and PASSWORD.  Although they are not case sensitive for users entering them, they must be loaded in CAPITALS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-3436536519343239231?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/3436536519343239231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/section-access-gotchas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3436536519343239231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/3436536519343239231'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/section-access-gotchas.html' title='Section Access Gotcha&apos;s'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-2062584978708159070</id><published>2009-08-10T16:06:00.005+01:00</published><updated>2009-08-10T16:37:16.382+01:00</updated><title type='text'>Sets =- or -=???</title><content type='html'>This question arose recently:&lt;br /&gt;&lt;br /&gt;Note:  Using gt and lt for Greater Than and Less Than symbols - sorry.&lt;br /&gt;&lt;br /&gt;What is the difference between the set &lt;span style="font-family:courier new;"&gt;{ lt Value = -{"X"} gt }&lt;/span&gt; and the set &lt;span style="font-family:courier new;"&gt;{ lt Value -= {"X"} gt }&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;Well the difference is that the first set is a modification of the $ set and saying that I want all values of the "Value" field excluding the value "X" (it could have also been written as &lt;span style="font-family:courier new;"&gt;{ lt Value = {*}-{"X"} gt &lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;The second set is different in that it is additive (or actually subtractive) - it will take whatever selections are on the "Value" field and take off the "X".&lt;br /&gt;&lt;br /&gt;So, for the first one, if you make any selections on the "Value" field, they will be ignored. For the second one, your selections will be reflected in the result except if "X" is part of your selections it will be excluded.&lt;br /&gt;&lt;br /&gt;As an example, take the following dataset:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;em&gt;Sales:&lt;/em&gt;&lt;br /&gt;Load * Inline [&lt;br /&gt;User, Sales&lt;br /&gt;John, 12222&lt;br /&gt;Tom, 11000&lt;br /&gt;Jane, 19000&lt;br /&gt;May, 21000&lt;br /&gt;Graham, 13300&lt;br /&gt;];&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If I create a straight table with User as the dimension and the following 2 expressions:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Sum({ lt User = -{"John"} gt  Sales)&lt;br /&gt;&lt;br /&gt;Sum({ lt User -= {"John"} gt  Sales)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Then whatever selection I make on User will not effect the result - the chart will list the sales for Time, Jane, May and Graham (no John). For the second, if I make selections on a user, the other users will zero out but I will still see no John.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-2062584978708159070?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/2062584978708159070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/sets-or.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2062584978708159070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/2062584978708159070'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/sets-or.html' title='Sets =- or -=???'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-4181662742223629563</id><published>2009-08-10T12:41:00.001+01:00</published><updated>2009-08-10T12:46:02.693+01:00</updated><title type='text'>Days360</title><content type='html'>Recently a client asked me about the Excel function Days360. This is a commonly used function within the financial industry to calculate the number of days between two dates based on a 360 day year - i.e. 12 x 30day months.&lt;br /&gt;&lt;br /&gt;The function in Excel takes 2 mandatory parameters and 1 optional parameter:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DAYS360(start_date,end_date,method) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If the "method" parameter is FALSE or left out, then it uses the US (NASD) method. If it is TRUE then it uses the European method. The difference is that in the European method if either the start or end date are on the 31st of the month, they are considered to be on the 30th of the month.&lt;br /&gt;&lt;br /&gt;I have a simple VBScript function that replicates this functionality:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Function Days360(StartDate, EndDate, European)&lt;br /&gt;&lt;br /&gt;Dim Days1, Days2&lt;br /&gt;Days1 = Day(EndDate)&lt;br /&gt;Days2 = Day(StartDate)&lt;br /&gt;&lt;br /&gt;If European and Days1 = 31 Then Days1 = 30&lt;br /&gt;If European and Days2 = 31 Then Days2 = 30&lt;br /&gt;&lt;br /&gt;Days360 = DATEDIFF("m", StartDate, EndDate) * 30 + Days1 - Days2&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Unfortunately VBScript doesn't have a MIN function or this could be reduced to be even simpler.&lt;br /&gt;&lt;br /&gt;Now, if I define ths VBScript function in my QV Document, I can call it from within the load script in a QlikView application. Since version 8.2 though, I am unable to call macro functions from the chart so I have to have a different solution.&lt;br /&gt;&lt;br /&gt;Oleg Troyansky gave a good formula for the month difference: http://community.qlikview.com/forums/p/9923/39894.aspx#39894&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;MonthDiff = (year(Date1)*12 + Month(Date1)) - (year(Date2)*12 + Month(Date2)) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This works great for me. So, I now just need to add the days subtraction. This needs to be two separate functions, one for US and one for Europe.&lt;br /&gt;&lt;br /&gt;US:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;=(((YEAR(Date2)*12 + MONTH(Date2)) - (YEAR(Date1)*12 + MONTH(Date1))) * 30) + DAY(Date2) - DAY(Date1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Europe (using the Nummin function to step back a 31st to 30th):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;=(((YEAR(Date2)*12 + MONTH(Date2)) - (YEAR(Date1)*12 + MONTH(Date1))) * 30) + Nummin(DAY(Date2),30) - Nummin(DAY(Date1),30)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope that this helps others get past this one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is worth remembering. No matter what function that you come across that doesn't exist in QlikView, it has to be calcuable some way - and probably is do-able within QlikView.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-4181662742223629563?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/4181662742223629563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/days360.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4181662742223629563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/4181662742223629563'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/days360.html' title='Days360'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2268159193748171866.post-1961004357915935480</id><published>2009-08-10T12:18:00.002+01:00</published><updated>2009-08-10T12:40:50.065+01:00</updated><title type='text'>Does it exist?</title><content type='html'>In QlikView, we have the option to check if a value is already in a field using the "Exists" clause. I have seen some confusion with it over time, so hopefully this will help.&lt;br /&gt;&lt;br /&gt;Exists is an inter-record function that we can use within the load script to check for the existence of a value in a previously loaded field.&lt;br /&gt;&lt;br /&gt;The syntax is as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exists(field [, expression])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The field is a field that already exists in our document - which includes any fields in the current load statement.&lt;br /&gt;&lt;br /&gt;The expression is a calculation based on the data that we are currently loading.&lt;br /&gt;&lt;br /&gt;Note that expression is not a required field. If it is excluded, exists calculates if the value of the field exists in any previous loaded value for that field.&lt;br /&gt;&lt;br /&gt;Here is a simple example of using Exists to only load data that exists in a previously loaded field.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Budget:&lt;br /&gt;Load * Inline [&lt;br /&gt;User, Budget&lt;br /&gt;Tom, 10000&lt;br /&gt;Jane, 20000&lt;br /&gt;May, 22000&lt;br /&gt;Graham, 12300&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;Sales:&lt;br /&gt;Load * Inline [&lt;br /&gt;User, Sales&lt;br /&gt;Tom, 11000&lt;br /&gt;Jane, 19000&lt;br /&gt;May, 21000&lt;br /&gt;Graham, 13300&lt;br /&gt;John, 23456&lt;br /&gt;]&lt;br /&gt;Where Exists(User);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The first load statement loads budget information for users Tom, Jane, May and Graham. The second load statement brings in the sales values for users but we state that we only want values for users already exist.&lt;br /&gt;&lt;br /&gt;In this case, no values will be loaded for John.&lt;br /&gt;&lt;br /&gt;Here, we didn't need to pass an expression (although we could have done Exists(User,User)) because we were looking for a value in the same field that was being loaded.&lt;br /&gt;&lt;br /&gt;Here is another example of a similar sales loader:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Sales:&lt;br /&gt;Load&lt;br /&gt;RowNo() As row,&lt;br /&gt;User,&lt;br /&gt;Sales,&lt;br /&gt;If(Exists(User,User), 1, 0) As Exists&lt;br /&gt;;&lt;br /&gt;Load * Inline [&lt;br /&gt;User, Sales&lt;br /&gt;John, 12222&lt;br /&gt;Tom, 11000&lt;br /&gt;Jane, 19000&lt;br /&gt;May, 21000&lt;br /&gt;Graham, 13300&lt;br /&gt;John, 23456&lt;br /&gt;];&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If we now put a table of values for row, user and exists, we would see that John in Row 1 has a 0 for exists and in row 6 he has a 1.  This shows us that Exists is working on data that is loading in the current load statement also, not just on data that has been loaded before.&lt;br /&gt;&lt;br /&gt;The Expression parameter of the Exists statement is very useful - especially if you have complex keys in an Load.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2268159193748171866-1961004357915935480?l=qliktips.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qliktips.blogspot.com/feeds/1961004357915935480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://qliktips.blogspot.com/2009/08/does-it-exist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1961004357915935480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2268159193748171866/posts/default/1961004357915935480'/><link rel='alternate' type='text/html' href='http://qliktips.blogspot.com/2009/08/does-it-exist.html' title='Does it exist?'/><author><name>Stephen Redmond</name><uri>http://www.blogger.com/profile/10815476951939159307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-GjwuXea5vo0/TWvq2o3w6aI/AAAAAAAAABc/x6eB-6VxeAs/s220/Me2.jpg'/></author><thr:total>0</thr:total></entry></feed>
