Постановка задачи
Предположим, что нам необходимо разработать сложный отчет на СКД. Пусть у нас есть описание конечного результата, например, сделанного пользователем в экселе. Трудность заключается в том, что нам изначально непонятна структура полей, которые нужно получить из наборов данных, какие поля будут вычисляемыми, можно ли посчитать ресурсы формулами или же их придется вычислять в запросах.
Решение
Стандартный подход к решению такой задачи - итерационный. На каждой итерации мы пишем запрос или его часть, затем дорабатываем ресурсы, вычисляемые поля, структуру. Затем дописываем запрос. И так по кругу.
На некоторых итерациях выясняется, что нужно менять структуру полей запроса. При этом переделывать уже написанные запросы бывает очень трудоемко. Иногда также приходится менять структуру наборов данных.
Чтобы упростить решение задачи, можно на первом этапе абстрагироваться от запросов к таблицам базы данных. То есть организовать заглушки наборов данных, возвращающих ожидаемый нами результат. Опираясь на заглушки уже можно описать вычисляемые поля, ресурсы, структуру данных. А после уже переходить к написанию запросов. Если на какой-то из итераций понадобится изменить структуру полей набора данных, то сделать это в заглушке не составляет большого труда.
Дополнительным плюсом в таком подходе является то, что если в базе нет всех нужных нам данных, то разработка не задерживается, мы можем сделать самую трудную работу без них.
Заглушки
Заглушки описываются в виде запросов, возвращающих константные значения.
Пример из практики
Данный пример был мной написан для одного из разработчиков, которому потребовалась помощь в выводе отчета. При этом мы находились в разных местах и у меня не было возможности подключиться к базе заказчика, на которой необходимо было реализовать отчет. Это я акцентирую внимание на еще одной области применения данного метода.
-
Пусть необходимо реализовать отчет следующего вида
-
Порядок показателей должен быть быть постоянным
-
У каждого показателя свой алгоритм расчета
-
Показатель Количество бункеровок является суммой бункеровок по портам
-
Сворачивание портов необязательно и заказчику оно не нужно
-
Изначально понятно, что будем использовать три набора данных через объединение. Создадим их с заглушками запросов. Порты пока откладываем
-
Сразу можно вывести то, что получилось в отчет
-
Дальше выводим порты. Для этого нужно немного исправить третий набор данных
Имеем результат
-
Делаем отступ слева у портов. Для этого сначала добавляем признак ЭтоПорт в запрос
Далее используем условное оформление, предварительно добавив порт в группировку
-
Чтобы скрыть количество в заголовке, пишем пробел в заголовок
-
После этого имеем результат как на картинке из п.1. Теперь структура ожидаемых полей запроса известна, можно в каждом наборе данных последовательно описать запрос вместо заглушки.
Описанное решение не является идеальным. Оно приведено здесь только для демонстрации использования запросов-заглушек. На самом деле практическая задача была чуть сложнее, но некоторые детали опущены, т.к. они не имеют отношения к теме данной публикации. Прототип отчета приложен к публикации.
Заключение
Для генерации запросов-заглушек удобно использовать инструмент, приложенный к этой публикации или написать его самостоятельно. Суть его очень простая: описываем таблицу в табличном макете и по ней генерируем текст запроса-заглушки