QlikView Section Access for defining data access in your applications

QlikView Section Access for defining data access in your applications

New age BI tools like QlikView and Tableau are making it easy to access information on the go. With this ease of access, there comes an additional danger – the danger of putting the application in wrong hands. Imagine what can happen if your QlikView application (which stores and presents information for all business critical decisions) falls in wrong hands!

Data Security is one of the top concerns for any Organization, more so for data driven Organizations.

In order to gaurd against this danger, QlikView (& now QlikSense) come with Section Access – a way to decide who can view what information, which objects can be viewed by whom and from which domain etc. These can also be set with help of QlikView publisher. In this article, we will discuss section access and show how it can be applied to a QlikView application.

What is Section Access?

It is a feature used to control the security of QlikView applications. Section access is defined as part of the load script, where we define an authorization table, i.e. a table where you define who gets to see what information and from where. Section access can be of various types, depending on the sensitivity of the information and business comfort:-

  1. A simple username and password might be sufficient to access some documents
  2. In some scenarios, you would want specific users in your domain to be logged in specific machines and use certain keys to unlock the information.
  3. You may also want to restrict access to specific objects and sheets of a document.
  4. Remove fields from the data model for the specified user (by omitting them).
  5. Row level data reduction based on authorization mentioned.

In this article, we will cover row level data reduction only and rest of the methods will be discussed in future posts.

Facts before Implementing Section Access:

Here are some basic rules to remember before implementing section access:-

  1. Backup your application because Incorrect syntax will render your document inaccessible and there’s no possibility of recovering the data or script.
  2. Section access data (Security table) loaded by an external source (xlsx, txt …) must be loaded by using upper case in the SECTION ACCESS statement.
  3. Security table contains several user-specific system fields, like USERID, PASSWORD, ACCESS are basic system fields. You can also combine several fields to build the Section Access solution depending on the desired level of security. (To know more about System fields, please refer QlikView Reference Manual).
  4. Apart from the standard fields, additional fields can be defined to administer data reduction for each user.


For Sachin Dashboard (we had created this application as a tribute to Sachin’s test career), I want to restrict users to see his performance against a particular country only. Look at below security table, it defines the permission to user.

You can see that we have defined 10 users with userid, password, level of access and value for field AGAINSTCOUNTRY, for which these users require access. One of the key things, I want to discuss in the above table is, “*” in Section Access. “*” denotes all values i.e. users, who have access to see all values listed in the table. If a value is not listed in the security table, it will not be available to anyone.

For ACCESS, we have two access levels “ADMIN” and “USER”. ADMIN has privileges to change everything in the document and controls what “USER” can see in the document.

Implementation of Section Access:

Now let’s Implement this section access to an existing document. We will perform this in following steps:-

  1. Create a copy of existing document because if any thing goes wrong, we have a backup.
  2. As we know that we are going to apply restriction on row level data based on Against_Country field, so first let’s make sure that it is available in UPPER case. Here, I have converted it to upper case (Changes done to the original table).
  3. Add a new tab and write script to import Security table followed by Section Access statement using inline table or external file. (We are doing this with external file).
  4. Save document and then go to Setting —> Document Properties —> Opening tab and turn check box on for “Initial data reduction Based on Section Access” and “Strict Exclusion”.
  5. Save it and reload. Close the dashboard after the reload.
  6. Now Open dashboard, here it will ask for User Identification and based on your user permission you will be able to see the results.
  7. Here, I have given USERID and password of Kunal and i am able to see Sachin Test Career summary only for the country Australia (as mentioned in Security table).

End Notes:

In this article, we have seen an example of how to restrict user to row level data limitation using Section Access. We also looked at what are security feature we should look at while developing or delivering dashboard. I recommend you to apply security feature to document before sharing it with any one.

In future, we will also discuss about other security features like NT domain identification, document properties (Sheets, Object), field level security. It also provides an example of how naming conventions can be used to architect a solution that is more robust and lowers maintenance costs for your QlikView documents.

If you like what you just read & want to continue your analytics learning , subscribe to our emails, follow us on twitter or like our facebook page.

You can also read this article on our Mobile APP



Understand / Create / Inform

Section Access Reduction in Qlik Sense

Even with the advent of Qlik Sense Security rules in the QMC you may find yourself working with Section Access. Maybe you don’t have a server, maybe you want to guard against users just taking the QVF file (and all your data with it) or maybe you want to implement section access reduction. it was the latter that prompted the bog, seeing an interesting behaviour for the first time took a bit of investigating.

Читайте также  MS Access: создание сложных запросов с помощью конструктора запросов

Either way the functionality can be tricky to implement. You often have you test various circumstances to see what works and in the process it wasn’t uncommon (back in QlikView) to lock yourself out of your own dashboard.

