Итак, перед нами стоит следующая задача:
Есть регистр сведений «Остановки по маршруту» в котором хранится информация о расстоянии от начальной до конечной остановки.
Рис. №1 Регистр сведений «Остановки по маршруту».
Требуется разработать отчет на СКД, который покажет расстояние между двумя остановками по маршруту.
Отчет представляет собой прямоугольный треугольник, на гипотенузе названия остановок по порядку. На пересечении горизонтальной и вертикальной линии от двух остановок заполнено значение, равное расстоянию между этими остановками. Например, расстояние между «Борок» и «Мологино» 6,3 км (Рисунок №2).
Важно: Отчет должен быть разработан без программного кода при помощи набора данных – Запрос. Текст запроса должен быть один.
Рис. №2 Отчет «Таблица расстояний».
Решение
1. Самым важным был первый шаг, в ходе долгих мучений и экспериментов, было принято решение использовать вложенные схемы компоновки данных. Зачем это необходимо? Все очень просто, для того, чтобы была возможность соединения идентичных данных между собой. Ведь, если мы используем 1 схему, система компоновки данных понимает, что обращение идет к одной и той же таблице и не дает нам представить эти данные в виде кросс-таблицы. Т.е. даже если мы создадим таблицу колонками и строками, которой будут идентичные данные из 1 источника, мы не сможем заполнить ресурсы, которые у нас будут располагаться ниже или выше диагонали (при этом, на диагонале будут расположены ресурсы с расстояниями до пункта назначения, т.е. данные мы сможем вывести только на пересечении одинаковых остановок, что нас не очень устраивает).
При использовании вложенных схем компоновки данных, у нас появляется возможность выводить данные по вертикали и по горизонтали за счет того, что в этом случае СКД не учитывает источники данных и разрешает использовать в группировке вложенные схемы, которые могут содержать данные отличные от содержащихся в группировке. Например, без использования вложенных схем, имеем группировку по полю "Остановка" и пытаемся вывести под этой группировкой еще 1 содержащую другие остановки, у нас этого сделать не получится, т.к. СКД понимает что Остановка является разрезом данных и не дает нам вывести в детальных записях данные не относящиеся к "Остановке" в верхней группировке. При использовании же вложенных схем мы легко сможем под группировкой "Остановка" вывести любые данные из вложенной схемы.
Итак, сделаем схему компоновки данных с набором данных Запрос:
Сразу создадим элемент отбора "Маршрут" в родительской схеме, как того требует задание:
После чего к получившейся схеме добавим вложенную схему с таким же набором данных, назовем ее "ПредыдущиеОстановкиПоМаршруту". Во вложенной схеме при этом не делаем никаких настроек (потому что родительская схема все равно будет отдельно хранить свои настройки для вложенной схемы). Теперь мы можем приступить к склейке этих наборов средствами СКД.
2. Настраиваем группировки в родительской схеме компоновки данных, в верхней группировке добавляем 2 группировочных поля "Маршрут" и "Остановка" ("Маршрут" нам необходим для того, чтобы была возможность накладывать отборы на вложенную схему по этому полю):
На выходе получаем отчет вида:
Видим, что для каждой остановки родительской схемы у нас существует связанный набор всех остановок. Соединение 2-х наборов средствами СКД мы уже получили, теперь остается самое интересное...
3. Теперь нам необходимо сделать так, чтобы каждая строка вложенной схемы содержала те данные, которые необходимо, а именно все предыдущие остановки, которые идут перед текущей остановкой родительской схемы и расстояния до этих остановок. Для этого настраиваем отборы вложенной схемы (в настройках родительской схемы) следующим образом:
Так же настроим сортировку по расстоянию для родительской схемы (это необходимо для того, чтобы остановки шли в порядке следования, соответственно и для корректного отображения отчета):
И не забываем упорядочить колонки вложенного отчета по возрастанию расстояния от начала маршрута:
Получаем отчет вида:
Видим, что наш прямоугольный треугольник уже начинает быть похожим на истину :)
Теперь нам необходимо рассчитать расстояние, которое будет выводиться во вложенном отчете.
4. Создаем во вложенной схеме компоновки данных вычисляемое поле:
Это поле работает следующим образом: сначала получаем расстояние до последней точки маршрута (при этом учтем, что последней точкой маршрута с учетом наложенных отборов на вложенную схему будет являться остановка, расположенная на диагонали, остановка из верхней группировки родительской схемы), далее мы берем разницу между значением этого поля и расстоянием от начала маршрута для каждой из наших остановок, присутствующих во вложенной схеме и получаем искомое значение, которое мы будем выводить в отчет. Не забываем добавить созданное вычисляемое поле на вкладку "Ресурсы" вложенной схемы.
В итоге у нас получается вот, что:
Все, что нам остается - это привести отчет в нормальный вид, но эти манипуляции в рамках данной статьи я описывать не буду, т.к. это нюансы, их можно посмотреть в выгрузке информационной базы, приложенной к публикации.
После манипуляций отчет имеет следующий вид:
Между вложенными отчетами остаются промежутки, и убрать их можно только программным кодом, при необходимости можно найти информацию, как это сделать.
В общем, осваивайте СКД и ее новые функции, они позволят вам делать самые сложные невообразимые отчеты, и скоро вы сможете получать удовольствие от использования СКД.
© senior-soft.ru Все права защищены.