Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
If you are new to the Qlik Community or are just looking for a How-To, below is a directory with direct links to some helpful articles:
...
If you are new to the Qlik Community or are just looking for a How-To, below is a directory with direct links to some helpful articles:
Also, check out the Help page.
Hi All,
This is the collection of Incremental Load in Qlikview.
Hope this will help you.
Thank you.
Script for Incremental Loading of Multiple QVDs from a List of Table Names
Incremental Load Scenarios.pdf
incremental load issue while executing
Different Ways to load data in qlikview
...Hi All,
This is the collection of Incremental Load in Qlikview.
Hope this will help you.
Thank you.
Script for Incremental Loading of Multiple QVDs from a List of Table Names
Incremental Load Scenarios.pdf
incremental load issue while executing
Different Ways to load data in qlikview
Partial Reload Easy and Simple
Switch Between Full Load And Incremental Load
Re: Incremental Load in Script
Concatenate Incremental logic for Deleted records
In december 2021 I posted one Visualization tip for Qlik Sense per day until Christmas Eve.
Here's the app with more details for each tip.
If you liked it, here's more in the same style:
Thanks,
Patric
Hi All,
As we all know Qlik Analytical Platform is quite new in market. People are still in confusion as what QAP is, how it is different than Qlik Sense Enterprise. How to configure QAP Server, Manage QAP and especially what exactly the output of
...Hi All,
As we all know Qlik Analytical Platform is quite new in market. People are still in confusion as what QAP is, how it is different than Qlik Sense Enterprise. How to configure QAP Server, Manage QAP and especially what exactly the output of QAP. There are lots of tickets which give you chunk of information like difference between QAP and Qlik Sense Enterprise, how to reload on QAP server when there is no HUB under QAP but there is nowhere how to configure a QAP solution from scratch to end with details.
This document guide you to know what QAP is , how it is different than QSE, setup QAP Server, create and publish Mashup(Embed Analytics ) a, manage QAP Objects and reload application on QAP when there is no HUB at all.
Question: Why Qlik Sense client needs QAP ?
Answer:
QAP setup needs knowledge of Qlik Sense Enterprise (server configuration with security rules) and web developer skills (css and java script and basic HTML) who will help you to embed Qlik Object to web portal.
I have attached one QAP product presentation, you may start with it then below tutorial video so you have enough functional knowledge of product.
Important video tutorial of QAP:
Let’s start from beginning:
Difference b/w Qlik Sense Enterprise and Qlik Analytical Platform:
In principle QAP and QSE is same but in general QAP is subset of QSE means QSE without HUB(No Self Service). QAP is a solution of embed analytics. If no self service is there in QAP it means no "create things" but still developers can create visuals by APIs.
Https://HostName/hub you can view the application but when you open it, it will give you an error you don't have access pass, it means you can't view any apps object on hub.
QAP enables you to display sheet or charts into your website.
Commercial difference, QAP has core based license model unlike QSE which has token based license model (It means no user and login passes, which means you just need to grant the access to users or authorized users to the content which is embedded in web portal )
Recently Qlik introduced core bases license for self service too.
QAP is intended for using our APIs (Extensions, Mashups etc.) to deploy custom solutions.
The Qlik Sense client is disabled in QAP (when you will login to hub you would view the streams and apps but when you will click on any app, it will give you error of access passes).
It has same installation package as QES but applying a QAP license key will disable hub it means you can view the hub, streams list, and application icons but apps objects like sheet, charts, measures and dimensions will not open on HUB. It will give you an error, you hve no access passes.
QAP license policy: when a client buys a QAP token, it comes with minimum 4 cores, it means no matter how many cores or virtual processors are available on deployment server, it will only consume or utilize 4 core among all available cores. So, let’s say client's server has 8 cores or 16 logical processors on Qlik Sense Enterprise server and your application size is 1 GB and you are planning to use same application on QAP, So when you import this application to QAP, It will not work as it works on QSE sever cause QAP(as per the license capacity) will consume only 4 cores out 8 cores and your 1 GB application need 8 cores to perform or load objects like QSE.
Note: Do not be confused, what will happen when you will activate the Qlik Server with QAP license, you will get everything same i.e. QMC as Qlik Sense Enterprise but there will be no Tokens means you can't create any user or login pass which we use to authorize users to access the Qlik Sense content.
To implement QAP server, configured it security with custom properties so you would manage security of data for users with
https://community.qlik.com/docs/DOC-18066
These 9 points will create a stream, import the application and publish the application to the newly created stream and grant access to application and app objects.
Try to use Dev-Hub to view the object i.e single configurator.
Now, we will add one more new security rule which will grant all the users to access the APIs like extensions, mashups, Widget, Single configurator.
***You may create one new custom property QAPExtension with resource type Extension and User and the create a new security rule with Extension Template and write a security rule as:
((User.@QAPExtension=resource.@QAPExtension))
Then go to the extension by Click one start => Extensions => select your extension(Mashup) => go to custom properties and click on the Space bar and select the value you have given while creating Custom properties do the same exercise for users too .
Now, we don’t need to create any custom property because QAP is for all users (no limit) above activity started with *** is when you created a mashup and then you need to provide access of some particular Extension(Mashup) to any specific users.
So, for QAP, write a simple security rule as with template Extension:
((user.name="*" or resource.name="*"))
Which means all user will access the all the APIs (extensions, mashups, Widget, Single configurator).
Often, People ask what if my client hasn't any web portal so in that case above Mashup solution will work, Mashup is kind of website(.html file) or web solution.
This is best with Qlik comes Sense as we can create a HTML page with our Qlik Objects so easily(Basic HTML and JS and CSS knowledge requires).
Now point comes, if all user will come how to secure the data, here comes the real QAP solution,
Generally what QAP says, create an application on Qlik Enterprise or Desktop, import on the QAP server and publish its Objects to client website (Mashup is a HTML page but it’s not a web portal).
So above, you have imported an application, created stream, published application, granted access to all users. What is left now, go to single configurator, select one object, there will be two links come on top side, Iframe and URL, Copy anyone and go to the website page where you need to show these objects and paste it(Please take the help of web developer because every object needs a proper space and alignment).
If any user who is not authorized to view Qlik objects but has rights to login web portal where Qlik Sense objects embedded then it will show an error, so you may ask your web designer to handle this case and put any image instead of INVALID OBJECT message from Qlik Sense.
Now when any user will come it will see an error, access denied or ask for credentials , so You may configure the single sign on here ,Please refer the very useful document for single sign on :
Last Point, how to manage the QAP server application. I mean, reload and all. So, You can’t open any application on QAP HUB and there will be no script editor so how to reload if you have imported the application from Qlik sense enterprise:
If you have imported the apps from another Qlik Sense Server the required data connections are unfortunately not imported together with the qvf-file. That is probably why the tasks fail since the data connections are missing. Check in QMC > Data Connections if they are there and if they are properly set up.
Please refer this article to reload data in QAP: https://qliksupport.force.com/articles/000025412
” When you import an app developed on Qlik Sense Desktop, existing data connections are imported to the QMC. When you export an app from a server, existing data connections are not exported with the app.”
Since the QAP is a Qlik Sense-server without the "hub" and aimed for integration purposes only you have to find a way to import the data connections into the QAP QMC for reloads to work. One way could be to create an empty app in Qlik Sense Desktop with the required data connections and then import this qvf into the QAP. Then you can manage and set up the imported data connections properly in the QAP QMC.
Reach to me for further assistance, Please drop an email to kumar.rohit1609@gmail.com
Add me on Linked In : https://in.linkedin.com/pub/rohit-kumar/2b/a15/67b
Add yourself on Qlik intellectuals page on Facebook at https://www.facebook.com/QlikIntellectuals
Please like this page or add as bookmark and add your ratings so my I will know how effective my solution is for Qlik Users.
You may add your queries below so I would come up with solution. I will try to keep update this document with more powerful inputs. Your queries and inputs will help me to improve the quality of this solution. The aim is to make a perfect document which will guide you to a perfect solution.
At Qlik Connect 2025 I hosted a session called "Top 10 Visualization tips". Here's the app I used with all tips including test data.
Tip titles, more details in app:
At Qlik Connect 2025 I hosted a session called "Top 10 Visualization tips". Here's the app I used with all tips including test data.
Tip titles, more details in app:
I want to emphasize that many of the tips were discovered by others than me, I tried to credit the original author at all places when possible.
If you liked it, here's more in the same style:
Thanks,
Patric
Monitoring current performance and availability of Qlik Sense site is not out-of-the-box feature, but can be easily achieved with native REST connector and requesting engine\healthcheck JSON API.
There are other tools and approaches, but since I alrea
...Monitoring current performance and availability of Qlik Sense site is not out-of-the-box feature, but can be easily achieved with native REST connector and requesting engine\healthcheck JSON API.
There are other tools and approaches, but since I already have the best BI tool available 😉, I found it reasonable to use it. All that is necessary is just:
This Qlik Sense app:
It's recommended to deploy and schedule this app on DEV or TEST site, pointing to all production nodes. Otherwise, there will be no data loaded in case the production engine (or the whole server) crashes.
(just FYI - DEV and TEST sites are included in the professional license subscription)
It's also recommended to read the official help site info about the engine API before you deploy this app.
After importing the app to a suitable site, follow these steps:
1. Decide on target folder for result QVD files, where parsed snapshot of JSON data will be stored. Create a folder Data Connection (if it doesn’t already exist) and set its Lib name to vQVDpath variable in Settings script section.
2. Create a REST Data Connection to each node:
URL: https://<server domain>/engine/healthcheck OR https://<node IP address>:4747/engine/healthcheck
Authentication Schema: Windows NTLM
User name & password: type root admin or service user credentials
check "Skip server certificate validation" if there is no valid certificate on target node
Query headers:
User-Agent: Windows
Cache-Control: no-cache
3. Adjust the INLINE table in the Settings section of the script according to your site
node - name of the node that will be shown for app’s user
restConnection - name of the REST connection that points to node’s engine/healthcheck
RAM - amount of node's memory in GB
CPU - number of node's logical processors
4. Schedule a reload task. The recommended app reload frequency is 5 minutes or less (tested reload duration on the 4-node site is 12 seconds). The script will return "N/A" in [isSaturated] field when the engine is not responding.
The current roadmap includes - script for email notifications, possibility to load only N days back, mapping app name to IDs, node comparisons.
PLEASE! If you make adjustments or additions to the script or front-end visualizations, please share them back on the Qlik Community.
Happy Qliking 🙂
-RADO-
Have you ever wanted to create a Scatter chart or Bubble chart in QlikView, only to find that it was more complicated than you thought? Then you should look at this document that contains some example files for making this type of chart and instructi
...Have you ever wanted to create a Scatter chart or Bubble chart in QlikView, only to find that it was more complicated than you thought? Then you should look at this document that contains some example files for making this type of chart and instructions on how to do it.
When I created these files, I was inspired by Hans Rosling: Stats that reshape your worldview. Very inspiring. If you haven’t looked at this lecture, I strongly recommend that you do. It is not new – but it is still very relevant.
It very clearly shows the importance of real data and its use to refute misconceptions: You cannot always trust your preconceived notions – instead you need real data and a good data discovery tool to make intelligent decisions.
The statistics in the attached files are fetched from United Nations data (http://data.un.org/).
Prologue...
Firstly I would like to say that probably it would be easier to call this function Horizontal Dimensionality (or HDim or even SecDim)
This could clear some clouds - when you first see this function you may feel that this another level for d
...Prologue...
Firstly I would like to say that probably it would be easier to call this function Horizontal Dimensionality (or HDim or even SecDim)
This could clear some clouds - when you first see this function you may feel that this another level for dimensionality function.
(for those who wants to know more about the dimensionality function please see this document
What it is used for?
Returns the number of dimension pivot table rows that have non-aggregation content. i.e. do not contain partial sums or collapsed aggregates. This function is the equivalent of the dimensionality function for horizontal pivot table dimensions.
The secondarydimensionality() function always returns 0 when used outside of pivot tables.
What does it mean?
Where dimensionality shows number of vertical dimensions, secondarydimensionality shows number of horizontal dimensions.
Lets take our sample data.
![]() |
We have four dimensions(columns):
Product,Category,Type and Sales.
Each Product have 2 Categories
Each Category can have up to 3 Types
Let's create Pivot Table using 3 of those Dimension Product,Category and Type and use Sales as our Expression.
![]() |
This Pivot Table has 3 dimensions so its maximum dimensionality is 3.
'Sugar' has dimensionality of 1 which is Total for that 'Product'.
'Salt' has dimensionality of 2 which is Total for each 'Category' of that 'Product'.
'Oil' has dimensionality of 3 which is single value for each 'Type' of the 'Product's' 'Category'
So in few words : secondarydimensionality (and dimensionality) is the number of dimensions used in a Table
For better understating please see table below:
The function is used to show on which dimensionality level each of the Pivot Table row is:
![]() |
Practical use:
1) To show the level of dimensionality:

Expression:
if(secondaryDimensionality()=1,RGB(151,255,255),if(secondaryDimensionality()=2,RGB(0,238,0),
if(secondaryDimensionality()=3,RGB(255,130,171))))

2) Highlight background of rows which on each level fall into certain condition:
Expression:
if(Dimensionality()=1 and sum(Sales)<150,RGB(151,255,255),if(Dimensionality()=2 and sum(Sales)<=20,RGB(0,238,0),if(Dimensionality()=3 and Sum(Sales)<=20,RGB(255,130,171))))
| LEVEL 1 --> Values <35 | LEVEL 2 --> Values <=15 | LEVEL 3 --> Values <=20 |
|---|---|---|
![]() | ![]() | ![]() |
Otherwise you will need to make changes the this path - secondarydimensionality.xlsx
Directory;
LOAD Product,
Category,
Type,
Sales
FROM
secondarydimensionality.xlsx
(ooxml, embedded labels, table is Sheet1);
Still feeling hungry?
Do you Qualify?- How to use QUALIFY statement
Missing Manual - GetFieldSelections() + Bonus Example
MaxString & MinString - How to + examples
The second dimension... or how to use secondarydimensionality()
Have you ever wondered how the examples from the Qlikview help may look like?
Please see below and enjoy responsibly...
Valueloop() & VaueList()
Both of those functions belong to Synthetic Dimension Functions.
Synthetic Dimension is a type of Calcula
...Have you ever wondered how the examples from the Qlikview help may look like?
Please see below and enjoy responsibly...
Valueloop() & VaueList()
Both of those functions belong to Synthetic Dimension Functions.
Synthetic Dimension is a type of Calculated Dimension
- the difference between "standard" Calculated Dimension and Synthetic one is that
the standard dimensions are based on values from existing fields
whereas for Synthetic Dimensions those values are created "on the fly".
The drawback here is that you can not mix standard dimensions with synthetic in the way you would expect.
(please see "Practical use").
ValueLoop()
Used:
Back End -No
Front End - Yes

