Элемент управления "разряд" в Reporting Services 2008 R2

Продолжаем рассказ о нововведениях в Reporting Services 2008 R2 из серии пустячок, а приятно. В прошлой серии мы посмотрели, как можно подстраивать внешний вид отчета в зависимости от того, в какой формат идет рендеринг, при помощи новой глобальной переменной RenderFormat. Сегодня мы рассмотрим новый тип Report Item под названием Sparkline, который я самонадеянно перевел как разряд. Имеется в виду не битик в позиции и не спортивная квалификация, а электрический шарах. Когда выйдут русские Books On-Line, мы узнаем, как он переводится правильно, а пока пусть будет так.

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

Абсолютно типовым сценарием для использования разряда является селлсет о двух измерениях. Первое пускается вниз по оси Y, рядом с ним, допустим, отображается мера, свернутая по второму измерению, а рядом с ней делаем еще одну ячейку, в которой в виде графика-разряда раскрываем поведение меры вдоль второго измерения. Первое измерение в этом графике, разумеется, будет порезано по своему мемберу из первой ячейки. Кто-нибудь понял, что я сказал? Неважно, сейчас будет все предельно ясно. Открываем новый проект в Report Designer, создаем новый датасет против БД AdventureWorksDW2008R2. Кто не знает, где она берется, читают здесь. В AdventureWorksDW2008R2 нас будут интересовать следующие таблицы:

image

Рис.1

Датасет будет получаться из следующего запроса:

select pc.EnglishProductCategoryName Род, psc.EnglishProductSubcategoryName Вид, d.CalendarYear Год, d.MonthNumberOfYear Месяц, sum(s.SalesAmount) Деньги from dbo.FactInternetSales s

join dbo.DimProduct p on s.ProductKey = p.ProductKey

join dbo.DimProductSubcategory psc on p.ProductSubcategoryKey = psc.ProductSubcategoryKey

join dbo.DimProductCategory pc on psc.ProductCategoryKey = pc.ProductCategoryKey

join dbo.DimDate d on s.OrderDateKey = d.DateKey

group by pc.EnglishProductCategoryName, psc.EnglishProductSubcategoryName, d.CalendarYear, d.MonthNumberOfYear

order by 1, 2, 3, 4

Скрипт 1

image

Рис.2

В результате запроса, как мы видим, получается подкубик из двух измерений: Товар с уровнями Род и Вид и Время с уровнями Год и Месяц. По детальному уровню Продукт делается свертка, т.к. он нужен только для связывания с фактами и непосредственно в отчете представлен не будет. Деньги являются мерой.

В Report Designere создадим матрицу. Перетащите из датасета (левая панель) в первую колонку поле Род. Если панель с датасетом не видна, скажите в меню View -> Report Data (последний пункт), он же Ctrl-Alt-D.

image

Рис.3

Теперь ступайте в панель групп внизу. Если она не видна, нажмите обведенную на Рис.3 кнопку. Добавьте к группе Род, автоматически образовавшейся при перенесении поля Род из датасета в матрицу, дочернее группирование по полю Вид.

image

Рис.4

Перенесите поле Деньги в ячейку фактов с блеклой серой надписью Data. По умолчанию в кач-ве агрегатной ф-ции будет выбрана сумма. Отцентрируйте заголовки колонок табликса, покрасьте их в жирный цвет, наведите прочие красивости по вкусу.

image

Рис.5

Смотрите, какой классный отчет у нас с вами получился.

image

Рис.6

Отчет показывает суммы продаж в разрезе по уровням измерения Товар. Однако в датасете Рис.2 имеется еще измерение Время. Давайте его задействуем в графике-разряде, чтобы показать, как сумма продаж по каждому товару складывалась из продаж по периодам времени.

Добавьте в таблицу еще одну колонку в пределах группы Вид:

image

Рис.7

Перетащите в нее из панели инструментов элемент управления Разряд.

image

Рис.8

