Предисловие
Исторически сложилось так, что придя на новое рабочее место, мне было поручено создать несколько отчетов используя Microsoft Reporting Services. До моего прихода, компания, в которой я работаю по сей день, использовала для построения отчетов Sybase DataWindow. Но в момент моего прихода было принято решение о переходе на Reporting Services, таким образом мне выпала честь пройтись этим тернистым путем и набить не одну шишку. В процессе создания отчетов накопилось достаточно много полезных советов новичкам, некоторыми из них хочу сегодня поделиться.
0) Старайтесь использовать таблицы там где это возможно
Использование таблиц позволяет избежать большому числу проблем связанными с форматированием данных в отчете.
Рассмотрим пример с использованием texboxes:
Данный способ будет работать корректно до тех пор пока данные не превысят длины texboxa. Как только длина будет больше, текстбокс изменит свою высоту, что приведет либо к перекрытию остальных контролов находящихся снизу, либо остальные будут смещены вниз.
При использовании таблицы такого не случится, все данные будут держаться вместе и если встретиться длинный текст, то данные будут подвинуты корректно без перекрытий и неожиданных смещений
Примечание: посути таблица это контейнер для других контролов. Каждая ячейка по умолчанию является texbox-ом
1) Не забывайте устанавливать размеры отчету
Этим вы избежите проблем при экспорте отчета например в PDF формат. Если не указать размеры, то высока вероятность получить в место одной страницы – две и более.
В большинстве случаев отчеты печатают на лист А4, поэтому приведу пример как это может выглядеть:
1) Кликам правой клавишей на отчете и выбираем «Report properties
2) Выбираем положение(Orientation) в зависимости от отчета
3) Выбираем размер бумаги(Paper size) равный А4
4) Устанавливаем поля(В моем случае это 1 см)
5) Нажимаем «Ок»
6) Последний важный штрих: Устанавливаем ширину страницы для тела (Body) отчета. В моем случае это 19см т.к ширина А4 21см, а отступ слева и справа по 1 см. Получаем размера тела 21-2 = 19. Если использовать положение страницы Landscape (29.7 cm) то размер тела будет 27.7 см. Этот момент очень важен, если тело будет хотябы на 1 мм длиннее то при экспорте в PDF получим 2 листа вместо 1.
2) Используйте проверку на null и приведение типов при арифметических операциях
Если в ячейке таблицы задана арифметическая формула, добавьте проверку на null(Метод IsNothing ) и используйте приведение типов.
В случае с числами с плавающей точкой преобразуйте к double (Метод CDbl )
Пример использования: Допустим, что у нас в таблице есть поле которое состоит из суммы нескольких полей(Данный пример возможно не самый лучший, т.к эту сумму можно получить на уровне SQL, но для наглядности подойдет). Имеем поле А(в базе данных тип INT) и поле В(а базе данных тип Numeric(28,12)). Тогда Expression для вычисляемого поля будет выглядеть следующим образом:
=CDBl(IIF(IsNothing(Fields!A.Value),0, Fields!A.Value)) + CDBl(IIF(IsNothing(Fields!B.Value),0, Fields!B.Value))
Собственно что происходит: производим проверку значения на null если значение равно null, берем 0, иначе используем значение поля. Производим приведение к типу double(CDBl) и слаживаем. Приведение к типу double не обязательно но желательно, т.к в случае больших чисел есть большая вероятность в место результата получить #Error
3) Повторение шапки сложной таблицы на каждой странице
Для простых таблиц все просто, выставляем в свойстве таблицы флаг «Repeat header columns on each page» и дело в шляпе. В сложных таблицах(состоящих из нескольких групп ) такой способ работать не будет. Для этого нужно открыть «Advanced Mode»
И выбирая соответствующие строки устанавливать свойство «RepeatOnNewPage» на True
4) Разбивка на страницы при экспорте в Excel
Очень часто при экспорте данных в таблицу Excel возникает потребность разбивать данные на листы. Причин может быть несколько, например при использовании старых версий Excel(версия 2003 или ниже ) существуют ограничения на максимальное количество строк на 1 листе(65536 строк) или нужно на каждой странице отобразить сгруппированные данные. Для этого нам в помощь приходит группировка.
Рассмотрим пример с экспортом набора данных который превышает 65536 строк.
1) Создаем группу
2) В свойстве группы нажимаем кнопку для ввода Expression
и вводим условие:
=CInt(Ceilng(RowNumber(Nothing)/65000))
3) В свойствах группы на закладке Page Breaks устанавливаем флаги как показано на рисунке
5) Раскрашиваем строки
Часто необходимо произвести выделение иным цветом какие-то данные(Например сделать раскраску аля «зебра») Делается это написанием условия(Expression) для свойства BackgroundColor
= IIF(RowNumber(Nothing) Mod 2, "White", "Gainsboro")
Если необходимо выделить например отрицательные значения красным цветом, то это можно сделать следующим условием в свойстве ячейки «Color»
=IIF(ReportItems!YourCell.Value < 0, "Red", "Black")
6) Разрыв страницы
Иногда нужно вставить разрыв страницы за определенным блоком, сделать это очень просто. Необходимо разместить объект типа «Rectangle» в том месте где это необходимо.
В свойствах Rectangle установить PageBreak-BreakLocation = Between. Здесь так же есть полезное свойство «ResetPageNumber» используемое в случае если необходимо сбросить нумерацию страниц
На этому пока все, новая партия советов в следующем выпуске.
Автор: sashka304