Section Access can do two things:

  1. Stop people accessing the dashboard
  2. Reduce what people can see based on their logon Id

Lets focus on the first…… Setting up Section access is simple. You just need a table loaded in from any source (inline, CSV, database, etc) and the table has to be constrained within Section Access; and Section Application ; statements.

In the table two fields are required

These have to be in UPPERCASE (as do all field names and values in this table). Once the data model has been reloaded the only person who can open the dashboard is user: DOMAINNAMERPEARCE

That’s fairly simple, the next stage of the process will be to look at reducing the data based on access granted to the USERID in the section access table. Lets review the next script:

We now have an additional field REDUCTION which would link to TableA by the field with the same name, in turn that would also link to TableB by the field Type. Because our user only has the REDUCTION value of 1 when we reload the data, save and close the dashboard and re-open there will only be one record in both TableA and TableB.

We reduce the data not only in the first table but in subsequent tables based on possible values! This is key if your data model contains a link that needs to be bridged no matter what as in the example below:

Section Access Reduction Data Model

Here the REDUCTION starts on the left hand Department table so I’d have grouped staff USERID’s by the department they work in. We move through the model reduction the data by possible value. This works well for the first three tables and users will only be able to see the sales data associated with their department.

If you consider how the next link will work… In this example I want all staff to see all purchases but this isn’t the case here. If you follow the logic both the Calendar and Purchase Tables will now only have records where there’s been a sale on the same date (and then only sales which associate with the person opening the dashboard) which isn’t what we want.

In order to resolve the issue we need to add dummy records to the sales table. One for each date there’s been a purchase duplicate those for each SalesPersonID. We can of course add a flag to ensure that data isn’t used in any counts or sums….

If we want a user to have access to several REDUCTION lines we simple add them again in the Section Access table:

If you want the user to see all the data there’s two ways to acheive this. You could change their ACCESS to ADMIN although the proper way would be to give them a * value for REDUCTION. (THIS CODE WILL LOCK YOURSELF OUT. )

The wildcard only refers to data within the Section Access table so in the example above there is no other data and as such the line isn’t loaded (and you’re locked out). In the example below you would see two records in tableA and tableB:

If you have other people that need to see 1 or 2 then of course you don’t need dummy lines but if you do use star * then you have to ensure all possibilities are covered in the section access table even if that means using a dummy record. This is what caught me out recently!

Finally we can look at the OMIT field. Now rather than reducing the records we can remove columns (Hint – Don’t remove Key fields!). Here is the Default, we have the field OMIT here but there is no value. That’s the same as saying leave all the fields intact… Lets remove the Comments Fields !:

We can add the first column name we want to hide from the user:

Now when we reload, save and re-open the dashboard the field comments still shows in the data model viewer although when you preview the data it’s gone (see below)!

Sense OMIT columns

We can repeat the process to remove more columns.

So effectively rather that saying what records we want to keep using REDUCTION we are saying what we want to remove by using OMIT! Pretty powerful stuff and remember this is available for free in Qlik Sense desktop. If you buy server licenses you get the QMC and even more power over what users can see by hiding sheets and objects using the security rules!


QlikView: Экспресс загрузка данных

В этой статье я расскажу о не стандартном, по крайней мере, для нашей компании методе обновления данных.

У нас в компании экспресс-загрузка оказалась полезной в таких случаях:

  1. Загрузка всех нужных данных (уже оптимизированных) делает приложение очень тяжелым (к примеру, продажи по всем магазинам и товарам за последние хотя бы два года). Крутить миллиард строк в приложении вариант, но не самый удобный.
  2. Некоторые алгоритмы очень долгие. Например, у нас есть алгоритм, который по всем товарам (или магазинам и т.д.) отрабатывает 4-5 часов. И, если пользователь обновил данные по одному товару (магазину и т.д.), то для использования возможностей QlikView, приходится ждать следующего дня. День ожидания – неудобно.
  3. Очень удобно тестировать большие и не очень доработки.

Для описанных выше случаев мы используем одинаковую схему, которую мы назвали «Экспресс загрузка».

Экспресс-загрузка данных: Схема метода

Шаг 0.

Шаг 1.

Шаг 2.

Шаг 3.

Теперь распишу подробнее эти пункты.

Шаг 1. Предоставление данных пользователем и их обработка

Чтобы любой пользователь передавал нам параметры, по которым ему нужно представить данные, нужен удобный интерфейс. Мы делаем этот интерфейс либо на web, либо используя уже имеющиеся программные продукты в компании (так пользователям проще).

Как результат для QlikView готовятся данные в формате txt или csv. Также можно сделать таблицу в какой-либо базе данных, которую будет периодически считывать Qlik.

