Привет, Хабр!
Qlik Sense – это BI-система, которая позволяет загружать данные из различных источников и создавать визуализации для проведения анализа. В публикации я рассмотрю Qlik Sense, как инструмент для создания пользовательского интерфейса.

Сегодня я покажу как создать простое приложение, в котором пользователь на одном листе будет добавлять данные о товаре, изменять их и удалять, а на другом листе будут отображаться в таблице все актуальные данные, полученные от пользователя. При этом Qlik Sense будет хранить эти данные в файле QVD и актуализировать его содержимое в зависимости от действий пользователя.
QVD – это файл, в котором содержится таблица данных, экспортируемая из Qlik Sense или Qlik View. QVD является собственным форматом Qlik и может быть записан и прочтен только с помощью c него. Этот формат файла оптимизирован для скорости при чтении данных из скриптов Qlik, но в то же время не занимает много места. Чтение и запись происходит в 10-100 раз быстрее, чем чтение из других источников данных.
Данная информация ориентирована на пользователя, обладающего базовыми знаниями работы с визуализациями и основами создания скрипта в Qlik Sense.
Итак, приступим. Сначала создаю приложение Qlik Sense и даю ему название.

Далее перехожу в редактор загрузки данных и создаю подключение к папке, в которой буду хранить QVD файл

В редакторе загрузки данных создаю таблицу [Срок годности товаров] из 3 столбцов: [ID], [Товар], [Срок годности до]. Данную таблицу сохраняю в QVD файл и запускаю загрузку данных:
SET PATH ='lib://TEST; //Путь до папки, где будет храниться QVD файл [Срок годности товаров]: Load * Inline [ ID, Товар, Срок годности до 1, Молоко, 15.01.2022 2, Колбаса, 20.02.2022 3, Сыр, 15.02.2022 ]; //Сохранение данных в QVD файл Store [Срок годности товаров] into $(PATH)/product.qvd (qvd);

Также создаю таблицу [Календарь], которую буду использовать для выбора пользователем срока годности товара:
[Календарь]: Load Дата; Load Date(MinDate+IterNo()-1) as [Дата] While Date(MinDate+IterNo()-1) <= MaxDate; Load Date('01.01.2022') as MinDate, //min дата в календаре Date('01.01.2023') as MaxDate //max дата в календаре AutoGenerate 1;

Теперь перехожу в раздел создания листов и создаю переменные без указания исходных значений: Edit, Product_ID, Product_name, Date_before. Затем создаю 2 листа.

Первый лист - товары, где размещаю таблицу [Срок годности товаров] и кнопки Добавление, Редактирование и Удаление.

В свойствах визуализаций добавляю последовательно действия и навигацию на кнопки:
Добавление:
1. Задаю значение переменной Edit равное 1
2. Задаю значение переменной Product_ID равное =$(=max(ID)+1)
3. Переход на страницу Редактирование товаров.

Редактирование:
1. Задаю значение переменной Edit равное 2
2. Задаю значение переменной Product_ID равное
=’$(=Concat(distinct ID))’
3. Задаю значение переменной Product_name равное
=’$(=Concat(distinct Товар))’
4. Задаю значение переменной Date_before равное
=’$(=Concat(distinct [срок годности до]))’
5. Переход на страницу Редактирование товаров

Удаление:
1. Задаю значение переменной Edit равное 3
2. Задаю значение переменной Product_ID равное
=’$(=Concat(distinct ID))’
3. Перезагрузка данных, ставлю галочку «Частичная перезагрузка данных».
4. Очистка от всех выборок

Второй лист – редактирование товаров, где размещаю текстовое поле для ввода товара и календарь для выбора срока годности, а также кнопки сохранить и закрыть.

В свойствах визуализаций добавим последовательно действия и навигацию на кнопки:
Сохранить:
1. Задаю значение переменной Date_before равное Дата
2. Перезагрузка данных, ставлю галочку «Частичная перезагрузка данных».
3. Очистка от всех выборок
4. Переход на страницу Справочник товаров

Закрыть:
1. Задаю значение переменной Edit равное 0
2. Очистка от всех выборок
3. Переход на страницу Справочник товаров

Возвращаюсь в редактор загрузки данных и создаю новый раздел Редактирование и прописываю в нем код, который позволяет добавлять новый товар, изменять данные по товару и удалять товар.
//Проверяем создан ли файл if FileSize ('$(PATH)/product.qvd') > 0 then Switch Edit //*****Добавление***** case 1 // Проверяем заполнение полей if Product_name <> 'Введите текст' and Date_before <> '-' then //Добавляем запись в уже существующую таблицу Concatenate ([Срок годности товаров]) Add Only LOAD //Add Only отвечает за запуск скрипта только при частичной перезагрузке данных '$(Product_ID)' as ID ,'$(Product_name)' as Товар ,'$(Date_before)' as [Срок годности до] AutoGenerate 1; //Сохранение таблицы в qvd Store [Срок годности товаров] into $(PATH)/product.qvd (qvd); //Сброс переменных set Product_ID = ''; set Product_name = 'Введите текст'; set Date_before = ''; set Edit = 0; endif; //*****Обновление***** case 2 //Формируем список на удаление Temp: Add Only LOAD * Inline [ "IDTemp" $(Product_ID) ]; //Удаляем текущую таблицу drop Table [Срок годности товаров]; //Загружаем данные из QVD, кроме IDTemp [Срок годности товаров]: Add Only Load * From $(PATH)/product.qvd (qvd) where not Exists(IDTemp,ID); //Добавляем новую строку с изменениями Concatenate([Срок годности товаров]) Add Only LOAD ID ,'$(Product_name)' as Товар ,'$(Date_before)' as [Срок годности до] From $(PATH)/product.qvd (qvd) where Exists (IDTemp, ID); //Зачищаем список на удаление drop Table Temp; //Зачищаем список на удаление //Обновление данных в qvd файле Store [Срок годности товаров] into $(PATH)/product.qvd (qvd); //Сброс переменных set Product_ID = ''; set Product_name = 'Введите текст'; set Date_before = ''; set Edit = 0; //*****Удаление***** case 3 //Формируем список на удаление Temp: Add Only LOAD * Inline [ "IDTemp" $(Product_ID) ]; //Удаляем текущую таблицу drop Table [Срок годности товаров]; //Загружаем данные, кроме IDTemp [Срок годности товаров]: Add Only Load * From $(PATH)/product.qvd (qvd) where not Exists (IDTemp, ID); //Зачищаем список на удаление drop Table Temp; //Зачищаем список на удаление //Обновление данных в qvd файле Store [Срок годности товаров] into $(PATH)/product.qvd (qvd); //Сброс переменных set Product_ID = ''; set Product_name = 'Введите текст'; set Date_before = ''; set Edit = 0; //*****Иначе просто читаем таблицу из qvd файла***** Default [Срок годности товаров]: Load * From $(PATH)/product.qvd (qvd); End Switch endif;
Теперь давайте посмотрим, как работает созданное приложение.
Добавление товара:

Редактирование товара:

Удаление товара:

Таким образом, без использования веб-программирования, а зная только Qlik Sense можно создать несложный сервис, который позволяет принимать значения от пользователя, хранить их в любом источнике данных, строить различные аналитические отчеты для проведения анализа.
