Внутристроковые циклы в Loginom. Аналог IterNo() в Qlik

Периодически возникает необходимость выполнить цикл внутри строк таблицы. При этом у каждой строки может быть свое кол-во итераций.

В моей практике это чаще всего нужно для задач вида «Разбить план по месяцам на план по дням», когда каждую строку нужно повторить по кол-ву дней в месяце. А также для задач генерации данных, когда нужно получить определенное кол-во записей с заранее заданными атрибутами.

В Loginom отсутствует функционал внутристроковых циклов. Конечно, тут есть обычные циклы вида Do While и For Each, с помощью которых можно прогрузить каждую строку таблицы n раз, получив нужное тиражирование данных. Однако очевидно, что вменяемая производительность при таком подходе будет только на ограниченных объемах данных. Что будет, если построчно грузить таблицы на сотни тысяч строк?

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

Подготовка данных

Шаг 1 — в исходной таблице через калькулятор создайте расчетное поле, которое будет содержать число, определяющее, сколько раз нужно прогрузить каждую строку.

Например, у вас в строке содержатся данные за месяц (январь 2023), а вы хотите чтобы данные стали представлены по дням, то вам эту строку нужно будет прогрузить 31 раз. Можно получить это число, например, через функцию Day() от последнего дня месяца.

Я сейчас для себя решаю задачу генерации данных, поэтому у меня лимиты будут случайным числом от 1 до 10.

Шаг 2: сформируйте таблицу с полным диапазоном значений от 1 до максимального лимита итераций. Ремарка. В этом примере я использую узел группировки, чтобы получить уникальные значения поля Iter_lim с предыдущей картинки. Потому что у меня эти значения генерируются как числа от 1 до 10 в таблица на 4041 строку, и по этому вероятность не получить полный набор значений крайне низка. Если ваш пример не похож на этот, то вы можете воспользоваться компонентом из Loginom Silver Kit, который сгенерирует непрерывный ряд чисел по диапазону.

Создаем подмодель для цикла

Будем использовать цикл For Each. Если не знаете как в Loginom делаются такие циклы, посмотрите курс по знакомству с Loginom. Делаем подмодель с двумя входами, на первый подаем список итераций, на второй — таблицу с данными.

Структура цикла получается вот такая.

Создаем узел цикла, настраиваем его на открутку по списку уникальных значений счетчика итераций.

Выполним цикл, и отсортируем результаты. Как видите, мы сразу наблюдаем, как строки с лимитом итераций 2 и 6 разбилась на 2 и 6 строк соответственно, каждая со своим счетчиком итераций. Общее кол-во строк увеличилось с 4041 до 22476.

Теперь можно использовать поля итераций и лимита итераций для того чтобы создать новые значения. Например, прибавляя поле итераций к основной дате, можно получить значения дат на каждый день месяца. А если бы тут была сумма по плану продаж, то разделив ее на общий лимит итераций, я бы получил плановую сумму на каждый день.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.