НА ЗАМЕТКУ! В основном мы используем текстовые файлы с разделителями. Сам файл называется логином того пользователя, который сделал запрос, содержимое файла содержит нужные нам колонки.

Читайте также  Создание структуры таблицы БД Access инструкцией SQL, Программирование в СУБД Access 2003

Шаг 2. Запуск QlikView с переданными параметрами

Для того чтобы оперативно отследить запрос пользователя мы используем PowerShell.

  1. Для начала нужно проверить наличие файлов с запросами от пользователей.

Если файлы есть, то средствами того же PowerShell мы запускаем нужное приложение или цепочку приложений. Если же файлов нет, т.е. нет запросов от пользователей, то на этом этапе работа скрипта завершается.

  1. Копируем файлы с запросами пользователей к себе на диск (файлы могут быть на другом сервере).

Создаём список файлов. Обязательно указать ‘*’ в конце пути.

Копируем все файлы на сервер QlikView

  1. Далее запускаем нужные приложения в соответствующем порядке. Для этого используем функцию ReloadApp (подробно во вложении)

В приложении обязательно включаем лог файл, если во время перезапуска будет ошибка, то соответствующий отчёт придёт сотруднику QlikView. Если же ошибок не будет, то запустится следующее по порядку приложение.

Если для алгоритма есть полная ежедневная перезагрузка, то функция работает следующим образом: делается копия перезапускаемого приложения (к имени добавляется постфикс _express), и именно эта копия перезапускается, соответственно, QlikView генерит отдельный лог файл для этого процесса, который при необходимости можно будет анализировать и лог от ночного обновления не будет перезаписан.

Далее копии экстракторов удаляются, а копия основного приложения остаётся. И пользователь в итоге имеет два приложения: ежедневное со всеми данными и приложение только с запрашиваемыми данными (с постфиксом _express).

  1. Предварительно в самих приложениях необходимо сделать корректировки, добавить код, который будет работать, только если приложение имеет постфикс _express

Чтобы добавить такой код, используем функцию DocumentName()

Какой код нужно добавить?

a. В первом (возможно единственном) приложении цепочки нужны выгрузки, необходимые для загрузки данные.

Например, так выгружается список товаров, по которым будет запускаться приложение.

b. Далее нужно выгрузить список пользователей, которым по завершении работы алгоритма будет осуществляться рассылка:

Имея логины, при необходимости, можно добавить и другие персональные данные. Поле group генерится, если рассылку делать с помощью NPrinting.

c. Чтобы алгоритм отрабатывал только по нужным товарам, в необходимых местах добавляем условие:

Так как переменная vExpress равна 1 только, когда имя приложения имеет постфикс _express, никаких сбоев при стандартной ночной или утренней перезагрузке уже не будет.

d. Если какая-то часть кода выполняется слишком долго, то при возможности лучше воспользоваться данными ночной выгрузкой, особенно, если эти данные в течение дня не меняются.

e. Все qvd-файлы, полученные при работе экстрактора с постфиксом _express, сохраняются в отдельную папку при добавлении в путь выгрузки переменной.

Переменная vAddPath принимает значение ‘_Express также, когда приложение с постфиксом, соответственно минимизируется возможность некорректного сохранения файла во время ежедневного обновления данных.

При необходимости (в зависимости от алгоритма) можно инкрементально добавить данные из прошлых экспресс-загрузок, чтобы приложение аккумулировало информацию по всем запросам за день. В начале следующего дня данные можно обнулять.

f. Переменные, в примерах выше (vExpress и vAddPath) необходимо обнулить или присвоить им пустое значение в начале скрипта.

g. Для удобства сделать лог, чтобы понимать, кто с какими запросами обычно обращается к этому приложению и обращается ли вообще.

Я постарался описать основные изменения. Ситуация упрощается, если весь алгоритм работает только по запросу, и у нас есть только одно приложение.

Шаг 3. Рассылка об успешной/ не очень успешной загрузке

Если во время работы алгоритма ошибок не было, то пользователю нужно сообщить об успешном обновлении данных. Если же произошла какая-либо ошибка, об этом должен узнать и сотрудник QlikView. Работа скрипта, конечно же, останавливается.

Рассылку можно осуществить двумя способами:

  • первый, напрямую из PowerShell (функция во вложении),
  • второй средством NPrinting, используя механизм запросов (об этом можно рассказать отдельно).

После отправки писем тестовые файлы нужно удалить.

Сам скрипт установить на запуск в планировщике Windows каждые 5 или 10 минут, во время выполнения другая копия запускаться не будет. По умолчанию заданию устанавливается настройка:

Вместо заключения