Description(Qlikview Help)
Returns a set of iterated values which, when used in a calculated dimension, will form a synthetic dimension.
The values generated will start with the from value and end with the to value including intermediate values in increments of step. In charts with a synthetic dimension created with the valueloop function it is possible to reference the dimension value corresponding to a specific expression cell by restating the valuloop function with the same parameters in the chart expression. The function may of course be used anywhere in the layout, but apart from when used for synthetic dimensions it will only be meaningful inside an aggregation function
![]()
Create series of numbers in a range given by criteria.

from - first value
to - last value
step - intermediate values criteria.
When step is missing 1 is assumed
Qlikview help examples are very straightforwards and easy to understand:
| Example 1 | Example 2 | Example 3 |
|---|---|---|
valueloop ( 1, 3 ) From 1 to 3, (step is omitted so 1 is assumed): | valueloop ( 1, 5, 2 ) From 1 to 5, step 2: 1,1+2=3,3+2=5 | valueloop ( 11 ) returns the value 11 |
![]() | ![]() | ![]() |
Practical use
Example 1
If you need to provide calculations to check if the MOD of values from 0 to 100 with step 5 is divided by 10 without remainder
Create Dimension: ValueLoop(0,100,5)
and Expression: if(mod(ValueLoop(0,100,5),10)=0,'OK', 'No OK')