Выберем тип графика, допустим, линии:

image

Рис.9

Кликните на ячейку, в которую вы поместили разряд, чтобы справа появилась всплывающая панель его свойств Chart Data. В верхнюю часть (Values) перетащите из датасета поле Деньги. В среднюю часть (Category Groups = ось Х) перетащите поля Год и Месяц. Год нужен для того, чтобы месяца за разные годы не перемешивались, т.к. поле Месяц - не содержит признака года, это просто номер месяца. Наличие родительской группы Год позволит разделить месяцы по годам. Нижнюю часть (Series Groups) оставьте пустой - у нас не будет несколько графиков на одной координатной плоскости.

image

Рис.10

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

image

Рис.11

Все, смотрим Preview:

image

Рис.12

По мне, так красота неописуемая. Отчет показывает продажи в разрезе по товарной продукции, в то же время колонка Динамика продаж содержит график, позволяющий судить о динамике продаж каждого товара в разрезе по времени. Сравните, допустим, график в первой строчке (Accessories - Bike Racks) с помесячными цифрами Рис.2. По-моему, похоже.

Нельзя сказать, что разряды, равно как и столбики (Bars), появившиеся в R2, являются чем-то принципиально новым. Те, кто примерно год назад заходил на покойный sqlclub.ru, должны помнить мою статью "Комплексная вводная дема по BI", где при помощи SSIS в кубик собирался размер каждого файла на диске, агрегировался по папкам в измерении parent-child и отображался численно и визуально в виде полосок разной длины в отчете. Ввиду отсутствия в то время всяких bars, sparklines и прочих украшательств я затаскивал в ячейку обычный Chart в виде горизонтальных баров, удаляя легенду, оси, подписи и прочую оснастку, как описано здесь. Следует иметь в виду, что при описанном в посте раскладе график нельзя кидать в детальную ячейку, что, к сожалению, недостаточно четко отражено у Шона. Из-за этого будет возникать ошибка Detail members can only contain static inner members, несколько раз упомянутая в комментах. Аналогично, если положить в детальную ячейку разряд, будет выдана ошибка Unsupported Action. Cannot insert a multi-value item into a detail cell. Это происходит потому, что график, очевидно, требует наличия нескольких значений. Однако в той же строке могут находиться в ячейках скалярные величины. Чтобы уместить последовательность в такую же ячейку, строка должна быть сгруппирована. Если в строке таблицы создать группу, график-разряд спокойно ляжет в групповую ячейку. Единственно, таблица обязана иметь детали, что означает, что рядом с групповыми колонками и графиком будет находиться детализированная колонка, что хорошо с точки зрения выверки тренда, т.к. детальные данные как раз и означают помесячные продажи (ср. с Рис.2), но не очень хорошо с точки зрения визуальности, поэтому в предыдущей иллюстрации под такого рода многомерный датасет была положена не таблица, а матрица.

image

image

Рис.13

Для нужд отладки лучше использовать другую возможность. Разряд, будучи по своей природе графиком, может быть преобразован в полноценный Chart. Предположим, мы обнаружили, что тренды на Рис.12 не слишком совпадают с количественной динамикой Рис.2. Допустим, забыли добавить категорию Год на Рис.10 или добавили не в том порядке, и месяцы перемешались. Но мы об этом еще не знаем. Чтобы выяснить причину, положим отдельный разряд не в матрицу, а рядом на тело отчета. Создадим новый датасет, добавив условие

where psc.EnglishProductSubcategoryName = 'Bike Racks'

Скрипт 2

Это то, что лежит у нас в первой строчке. Перетащим на график аналогично Рис.10 поля датасета в значения и категории, после чего выберем из контекстного меню пункт Convert to Full Chart. Это однонаправленное действие, зато мы можем теперь видеть подписи вдоль осей, контролировать, каким значениям соответствуют всплески и падения на разряде, и своевременно исправить допущенные неточности.

image

image


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=23996