Метод «Экспресс загрузки» напрашивался давно. Для нас это оказалось очень удобным. Соответственно стандартного механизма нет. Чтобы добавить возможность экспресс загрузки, для каждого алгоритма, нужен индивидуальный подход. Я же постарался описать идею в целом. На данный момент по подобной схеме в компании работает три алгоритма. Для примера: чтобы большей частью адаптировать к этой схеме цепочку из 5 экстракторов и итогового приложения, потребовалось около 3-х дней. В итоге, алгоритм, который при полной перезагрузке (по всем SKU) отрабатывает дольше, чем за 5 часов, в экспресс режиме отрабатывает за 5-10 минут для нескольких товаров.

Надеюсь, информация будет полезной и предложенная идея «Экспресс загрузки» будет использована в вашей профессиональной деятельности.


Qlikview section access как сделать

At the Masters Summit for QlikView in London we ended the second day with an informal ‘stump the geek’ session. In this session participants could submit technically challenging questions to a panel. Besides the four presenters, this panel also consisted of Steve Dark, Stephen Redmond and Henric Cronström. You can imagine that I found myself surrounded by an awesome amount of QlikView knowledge.

While challenging, most of the questions could either be answered on the spot or a conceptual solution could be described. There was however one question that didn’t really yield an, in my opinion, satisfactory answer. The consensus almost seemed to drift towards ‘it cannot be done’ or ‘that is not how QlikView works’. The question was:

Can we make “or” selections between list boxes, instead of the standard “and” selections?

And & or selection modes

To explain that question a little more, consider the following example of sales amounts by customer, product and salesman:

By default, selections within a list box are done in or-mode . By selecting Customer 1 and Customer 2, we select all records that are associated with either Customer 1 or Customer 2. By contrast, selections between list boxes are always done in and-mode . Selecting Product 2 and Salesman 1 returns all records that are associated with Product 2 and Salesman 1.

The question was if we could override the selection mode between list boxes. In other words, if we could return a result that showed all records associated with either Product 2 or Salesman 1.

At that moment, no one could think of an easy moment to achieve this. While I had some general ideas about where to look I wasn’t able to clearly articulate those at the time. We were stumped, or at least, I was.

A possible solution

Of course, to someone who likes solving problems there is nothing more challenging than a problem that appears unsolvable. Impossible? We’ll see about that! (I like how I am not the only one who accepted this challenge by the way, Steve Dark has also posted some of his thoughts and solutions to the QlikCommunity.)

Читайте также  Иллюстрированный самоучитель по Microsoft Access 2002 › Публикация данных в корпоративной сети и Интернете › Использование гиперссылок в объектах базы данных страница - 372, Самоучители по офисным пакетам, Иллюстрированные самоучители

After taking some time to think it through, I came up with a preliminary solution. Now that the Masters Summits have finished and I’ve finally caught up on my day job again, I found the time to turn this into a more presentable solution:

The image above shows the exact same selection as the earlier image. However, when you look at the straight table you will notice that the selection has now been made in or-mode. Data is shown when the Customer is Customer 1 or Customer 2 or when the Product is Product 2 or when the Salesman is Salesman 1. This is achieved using a Set Analysis statement that is built using the following (simplified) logic:

  1. For each field in the data model that is not in the excluded fields list;
  2. Check if selections have been made in the field using GetSelectedCount();
  3. If selections have been made, generate a Set Analysis statement clearing selections in all other fields, except fields in the excluded fields list;
  4. When all fields are processed, union all the Set Analysis statements together (note: I will expand the post later to explain this concept in some more detail);
  5. Use the unioned Set Analysis statement in your expressions.

A variable is used to store a list of fields to exclude from the or-mode. An example of fields to exclude are calendar fields. Showing sales that were made in the year 2012 or by Salesman 1 doesn’t really make any sense. The expression that I use to generate the Set Analysis statement is shown below. You can imagine that it was quite a beast to write:

What I like about this solution is that it’ll work in any data model, there is no need to predefine things in your data model or create alternate states. There’s also a few things that could be improved though:

  • Create an additional statement that doesn’t work on all fields in the data model, but only on those fields specified in an included fields list. This should be a relatively easy change.
  • The current expression clears all selections except for the active field. Rewrite the expression so that it only clears selections in fields that actually have selections. Conceptually a very easy change, but might require some more tweaking to get it into the expression without errors.

Performance is another important aspect. In the test I did with 10,000 row dimension tables and a 10,000,000 row fact table this solution actually performed quite well. Of course I haven’t applied this to any real world solutions, but who knows if it might prove useful in the future?

Download the example file

You can download the example file below. In it you will find the expressions that I used, which you can copy to your own applications. Of course, if you improve the expressions then I’d like to hear from you.

Your thoughts?

So what are your ideas? Is this something you should even be doing in QlikView? Is there a better way to achieve this? I’d be very interested in hearing your thoughts and feedback.