See also:
How to create a Square Pie Chart
or
qlikfreak.wordpress.com/2014/06/17/infographics-in-qlikview-vol-2/
ValueList()
Used:
Back End -No
Front End - Yes

Description(Qlikview Help)
Returns a set of listed values which, when used in a calculated dimension,
will form a synthetic dimension. In charts with a synthetic dimension created with the valuelist function it is possible to reference the dimension value corresponding to a specific expression cell by restating the valuelist function with the same parameters in the chart expression. The function may of course be used anywhere in the layout, but apart from when used for synthetic dimensions it will only be meaningful inside an aggregation function
![]()
Create series of values from given list

v1 - list of values
Again, both of those examples are very easy to understand:
| Header 1 | Header 2 |
|---|---|
| valuelist ( 1, 10, 100 ) | ![]() |
| Header 1 | Header 2 |
|---|---|
| valuelist ( 'a', 'xyz', 55 ) | ![]() |
Practical use
Data Model
LOAD Date,
Year(Date) as Year,
Values
inline [
Date, Values
01/01/2009, 1
11/04/2009, 2
20/07/2009, 2
28/10/2009, 2
05/02/2010, 2
16/05/2010, 2
24/08/2010, 1
02/12/2010, 1
]
The usual way of creating straight table is be to add Year as Dimension and sum(Values) as expression.
This will return value for each Year.
![2015-08-25 00_38_57-QlikView Personal Edition - [C__Users_Katarzyna_Desktop_Files_vpl.qvw_].png](/legacyfs/online/96861_2015-08-25 00_38_57-QlikView Personal Edition - [C__Users_Katarzyna_Desktop_Files_vpl.qvw_].png)
But if we want o use Synthetic Dimension in the same way this will return only one Total value for both years.
![2015-08-25 00_47_25-Chart Properties [Sum(Values)].png](/legacyfs/online/96862_2015-08-25 00_47_25-Chart Properties [Sum(Values)].png)
One of the way to use this function is to create list (similar to Statistics Box) with your own KPI's:
![2015-08-25 23_10_09-Chart Properties [1.625].png](/legacyfs/online/96974_2015-08-25 23_10_09-Chart Properties [1.625].png)
and then use nested IF statement to create your Metrics

=if(ValueList('Sum','Count','Average')='Sum',Sum(Values),
if(ValueList('Sum','Count','Average')='Count',Count(Values),Avg(Values)))
to get below result:

As nesting IF's can be tricky and cumbersome beyond 2 or 3 criteria we can use Pick/Match functions to improve our calculations:
=pick(match(ValueList('Sum','Count','Average'),'Sum','Count','Average')
,Sum(Values),Count(Values),Avg(Values))

Conclusion:
Although both of those function are not very often used
(they did not make to final 30 of rwunderlich survey
you can find a practical way of using them.
Feeling Qlikngry?
Ok, here's another batch of tips when building visualizations in Qlik Sense. It's a mix of recipes for new charts and tips for app development. Content as follows, full descriptions and demos in the app below.
Charts
Ok, here's another batch of tips when building visualizations in Qlik Sense. It's a mix of recipes for new charts and tips for app development. Content as follows, full descriptions and demos in the app below.
Charts
Tips
I want to emphasize that many of the tips are invented by others than me, I tried to credit the original author at all places when possible, the app below can be viewed as my current top picks.
If you liked it, here's more in the same style:
Thanks,
Patric
I like mathematics and see the potential it is not only in robotics or “almost sci-fi” technologies but everywhere where data is generated and should be understood.
I like Qlik, its possibilities and simplicity for end-users at the same time.
However,
...I like mathematics and see the potential it is not only in robotics or “almost sci-fi” technologies but everywhere where data is generated and should be understood.
I like Qlik, its possibilities and simplicity for end-users at the same time.
However, when it comes to mathematics and Qlik together, a lot of people think about SSEs – python or R – and default Qlik math functions are underestimated. I think there might be two reasons – Qlik users do not know about them or do not understand when these functions can help them. So, I decided to develop a Qlik app that will get you an overview of default mathematical functions in Qlik with a little bit of theory and above all, examples and exercises. All of them are interactive – thanks to Qlik 😉.
In the QS Math & Statistics app v3.0 you can find:
If you will find the app useful, in next versions I will add:
Thanks, @radoresky for your help and review of the app
I hope you will like it. Any recommendations are very welcome 😉,
Maria
Hi,
Please find attached Qlikview document for implementing chart level access by user. You can open the Qlikview file by using users A, B, C and D. There is no Password for this file.
When you login as user A you can access both charts (CH01 a
...Hi,
Please find attached Qlikview document for implementing chart level access by user. You can open the Qlikview file by using users A, B, C and D. There is no Password for this file.
When you login as user A you can access both charts (CH01 and CH02).
When you login as user B you can access only one chart (CH01).
When you login as user C you can access only one chart (CH02).
When you login as user D you can access both charts (CH01 and CH02).
This is implemented by using Chart Properties -> Layout -> Show -> Conditional.
The charts and users are configured using ChartAccessMatrix table. Refer below script for implementation.
Section Access;
LOAD * INLINE [
ACCESS, USERID
Admin, A
User, B
User, C
USer, D
];
Section Application;
ChartAccessMatrix:
LOAD * INLINE [
USERID, CH01, CH02
A,1,1
B,1,0
C,0,1
D,1,1];
Regards,
Jagan.
Aside from filtering data records with Section Access, I'm usually requested to filter the objects and sheets to which users have access. To be honest, I don't like to filter individual objects since this implies a lot of mainteinance and a more com
...Aside from filtering data records with Section Access, I'm usually requested to filter the objects and sheets to which users have access. To be honest, I don't like to filter individual objects since this implies a lot of mainteinance and a more complex Section Access table. So I usually describe the scenario to the IT people and Key users and they always ( so far ) decide to go for the Sheets-Security option. Which in my opinion is the best alternative because it's more common to hide a complete block of information/analysis from a user than just a single KPI.
I've seen some examples like this before in the Community, however everything I've found its exemplified based on the USERID field. So, when I tried to use those examples I ran into some common errors when dealing with Section Access, and now that I've solved them I want to share a small example about how to go when using NTNAME.
Also, I want to note that there are some easier/faster alternatives to this approach. For instance you may use the MATCH() method described in this thread: Secured sheets
However if you're already using Section Access to filter data, you have too many users and/or sheets to use the MATCH() method, or if you just need to handle those privileges outside of the .qvw ( e.g. a user will maintain an excel file), you can use/reuse Section Access to accomplish this requirement.
In my example I use INLINE loads in order to allow other people to reload the app, however you could load all tables, including the SECTION ACCESS table, from xls or qvd files.
So, in order to test this example you have to do the following:
Go to the following link to get the example file:
Sheets Security with Section Access File
I hope this example is useful and don't hesitate to ask if you have any doubt regarding it.
<Part of http://integration.qlik.com/ and created together with raymond Neves>
Table of Contents
<Part of http://integration.qlik.com/ and created together with raymond Neves>
Table of Contents
Introduction
In OEM software integration cases, users and their authorizations are stored usually in a SQL table and the OEM website already does the authentication step. So the key thing we have to explain you in this article is how do we transfer the user and his rights to Qlik Sense? The short answer is: We usually do this by using a ticket (token based) mechanism. This ticket can be seen as a passport for the user. It contains his userId, and the groups/roles which define his authorizations.
Make sure you check the introduction and extended security videos first.
Authentication
Before you can use the Qlik Sense system, in most cases you want to know who the user is, we call this authentication. The next step is that based on this userId you want to assign the user access rights, we call this authorization. Both developers and users communicate with Sense via the Proxy (see this as a webserver which performs the authentication step: who are you?). For each type of authentication we can create a virtual proxy. So normally we would create a virtual proxy for each authentication mechansim your company needs:
Authorization using the security rules
After the authentication (who are you?) you need to think how you want to integrate the authorization (what can you do and see?). The keys you want to protect in Sense are called resources. Example resources are
There is no mandatory structure you have to follow in Sense. We have designed a very flexible approach in which each "thing" in Sense is a resource. And if you want to "use" it you need to have a "key" that allows you to access that resource. In Sense we protect the resources above with security rules, and it has the following logic:
| In other words:
Example Admin 1
Example End user 1
|
In most OEM cases we give each customer its own stream, and therefore we create a rule like this to split the customers in the system

Lets illustrate this with the example of a city (a Sense server), it consists of
Most people can only enter 1 house and all rooms. But in order to arrive at your room, you will have to drive though your street, open the house and enter your room. And that is exactly the same way with an OEM security setup in Sense.
SaaS security setup
Most times you have a SaaS solution with a lot of customers in 1 system. You want to divide this. So, we start with giving each customer its own stream, and once you have access to the stream you are allowed to view all apps. Of course we can limit the access to apps and even sheets, the script and database connections. This is possible because everything is a resource is Sense. And before a user can access a resource he needs at least one security rule that evaluates to true for the action he would like to do (read, update, publish).
Minimum requirements of the security rule
Back to our example of the street and the houses:
You always need access to a stream before you can open the app, or view the resources inside an app:
Import to remember: If you want to see a chart, you always need to create one or more security rules that together provide access to all the above resources. (stream, app, app.object)
Each resources knows always who its parent is. So you can make a security rule that says
Now the user is authorized to see the stream. The next step is to grant him access to the app and app.object with this rule:
Detailed security rules
Sense security is based on Attribute Based Access Control ABAC. Each time a user requests access to a resource, Qlik Sense evaluates the request against the security rules in the Qlik Sense system. If at least one rule evaluates to True then Qlik Sense will provide the user with access according to the conditions and actions described in the security rule. If no rules evaluate to True then the user will be denied access. The fact that Qlik Sense security rules are property-based makes Qlik Sense very scalable as you can build rules based on properties that apply to groups of users. In most BI systems you need to create a role for each organizational value (Spain, France etc.), this is not needed with Sense. We just use a variable to variable comparison: e.g. If your Active directory group (or group provided by ticket/SAML) matches some property of the stream/dashboard you are allowed access. For more information about Security rules see this video or the Qlik Sense help
If you don't have a key you won't get in, same like your house. If you have a key you can enter your house, and all rooms inside it. (Access to stream, Yes? Ok, than you might see all the dashboards)
So for Sense, if you have access to a stream maybe you want to show the user all dashboards inside the stream. In this way you keep the security concept very simple and effective. As a starting point I would recommend to give each department (HR, Finance) or customer (Customer A, Customer B) its own stream.
So we can give users access to a dashboard, and define whether he can use/edit/create Sheets, Stories, bookmarks etc. For example, if the user does not have access, that is a security rule that evaluates to true, he won't see the edit or bookmark button in Sense.
Authorization summary
Authorization check points | Authorization steps: | Example resources | |
| 1: Security rules in the QMC: Stream, apps and other resource access control
|
| |
| 2: Section access in the script of a QVF to provide row level security This section contains more info about the "second step" of the picture above: Which data and fields are users allowed to see? Section access to filter data: We load your security table as a regular table, we put this in a special section in the script called "section Access". This behaves exactly the same as the normal script. Except that it makes a "mandatory selection" or filter if the user opens the dashboard. Note that you can load users or groups in this section access column "UserId". If you send in the ticket attribute with the name “group” it will be used to restrict on in section access. So based on the group provided in the ticket you will see only your data. In the example on the left: if user John logs in, Qlik Sense makes a "fixed selection" which is basically an inner join between the security table and the datamodel. If John logs in, he will only see the data where department is Finance. Security using hierarchies Security is never a simple model, most of the time companies are organized using hierarchies. Qlik Sense allows you do authorize on this. See this for more info on authorization using a hierarchy. In this way you can authorize on a node, and the user will see all the children of the node. Note that this demonstrates the power of our script, the authorization on hierarchies is for example not possible with "pure visualizaton tools" which rely on 1 view to be supplied as input for the dashbard. |
Example: OEM security example use case for a fictive OEM partner
Functional design of the security principles
Technical design of Qlik Sense security:
We have to configure the following layers
1: A stream per customer
2: Security Rule
In the management console of Qlik we define 1 security rule to enable "resource access control". |
|
3:Section access
In the script we mark a special section as security. In the section we can limit per dashboard what a user/role can see (data filter/reduction). We do this based on the attribute: 'group' you provided in the ticket. In this way you don't need to sync user-group relationships to Sense.
Integrated security overview
The picture below outlines the complete flow from user single sign on with ticketing, to row level security via section access.

Key take aways:
Authentication | To create a single sign on model you only need to
|
| Authorization | Row level security
|
So this is what you DON'T need to do anymore
More security documentation can be found here
Appendix A: Streams
See a demo of streams here
The content in the hub is organized in streams. A stream is a collection of apps that a group of users has specific access to. The users of the stream can have different access rights. Some users might only be able to read the content in the stream, while others might have the rights to publish their content to the stream.
Appendix B: Security flow when opening an app
Introduction
Users interact with Qlik Sense using authenticated communication through one or more proxies. Information is transferred using cookies. The cookies are necessary regardless of authentication type used. When using a web browser, the web browser sends a ticket to the proxy. The proxy then returns a cookie to the browser and this cookie is included in the communication with the Qlik engine. When using a custom client, the client must set the cookie and provide it to the proxy.
Authentication
Authentication is the procedure of verifying the identity and credentials of users wishing to access Qlik Sense. It can be done in various ways:
Security example: The figure below shows the flow in the Qlik Sense security system when a user logs in and opens a app.

See also:
Planning Qlik Sense Deployments: Authorization
Planning Qlik Sense Deployments: Access control
Planning Qlik Sense Deployments: Data reduction
Managing a Qlik Sense site: Virtual proxies
Introduction to QlikAuth
You can create the ticketing implementation yourself via the QPS ticket API, or use the QlikAuth module. QlikAuth is a community tool/wrapper for .NET, JAVA, Javascript around the Qlik Sense Ticket API
Appendix 😧 Security approach summary

Appendix E: More information and tools about security?
What | Where | ||||
Security in Sense | |||||
Section Access | Tips and tricks for section acess | ||||
Using ticketing. This is an authentication module that can be used for testing access control in Qlik Sense. This is also an example of how an authentication module could look in NodeJS | |||||
This is a example implementation in Nodejs of how the Session API in the Qlik Sense Proxy can be used | |||||
Proof of concept implementation of the Load Balancing module API that implements a random load balancing algorithm | |||||
Setup header authentication | Header authentication is nice if you want to perform some tests with tools like fiddler, or if you have an architecture which uses an authenticating reverse proxy. Don't use this in other cases because a malicious user can misuse this technique.
For testing purposes it is easy to setup a virtual proxy with header authentication. Make sure you use the path for the REST calls which include this proxy. (http://srv/YOURPROXY/qrs). Don't forgot the http:// and ensure you allow http in the virtual proxy. Example config using Postman If you send this:
| ||||
Authentication using certificates | If you have server side software you can use certificates to authenticate against Qlik Sense. In this way your software tool can talk as admin to Qlik Sense.
| ||||
| Authentication using ticketing |
| ||||
Export and import the security rules |
Appendix F: Security rule examples
You can make the security in Sense as complex or simple as you want, I defined a couple of scenario from simple to complex.
Scenario | Authorization business rule description |
1 | Only authorize on streams |
2 | Authorize on the combination of streams and apps |
3 | Authorize on the combination of streams, apps and resources inside an app (sheets, stories, script, master items) |
4 | Authorize on rows and columns |
20 | An External tool should have full access, except to delete the "Template" and "Everyone" streams and apps. |
Scenario 1a: Authorization business rules Stream authorization
For our fictive company we defined the following rules
Scenario 1b: QMC Admin
Scenario 2: Authorization business rules: App authorization
Scenario 3: Authorization business rules: Sheet authorization
Scenario 4: Apply row/column level filtering
Security rule code for each scenario
Implementation of scenario 1a using the QMC - Security rules
Before we start, remember that If you want to see something, you need one or more security rules that give you access to
So in the examples below we create 3 rules (to make it manageble we splitted the rules per resource type, you can also create 1 big rule)
Modify standard rule set
Also we have to look at the standard security rule set in Qlik Sense. Here we have to disable some rules to prevent our your have too much authorizations. You can always find the rules that are active for your stream/app by going to the audit. Double click a cell, and you can see why John, has the rights to create app.objects (sheets, or basiscally all the "things" inside an app)
The rules below have to be disabled. To offer too much access to our users for now.

Access to resource | Description | Security rule condition |
Stream | Example security rule to give each user access to its stream | For use with Ticketing user.environment.group = resource.name For use with Microsoft Active Directory user.group = resource.name |
App | Example security rule to give
| (resource.resourcetype = "App" and resource.stream.HasPrivilege("read")) |
App Object | Summary Example security rule to give each user access to
Detailed
| ((resource.resourcetype = "App.Object" and resource.published ="true" and resource.objectType != "app_appscript" and resource.objectType != "loadmodel") and resource.app.stream.HasPrivilege("read")) |
If you want to go one step further you can also authorize on sheets:
| The security rule for employee: (resource.resourcetype = "App" and resource.stream.HasPrivilege("read")) or ((resource.resourcetype = "App.Object" and resource.published ="true" and (resource.objectType= "sheet") and (resource.name!="Finance Dashboard" and resource.name!="HR Dashboard") ) and resource.app.stream.HasPrivilege("read")) | |
Script: Section access | Row level security: In section access you can use the group of the ticket or AD to ensure row level security. In this way you can make sure that someone who is member of "group: Germany", can only see results in the dashboard where the data belongs to Germany. | Use the script below to authorize on groups (supplied in the ticket or via AD etc.) and on individual users
Note: normally you just load this table from your SaaS platform. For demo purposes I just do an inline load. |
Template Rule
(resource.resourcetype = "App" and resource.stream.HasPrivilege("read")) or ((resource.resourcetype = "App.Object" and resource.published ="true" and resource.app.stream.HasPrivilege("read"))
Implementation of scenario 1b: QMC admin per customer
Access to resource | Description | Security rule condition |
Apps and Stream | An admin of a specific customer is allowed to see their own stream and apps in the QMC | Filter: QmcSection_Stream, QmcSection_App*, Stream*, App* For use with Ticketing user.environment.group="admin" and resource.stream.HasPrivilege("read") For use with Microsoft Active Directory user.group="admin" and resource.stream.HasPrivilege("read") |
If you then create a user in your source system, and give him the admin group. He is able to see the QMC, only for his stuff.
And he can see this:

Only his stream and only his apps which are published in his own stream
Read access but not a specific stream and its apps

View everything in the QMC except apps and streams

Scenario 30: Audit display all

Security rule summary
See Qlik help for an overview of the options in the security rules. In my multi tenant SaaS demo platform I used the rules below.
Rule name | Condition | Resource filter | Actions | Description |
Z_OEM_API_TOOLS_APP | ((resource.stream.name!="Templates" and resource.stream.name!="Everyone" and user.roles="QRSMeteorAdmin" and resource.IsOwned() and resource.owner = user)) | App_*,App.Object_* | All | Root all for apps, except the everyone and template stream apps |
Z_OEM_API_TOOLS_QMC | ((user.roles="QRSMeteorAdmin" and resource.resourcetype!="App" and resource.resourcetype!="Stream")) | * | All | Everything in the QMC except the Streams and APPS |
Z_OEM_APP_ACCESS | resource.stream.HasPrivilege("read") or (resource.resourcetype = "App.Object" and resource.published ="true" and resource.app.HasPrivilege("read")) | App_*,App.Object_* | Read | see all apps if you have access to the stream |
Z_OEM_STREAM_ACCESS | ((resource.name=user.environment.group or (resource.name="Everyone") )) | Stream_* | Read | end user: if you see the stream you are allowed to see all apps for your customer |
Z_OEM_CONTRIBUTOR | user.environment.group="Contributor" and resource.published ="false" and resource.app.HasPrivilege("read") | App.Object_* | Create, update | A user with group contributor is allowed to create sheets in exiting apps, but no app creation |
Z_OEM_DEVELOPER | user.environment.group = "Developer" and ((resource.owner = user and resource.stream.Empty()) or (resource.app.HasPrivilege("read") and resource.published ="false" )) | App* | All | A user with group developer is allowed to create apps, sheets and load data. |
Z_QMC_ADMINS_CUSTOMER | ((user.environment.group="Admin")) | QmcSection_Stream, QmcSection_App* | Read | QMC Menu only. Only give access to stream if the name of the stream match the AD group. Note, we disabled the default Stream Rule |
Z_QMC_ADMINS_CUSTOMER2 | user.environment.group = "Admin" and ((resource.resourcetype = "App" and resource.HasPrivilege("read")) or (resource.resourcetype = "App.Object" and resource.app.HasPrivilege("read")) ) | App_* | Edit, publish | Administrators are only allowed to maintain the apps and app.object in the QMC |
Z_Root_ALL | ((user.roles="RootAdmin")) | * | all | Root: Hub and QMC full access |
Preset Calendar now with Sort Order
Added two Sorting Order options.
First chart showing Periods immediately after the period ends
example; Q1 after Jan,Feb,Mar and H1 immediately after 1st half of the year is completed.
While the Second char
...Preset Calendar now with Sort Order
Added two Sorting Order options.
First chart showing Periods immediately after the period ends
example; Q1 after Jan,Feb,Mar and H1 immediately after 1st half of the year is completed.
While the Second chart shows Period totals towards the end.

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comparing metrics for two or more periods is probably a common scenario for all developers in all organizations no matter what domain they are working in.
A Trend comparison between two or more periods for which we’ve been performing set analysis using variables. My App is a simple transformation of the Master Calendar, which allows the users to visualize and evaluate data across multiple periods dynamically without using variables.
For people who think master calendar is of no use, this is probably the best way you would actually making use of it.
Benefits:
Attached is just a sample made with Auto generated data.
I would like to hear expert’s reviews.
Cheers
V
Vineeth Pujari
Hi,
This document helps in implementing Sheet level access based on the user using Section Access. I configured four users A, B, C and D and no password is required to login.
If you login as A, then you can see both Sheet1 and Sheet2.
If you log
...Hi,
This document helps in implementing Sheet level access based on the user using Section Access. I configured four users A, B, C and D and no password is required to login.
If you login as A, then you can see both Sheet1 and Sheet2.
If you login as B, then you can see only Sheet1.
If you login as C, then you can see only Sheet2.
If you login as D, then you can see both Sheet1 and Sheet2.
The user access is defined in the table
| UserID | Sheet1 | Sheet2 |
|---|---|---|
| A | 1 | 1 |
| B | 1 | 0 |
| C | 0 | 1 |
| D | 1 | 1 |
Hope this helps others in implementing Sheet level security.
Regards,
Jagan.
Inserting KPI indicators into tables is actually quite simple if you understand the HTML Unicode UTF-8 characters that are available for you to use and display with simple if conditions. These characters behave like any other text so applying conditi
...Inserting KPI indicators into tables is actually quite simple if you understand the HTML Unicode UTF-8 characters that are available for you to use and display with simple if conditions. These characters behave like any other text so applying conditional colors is very simple.
Some examples, an example application and a link to many character options are at the bottom of this post.
Setting up the Measure
The measure needs to be a simple if statement, for example:
if([Sales This Year]>[Sales Last Year],chr(9650),chr(9660))
Where 9650 and 9660 are the triangle up and down character codes based on standard HTML Unicode UTF-8 charsets.
Setting up the conditional colours
Under Text color Expression use an if statement to switch the colours similar to the measure expression, for example:
if([Sales This Year]>[Sales Last Year],rgb(0,220,0),rgb(255,0,0))

Note:
I have used the field names of the columns in the table to create these expressions rather than repeat the measure expression by wrapping the field label in square brackets (as you will most likely know as of version 3.2 we can not reference the Master Items here). For this method to work both fields must be visible in the table.
Straight table example


Pivot table example


Example Characters and codes can be found here, there are many different groupings with this link taking you to the Geometric shapes.
Some useful Characters and codes are below:
| Character Code | Character Desc | Character |
| 9604 | LOWER HALF BLOCK | ▄ |
| 9605 | LOWER FIVE EIGHTHS BLOCK | ▅ |
| 9606 | LOWER THREE QUARTERS BLOCK | ▆ |
| 9607 | LOWER SEVEN EIGHTHS BLOCK | ▇ |
| 9608 | FULL BLOCK | █ |
| 9609 | LEFT SEVEN EIGHTHS BLOCK | ▉ |
| 9610 | LEFT THREE QUARTERS BLOCK | ▊ |
| 9611 | LEFT FIVE EIGHTHS BLOCK | ▋ |
| 9612 | LEFT HALF BLOCK | ▌ |
| 9613 | LEFT THREE EIGHTHS BLOCK | ▍ |
| 9632 | BLACK SQUARE | ■ |
| 9650 | BLACK UP-POINTING TRIANGLE | ▲ |
| 9658 | BLACK RIGHT-POINTING POINTER | ► |
| 9660 | BLACK DOWN-POINTING TRIANGLE | ▼ |
| 9668 | BLACK LEFT-POINTING POINTER | ◄ |
| 9679 | BLACK CIRCLE | ● |
| 9680 | CIRCLE WITH LEFT HALF BLACK | ◐ |
| 9681 | CIRCLE WITH RIGHT HALF BLACK | ◑ |
| 9682 | CIRCLE WITH LOWER HALF BLACK | ◒ |
| 9683 | CIRCLE WITH UPPER HALF BLACK | ◓ |
| 9684 | CIRCLE WITH UPPER RIGHT QUADRANT BLACK | ◔ |
| 9685 | CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK | ◕ |
| 9698 | BLACK LOWER RIGHT TRIANGLE | ◢ |
| 9699 | BLACK LOWER LEFT TRIANGLE | ◣ |
| 9700 | BLACK UPPER LEFT TRIANGLE | ◤ |
| 9701 | BLACK UPPER RIGHT TRIANGLE | ◥ |
| 9733 | BLACK STAR | ★ |
| 9734 | WHITE STAR | ☆ |
| 9745 | BALLOT BOX WITH CHECK | ☑ |
| 9746 | BALLOT BOX WITH X | ☒ |
| 9754 | BLACK LEFT POINTING INDEX | ☚ |
| 9755 | BLACK RIGHT POINTING INDEX | ☛ |
| 9785 | WHITE FROWNING FACE | ☹ |
| 9786 | WHITE SMILING FACE | ☺ |
| 9787 | BLACK SMILING FACE | ☻ |
| 9829 | BLACK HEART SUIT | ♥ |
| 9830 | BLACK DIAMOND SUIT | ♦ |
| 9872 | WHITE FLAG | ⚐ |
| 9873 | BLACK FLAG | ⚑ |
| 9898 | MEDIUM WHITE CIRCLE | ⚪ |
| 9899 | MEDIUM BLACK CIRCLE | ⚫ |
| 9940 | NO ENTRY | ⛔ |
| 9978 | TENT | ⛺ |
| 9989 | WHITE HEAVY CHECK MARK | ✅ |
| 9995 | RAISED HAND | ✋ |
| 10003 | CHECK MARK | ✓ |
| 10004 | HEAVY CHECK MARK | ✔ |
| 10005 | MULTIPLICATION X | ✕ |
| 10006 | HEAVY MULTIPLICATION X | ✖ |
| 10007 | BALLOT X | ✗ |
| 10008 | HEAVY BALLOT X | ✘ |
| 10009 | OUTLINED GREEK CROSS | ✙ |
| 10010 | HEAVY GREEK CROSS | ✚ |
| 10011 | OPEN CENTRE CROSS | ✛ |
| 10026 | CIRCLED WHITE STAR | ✪ |
| 10060 | CROSS MARK | ❌ |
| 10062 | NEGATIVE SQUARED CROSS MARK | ❎ |
| 10067 | BLACK QUESTION MARK ORNAMENT | ❓ |
| 10068 | WHITE QUESTION MARK ORNAMENT | ❔ |
| 10069 | WHITE EXCLAMATION MARK ORNAMENT | ❕ |
| 10070 | BLACK DIAMOND MINUS WHITE X | ❖ |
| 10071 | HEAVY EXCLAMATION MARK SYMBOL | ❗ |
It is often that we need to analyze the data on geo maps. There are many posts and links available to get started with the geo maps. Below are the various available links.
We can create the Google maps in the QlikView using google map APIs
...It is often that we need to analyze the data on geo maps. There are many posts and links available to get started with the geo maps. Below are the various available links.
We can create the Google maps in the QlikView using google map APIs
Creating Geo-spatial dashboards in Qlikview
Steps for beginners to implement Google Maps in Qlikview
Step-by-Step Google Map API v3 integration
We need latitude and longitude for implementing google map in QlikView. You can extract the latitude and longitude dynamically by just giving the city name. Refer the below link to get the extractor for generating lattitude and longitude dynamically.
You can also get the latitude and longitude from below link
Country List ISO 3166 Codes Latitude Longitude
Geographic Heat Maps
1) Without Extension
Geographic Heat Map Visualization
HeatMap using Google Chart API
2) With Extension
Google Maps - Heatmap | Qlik Community
Open Source Geospatial Mapping Extension using ... | Qlik Community
Another Google Maps Extension | Qlik Community
SVG heat map
GeoQlik
You can use the trial version of this extension as it's not free.
Qlikmaps
Regards,
Kushal Chawda
If you want to be selected/nominated to become a Qlik Community MVP, these tips will help get you there!
BE A POSITIVE ROLE MODEL
Work hard, demonstrate commitment, be respectful and supportive, keep a positive tone, show integrity, be accountable
...If you want to be selected/nominated to become a Qlik Community MVP, these tips will help get you there!
BE A POSITIVE ROLE MODEL
Work hard, demonstrate commitment, be respectful and supportive, keep a positive tone, show integrity, be accountable and trustworthy.
STAY ENGAGED
Only the most dedicated and engaged Qlik experts can carry the Qlik Community MVP Badge!
SHARE KNOWLEDGE
Answer questions from your fellow Community members. Share knowledge that makes others successful.
HELP OTHERS
Be willing to help, ask questions, provide clarity. Put yourself out there. Get to know other Community members.
BE INNOVATIVE
Think outside the box, take pride in your ideas, brainstorm with others, swap ideas, and stay in the know. Always work to improve your skills.
INSPIRE TRUST
Apart from the knowledge you impart, strive to be known for how you make people feel.
This example has been produced to accompany the blog post Sending Data In QlikView Alerts
There is a Qlik Sense version of this solution here: https://www.quickintelligence.co.uk/send-data-from-qlik-load-script/
This application demonstrates how alerts
...This example has been produced to accompany the blog post Sending Data In QlikView Alerts
There is a Qlik Sense version of this solution here: https://www.quickintelligence.co.uk/send-data-from-qlik-load-script/
This application demonstrates how alerts e-mails can be sent when a certain criteria is met. It also takes this concept further by showing how the CONCAT and AGGR statements can be used to construct a string from a number of expressions, which can then be used as the body of the email.
The blog article gives further details and explanation on how this works and how to implement it in your own applications.
Please also see my other uploaded Qlik apps and tutorials https://www.quickintelligence.co.uk/examples/
Steve Dark