Практикум прикладного программирования на C# в среде VS.NET 2008

Создание отчетов Crystal Reports.NET в графическом режиме

Разбить на страницы
Показывать лекцию целиком

Введение

Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.

Генератор отчетов Crystal Reports был создан компанией Crystal Decisions в 1992 году и разрекламирован как "первый в мире генератор отчетов для Windows". С тех пор этот программный продукт интенсивно развивается и существует как самостоятельный пакет, так и в виде интегрированной в Visual Studio .NET библиотеки. В настоящее время этой работой занимается компания Business Objects (может переименовалась, а может другая, хотя вряд ли - миллионы продаж лицензий в год по всему миру, кто же бросит такой бизнес!). По соглашению с изготовителем компания Microsoft стандартизовала этот пакет в качестве машины формирования отчетов по технологии Crystal Reports .NET, которая включает в себя:

  • Встроенный контструктор отчетов Report Designer, которым можно пользоваться при построении файлов отчетов ( .rpt ), а затем встраивать их в разрабатываемое приложение
  • Модуль просмотра Windows Forms Viewer можно использовать для предварительного просмотра отчетов, встроенных в приложение, с гибким управлением представления содержимого отчета
  • Модуль просмотра Web Forms Viewer той же функциональность, но применительно к Web-приложениям
  • Машина формирования отчетов Report Engine (набор классов библиотек CrystalDecisions.CrystalReports.Engine.dll, CrystalDecisions.Shared.dll и др.) дает возможность программировать даже самые тонкие аспекты отчетов перед передачей их в модуль просмотра или печати
  • Система планирования и распределения отчетов Crystal Enterprise обеспечивает возможность рассылки отчетов большому количеству пользователей
  • Пакет Crystal Reports для Visual Studio .NET является мощным дополнением к комплекту инструментальных средств самой среды разработки. При помощи конструктора отчетов Reports Designer можно создавать и модифицировать отчеты в графическом режиме самой Visual Studio .NET, а с помощью встроенных модулей легко интегрировать отчеты в проект и получать нужную функциональность Windows- или Web-приложения.

    Технология Crystal Reports.NET гармонично связана с ADO.NET. При их совместной работе доступ к данным заметно упрощается. Вместо того, чтобы изобретать способы доступа к различным источникам данных, Crystal Reports .NET может просто обратиться к объекту DataSet (к типизированному или нетипизированному) из ADO.NET как к источнику для генерации любого заданного отчета.

    Различают отчеты двух типов по способу выборки данных:

  • Pull (выталкивание) - машина Crystal Reports сама связывается с БД и выталкивает из нее данные в отчет согласно своим настройкам по выборке данных
  • Push (заталкивание) - с БД связывается ADO-приложение своими средствами доступа к данным, выбирает нужные данные по своим критериям, а машина Crystal Reports уже готовые данные заталкивает в отчет и обеспечивает только удобное представление данных и их печать
  • Вначале мы познакомимся с выборкой и представлением данных средствами Crystal Reports, т.е. будем использовать Pull -режим. В дальнейшем мы рассмотрим способы программирования отчетов на уровне кода C# в самом приложении, а машину Crystal Reports будем использовать для представления и печати уже готовых данных в Push -режиме.

    Примеры приложений с Pull -отчетами можно найти в архиве, поставляемом вместе с Visual Studio .NET, который находится в каталоге C:\Program Files\Microsoft Visual Studio 9.0\Crystal Reports\Samples\En\Code

    Здесь же содержится свободно распространяемый пакет самостоятельного продукта Crystal Reports, в котором можно готовить отчеты отдельно, а затем включать их в приложение, которое может и не использовать возможности ADO.NET. Во всех примерах используется БД xtreme.mdb (учебная БД компании по производству горных велосипедов) формата Access, которая содержит списки заказчиков, заказов, продукции, поставщиков и служащих. Эта база управляется средствами ADO.NET и Crystal Reports .NET и не требует установки системы Access. Схема БД xtreme.mdb приведена на рисунке

    В данной лабораторной работе мы будем пользоваться прежней учебной базой Northwind.mdb и изредка новой учебной базой xtreme.mdb, применяемой в примерах Crystal Reports. БД xtreme.mdb должна быть уже зарегистрирована в операционной системе автоматически после установки Visual Studio 2008. Это можно легко проверить, выполнив команду Настройка/Панель управления/Администрирование/Источники данных (ODBC). Окно настроек System DSN (Data Source Name) должно содержать имя БД xtreme.mdb.

  • Если это не так, щелкните на кнопке Добавить, из списка выберите драйвер *.mdb после чего в следующем окне найдите БД xtreme.mdb (прилагается в каталоге Source ) и зарегистрируйте ее
  • Упражнение 1. Создание отчета Crystal Reports с помощью мастера Standard Report Creation Wizard

    Мало кто, даже из опытных пользователей, создает приложение, в том числе и отчет, с нуля. Как правило, для этого в среде разработки предусмотрено множество мастеров, которые являются путеводителями в рамках всего процесса визуального проектирования. В данном упражнении мы познакомимся с мастером Standard Report Creation Wizard. Но в Crystal Reports есть много и вспомогательных инструметов, которые называются экспертами.

  • Создайте новый проект с именем WinReport1 в решении ADO по следующему шаблону
  • Задайте заголовок формы Упражнение 1
  • Командой Project/Add New Item добавьте к проекту новый отчет Crystal Report, настроив окно мастера следующим образом
  • Откроется новое окно галлереи отчетов Crystal Reports Gallery.

    Здесь мы видим три переключателя, объединенные в группу Create a New Crystal Report Document, а под ней - список предлагаемых экспертов. Переключатели олицетворяют выбираемый метод проектирования отчета и обозначают следующее:

  • Using the Report Wizard - создание отчета с использованием мастера, подходит для большинства программистов. Далее отчет можно доработать с помощью конструктора (дизайнера) отчетов
  • As a Blank Report - создание отчета с нуля как пустого, продходит для опытных программистов (при выборе этого метода эксперты становятся недоступными). Отчет разрабатывается только средствами дизайнера отчетов
  • From an Existing Report - создается новый отчет на основе уже существующего отчета (эксперты недоступны) и может быть доработан с помощью дизайнера отчетов
  • Если принято решение воспользоваться мастером отчетов, то далее нужно выбрать один из трех предлагаемых экспертов:

  • Standard - эксперт стандартных отчетов, используется чаще других и является наиболее универсальным.
  • Cross-Tab - отчет с перекрестными ссылками
  • Mail Label - применяется для вывода почтовых этикеток
  • В данном упражнении мы будем использовать эксперт Standard.

  • Выберите метод Using the Report Wizard и эксперт Standard и щелкните на кнопке OK
  • Мастер проведет разработчика через несколько вкладок. На каждой вкладке кнопка Finish мастера создания отчетов всегда доступна и его работу на любой вкладке можно прервать. Но не будем торопиться ее нажимать, а пройдем все предлагаемые вкладки, иначе несделанную автоматизированную работу по настройке отчета придется потом доделывать вручную в графическом режиме дизайнера отчетов Report Designer.

    Вкладка Data

    Следующее действие при работе с экспертом заключается в выборе источника данных для отчета.

    Появившееся окно мастера предлагает выбрать следующие варианты источника:

  • Project Data - наборы данных, которые используются в проекте приложения
  • Current Connections - источники, с которыми установлено соединение в приложении
  • Favorites - предподчтимые источники данных
  • History - ранее используемые источники данных
  • Create New Connection - иные способы выбора источников
  • Как один из множества вариантов, дважды щелкните на узле ODBC (RDO)/Make New Connection и в появившемся окне выберите Xtreme Sample Database 2008, как показано на рисунке
  • Щелчок на кнопке Finish окна Data Source Selection завершит процедуру выбора источника, откроет его соединение с мастером в режиме проектирования и вновь вернет нас к вкладке Data мастера Standard Report Creation Wizard. Если пройти в этом окне по кнопке Next, то появится вкладка выбора стилей генерации отчета

  • Оставьте стиль по умолчанию Standard и вернитесь на вкладку Data мастера Standard Report Creation Wizard
  • Раскройте узел соединения с выбранным источником данных Xtreme Sample Database 2008 и переместите в список выбора Selected Tables две таблицы Customer и Orders
  • Через контекстное меню для узла Tables можно вызвать командой Options окно настроек параметров работы с источником данных. Оно позволяет настроить параметры отображения информации об источнике данных в данном конкретном случае: отфильтровать какие-то таблицы или представления, показать служебные таблицы и т.п.

    Вкладка Link

    Теперь, если пройти по ссылке Next к следующей вкладке мастера, то это уже будет вкладка Link, которая отображает связи или дает возможность их установить между полями таблиц.

  • В данном упражнении нам нужна только одна таблица, поэтому вернитесь на вкладку Data и удалите (верните) из списка Selected Tables таблицу Orders, оставив только одну таблицу Customer
  • Вкладка Fields

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

  • Перейдите на следующую вкладку Fields мастера, раскройте узел полей таблицы Customer и переместите в список Fields to Display пять полей, как показано на рисунке
  • Именно эти поля БД будут участвовать в формировании отчета.

    Вкладка Grouping

    После щелчка на кнопке Next появится следующая вкладка Grouping мастера, в которой можно часть полей отсортировать или сгруппировать.

  • Выберите в списке слева поля для группировки и после перемещения их в список справа установите порядок следования в соответствии с рисунком
  • Обратите внимание на раскрывающийся список справа внизу, который позволяет изменить порядок сортировки данных в выбранных полях внутри каждой группы при их выводе в отчет ( in ascending order - в порядке возрастания, in descending order - в порядке убывания).

    Вкладка Summaries

    Очень часто в отчет нужно вставлять требуемые сводки, подсчитывающие те или иные итоговые результаты. Это и позволяет на этапе создания отчета выполнить рассматриваемая вкладка, следующая за вкладкой Grouping.

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

  • Выделите в правом списке группу Customer.Country и из левого списка добавьте в нее базовое поле Last Year's Sales, а в раскрывающемся списке закрепите за вычислимой сводкой операцию Sum (как показано на верхнем снимке)
  • В таблице перечислены наиболее часто используемые операции для полей сводок.

    Некоторые операции вычисления сводок
    Операция вычисления сводки Описание
    Sum (Сумма) Вычисляет сумму всех элементов
    Average (Среднее значение) Вычисляет среднее значение всех элементов
    Sample   variance (Выборочная дисперсия) Вычисляет статистическую выборочную дисперсию конкретной выборки элементов
    Sample standard deviation (Среднее выборочное отклонение) Вычисляет среднее статистическое выборочное отклонение заданной выборки элементов
    Maximum (Максимум) Возвращает максимальное значение
    Minimum (Минимум) Возвращает минимальное значение
    Count (Общее число) Вычисляет общее число элементов списка
    Distinct count (Подсчет числа только уникальных элементов) Подсчитывает число неповторяющихся элементов, например, если слово 'Дурак' встречается много раз, то оно засчитывается только однажды
    Correlation with (Корреляция) Вычисляет меру отношений между двумя или более элементами
    Covariance with (Ковариантность, смешанный момент второго порядка) Вычисляет меру дисперсии между двумя или более элементами
    Median (Медиана) Вычисляет статистическую медиану всей совокупности элементов
    Mode (Мода) Вычисляет статистическую моду (наиболее вероятное значение) всех элементов
    Nth largest, N is: ( N -е максимальное число) Возвращает N -й максимальный элемент (где N есть предопределенное число)
    Nth smallest, N is: ( N -е минимальное число) Возвращает N -й минимальный элемент (где N есть предопределенное число)
    Nth most frequent, N   is: ( N -е наиболее часто встречающееся значение) Возвращает N -е наиболее часто встречающееся в списке значение (где N есть предопределенное число)
    Pth percentile, P is: ( P -й процентиль) Вычисляет P -й процентиль (где P есть предопределенное число)
    Population variance (Дисперсия генеральной совокупности) Вычисляет статистическую дисперсию всей генеральной совокупности элементов
    Population standard deviation (Среднее отклонение генеральной совокупности) Вычисляет среднее отклонение всей генеральной совокупности элементов
    Weighted average with (Взвешенное среднее значение) Вычисляет среднее значение, взвешенное по числу раз появления элементов

    Вкладка Group Sorting

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

    Вкладка Chart

    Эта вкладка служит для включения в отчет диаграмм и графиков.

    Эта вкладка настраивает машину построения диаграмм и графиков, работающую по технологии 3D-графики. Чтобы включить вычисление диаграммы в отчет, нужно выбрать тип диаграммы, а затем указать, откуда должны поступать данные для ее построения. Наиболее распространенным типом диаграммы является групповая диаграмма, которая требует, чтобы в отчет были вставлены поле группы и поле сводки.

    Вкладка Record Selection

    При формировании отчета на базе нескольких таблиц может понадобиться включать в отчет только часть данных из этих таблиц, выбирая их по определенному критерию. Нужные поля помещаются в правый список вкладки и для них в появившемся раскрывающемся списке формул фильтрации закрепляется определенный критерий. При выполнении отчета этот критерий преобразуется в SQL-запросы, передаваемые в БД для выборки помещаемых в отчет данных.

    Фильтр, закрепляемый за полями, при невозможности преобразования в SQL-запрос реализуется собственными средствами генератора отчетов. Здесь интересно отметить, что Crystal Reports самостоятельно связывается с БД и выбирает из нее указанные данные по настроенным критериям.

    Последней вкладкой мастера создания отчета является Report Style, устанавливающая внешний вид будущего отчета.

  • Щелкните на кнопке Finish и мастер создаст заготовку отчета, которую откроет в конструкторе Report Designer (в режиме дизайнера)
  • Обратите внимание на две вкладки внизу рабочей области дизайнера отчета. Они позволяют переключаться в режим конструирования или предварительного просмотра отчета. Наш сгенерированный отчет изначально состоит из 5 основных секций:

  • Report Header - заголовок всего отчета (обычно сюда помещается титульная страница, логотип компании, диаграммы, сведения об авторе и т.п.). По умолчанию обычно подавляется (Suppress).
  • Page Header - заголовок для страницы (заголовки полей, колонтитул для отчета, номера страниц)
  • Group Header - заголовок, или верхний колонтитул, группы. Появляется в начале каждой группы и обычно используется для вывода названия группы
  • Details - поля базы данных или формул (собственно данные из отчета)
  • Group Footer - нижний колонтитул группы. Появляется в конце каждой группы и обычно используется для вывода названия группы, промежуточных или итоговых сумм
  • Report Footer - итоговое поле в конце отчета (общие итоги, авторские права, официальные предупреждения, диаграммы, объекты Cross-Tab для отчета в целом)
  • Page Footer - нижний колонтитул для страницы (номера страниц, описания рисунков, примечания)
  • Дополнительными являются секции Group Header и Group Footer, созданные мастером при формировании групп. Одновременно появится панель Field Explorer (Проводник полей) и дополнительное меню Crystal Reports. Панель можно включить в режиме Report Designer через меню Crystal Reports/Field Explorer или View/Other Windows/Document Outline или щелкнув на пиктограмме Toggle Field View панели инструментов. В состав оболочки .NET включены две панели инструментов: Crystal Reports - Main и Crystal Reports - Insert.

    В панели Field Explorer представлены контейнеры со всеми объектами типа поле, которые могут присутствовать в отчете:

  • Database Fields (Поля базы данных) - отображаются те поля, которые напрямую поступают из базы данных. Как правило, эти поля размещаются в секции Details (Подробности)
  • Formula Fields (Поля формул) - при помощи этого контейнера в отчет можно добавлять поля формул
  • Parameter Fields (Поля параметров) - поля параметров редко используются в отчетах напрямую. Чаще всего они применяются для фильтрации данных в отчете. Однако можно напрямую поместить поле параметра в какую-либо секцию отчета
  • Group Name Fields (Поля имен групп) - обычно они генерируются и добавляются в отчет автоматически, однако при желании их можно добавить в отчет из этого контейнера (после того, как будет создана группировка)
  • Running Total Fields (Поля нарастающих итогов) - специальные поля, значение которых зависит от значения такого же поля для предыдущей записи
  • SQL Expression Fields (Поля SQL-выражений) - используются специальные формулы, вычисление которых производится на сервере баз данных. К сожалению, можно использовать только такие поля выражений SQL, которые возвращают скалярные значения
  • Special Fields (Специальные поля) - многочисленный набор служебных полей отчета
  • Unbound Fields - не связанные с данными поля
  • Добавление полей на форму отчета в режиме Report Designer осуществляется простым перетаскиванием поля из панели Field Explorer в нужное место формы либо через меню Crystal Reports, либо через контекстное меню формы отчета командой Insert. Настройка отображения поля осуществляется через окно Format Editor, вызываемое на форме в контекстном меню поля опцией Format Object.

    Команда Insert/Text Object вставляет на форму отчета текстовое поле, с помощью которого создаются надписи и другие элементы, подобные названиям столбцов и комментариев, которые не должны меняться в зависимости от информации, поступающей из источника. Затем обычным образом этому полю можно настроить параметры форматирования. Во многих ситуациях очень удобно помещать внутрь текстового поля обычные поля из таблиц базы данных. Можно перекрыть несколько текстовых полей друг поверх друга или поля заголовков и подавлять отображение ненужных средствами условного форматирования.

    Другими простыми средствами оформления отчетов, доступных через команду Insert, являются объекты

  • Line - просто линия, вертикальная или горизонтальная
  • Box - прямоугольник, который можно преобразовать в овал. Существует сам по себе. Если в него поместить какие-нибудь объекты (например, текстовые поля), то при перетаскивании объекта Box они перемещаться не будут. Для создания рамок вокруг полей лучше использовать их собственные свойства на вкладке Border окна Format Editor, а не объекты Box
  • Chart - для включения в отчет диаграмм и графиков
  • Picture - для включения рисунков
  • OLE Object - возможность вставить внутрь отчета Crystal Reports файл внешнего приложения. Чаще всего вставляются листы Excel, но можно вставить, например, аудио и видеоролики, документы Word, схемы Visio и т.п. - файл любого приложения, соответствующего стандартам OLE. При активизации этого объекта управление передается "ответственному" за него приложению, например, Excel, которое должно быть установлено на данном компьютере
  • Доступными специальными полями ( Special Fields ) являются следующие:

  • Print Date - дата печати отчета
  • Print Time - время печати отчета
  • Modification Date - дата последнего изменения отчета
  • Modification Time - время последнего изменения отчета
  • Data Date - дата считывания данных из БД
  • Data Time - время считывания данных из БД
  • Record Number - внутренний порядковый номер записи, присваиваемый всем записям, которые передаются в отчет
  • Page Number - номер страницы отчета
  • Group Number - внутренний порядковый номер, присваиваемый всем группам
  • Total Page Count - общее число страниц
  • Report Title - заголовок отчета, сохраненный в разделе Title окна Document Properties, открытого командой Report/Summary Info
  • Report Comments - комментарий, сохраненный в разделе Comments окна Document Properties
  • Record Selection Formula - формула выбора записей, используемая в отчете
  • Group Selection Formula - формула выбора групп, используемая в отчете
  • File Path and Name - полный путь и имя файла отчета
  • File Author - автор отчета, сохраненный в разделе Author окна Document Properties
  • File Creation Date - дата создания файла *.rpt отчета
  • Page N of M - текущая страница N из M страниц
  • Созданный мастером отчет существует независимо в отдельном файле и нужно внедрить его в наше приложение. Однако это не просто отчет, но еще и сгенерированный на языке C# класс CrystalReport1, расположенный в файле CrystalReport1.cs. Такой отчет называется типизированным.

  • Перейдите в режим дизайна формы, найдите в панели Toolbox вкладку Reporting и перетащите на форму компонент CrystalReportViewer
  • Установите свойство ReportSource компонента CrystalReportViewer в значение типизированного документа отчета
  • Запустите приложение, должен получиться отчет с полноценными элементами управления
  • В данном упражнении мы использовали компонент CrystalReportViewer из пространства имен CrystalDecisions.Windows.Forms, который позволяет просматривать отчет и печатать его.

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

  • Переведите файл нашего отчета CrystalReport1.rpt в режим дизайнера (вкладка внизу Main Report ) и через контекстное меню дизайнера (либо через меню Crystal Reports оболочки) вызовите эксперта Report/Group Expert, в котором верните из правого списка в левый все ранее созданные мастером группы
  • Обратите внимание, что все групповые секции в графическом представлении отчета исчезли и остались только основные секции

    Теперь введем сортировку для некоторых полей отчета, для чего воспользуемся экспертом Record Sort Expert.

  • Вызовите контекстное меню для отчета в режиме дизайнера и выполните команду Report/Record Sort Expert (либо то же самое выполните через меню Crystal Reports оболочки)
  • Настройте окно эксперта как показано на снимке, чтобы отчет сортировал данные по двум столбцам в указанном порядке, вначале по первому столбцу, а затем в рамках первого - и по второму
  • Обведите лассо (резиновая рамка) курсора сразу два поля Contact Title в секциях 2 ( Page Header ) и 3 ( Details ) и удалите эти выделенные поля, а остальные поля, также попарно выделяя курсором, распределите по горизонтали равномерно и задайте им достаточную для отображения данных ширину. Периодически переключайтесь в режим Main Report Preview (кнопка внизу рабочей области) для контроля размещения данных
  • Для более точного выравнивания полей выполните команду Crystal Reports/Design/Default Settings, на вкладке Layout включите флажок Show Grid, сбросьте флажок отображения линеек в режиме проектирования Show Rulers и поменяйте значение шага сетки привязки Grid Size на 0,1
  • Щелкните на пиктограмме Toggle Field View панели инструментов оболочки, чтобы вызвать панель Field Explorer, раскройте узел Special Fields и поместите в середину секции Report Header поле Report Title
  • Выполните команду контекстного меню (или меню Crystal Reports оболочки) Report/Summary Info и заполните поле Title содержимым заголовка отчета
  • Выполните команду Report/Section Expert и для секции Report Header сбросьте флажок Suppress, установленный по умолчанию, чтобы включить ее в отчет
  • Вызовите контекстное меню для компонента Report Title, помещенного нами ранее в секцию Report Header, и выполните команду Format Object. Настройте вкладку Font как показано на рисунке
  • Выделите заголовок секции Section2 (Page Header) графического представления отчета и оттащите эту секцию вниз (зацепив мышью за верхнюю границу), чтобы компонент Report Title поместился по высоте в верхней секции Report Header
  • Измените размеры компонента Report Title так, чтобы весь заголовок поместился в нем. Периодически переключайтесь в режим Main Report Preview (кнопка внизу рабочей области) для контроля размещения заголовка, но предварительно сохраняйте отчет на диске (только после этого можно увидеть изменения)
  • Выделите на форме объект CrystalReportViewer и сбросьте его свойство DisplayGroupTree в значение False, чтобы дерево отчета вначале, при запуске проекта, не отображалось
  • Запустите приложение и получите ожидаемый результат
  • Упражнение 2. Создание отчета Crystal Reports с помощью дизайнера Report Designer

    В данном упражнении мы создадим отчет с нуля без помощи мастера, но используя графический режим дизанера отчетов Report Designer наподобие графического дизайнера Form Designer, позволяющего графически компоновать пользовательский интерфейс форм. Мы уже частично использовали его в предыдущем упражнении для донастройки отчета, созданного с помощью мастера.

    Создание заготовки приложения

    Прежде всего добавим к решению новый проект, но сделаем это отличным от прежнего способом.

  • Выполните команду оболочки File/New/Project и заполните окно мастера как показано на рисунке. При этом установите раскрывающийся список Solution в значение Add to Solution, а тип приложения выберите как Crystal Reports Application
  • Выберите режим создания проекта как пустого (не совсем) и тогда будет сгенерирована только простая заготовка отчета и форма Windows Forms с готовым объектом CrystalReportViewer
  • Обратите внимание, что настройки секций предыдущего проекта сохранились.

  • Перейдите на форму Form1 и убедитесь, что мастер заготовки создал строго типизированный документ отчета с компонентом просмотра CrystalReportViewer, только не подключил к нему источник данных
  • В предыдущем упражнении, когда мы пользовались мастером отчета, форма Windows Forms была пустой и мы сами размещали в ней элемент CrystalReportViewer.

  • Присвойте форме заголовок Упражнение 2 и назначьте проект WinReport2 стартовым
  • Создание типизированного набора данных

    Теперь создадим строго типизированный набор данных, который будет связываться с БД и к которому позднее мы подключим наш отчет.

  • Выполните команду меню оболочки Data/Add New Data Source и в качестве типа источника данных выберите Database
  • Пройдите по ссылке Next и на следующей вкладке мастера поключения щелкните на кнопке New Connection, чтобы создать новое соединение с источником данных
  • Через кнопку Browse выберите БД из прилагаемого к работе каталога Source или из другого источника, сразу протестируйте созданное соединение кнопкой Test Connection
  • На следующей вкладке мастера задайте новое имя строке подключения или оставьте сгенерированное по умолчанию (мы все равно ею явно пользоваться не будем)
  • Включенный флажок ' Yes, save the connection as:' означает, что строка соединения будет записана в конфигурационный файл приложения App.config и будет извлекаться из него менеджером конфигурации при каждом запуске исполнимой сборки проекта. В противном случае строку соединения с БД нужно будет прописывать вручную в коде приложения.

  • На следующей вкладке отметьте таблицу Customers, а имя типа создаваемого набора данных оставьте сгенерированным по умолчанию
  • Щелкните на кнопке Finish, чтобы мастер создал строго типизированный набор данных NorthwindDataSet для таблицы Customers, которую мы далее будем выводить в отчет
  • Через панели Solution Explorer и Object Browser можно убедиться, что мастер создал не только всю инфраструктуру для доступа к источнику данных, но и физически скопировал саму БД в каталог проекта, а также создал файл конфигурации App.config со строкой соединения с БД заданного типа.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <connectionStrings>
            <add name="WinReport2.Properties.Settings.NorthwindConnectionString"
                connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Northwind.mdb"
                providerName="System.Data.OleDb" />
        </connectionStrings>
    </configuration>
  • Проследите, чтобы файл БД был настроен на копирование его оболочкой в каталог сборки при компиляции проекта
  • Также было создано целое семейство классов для управления данными таблицы, упакованное не только в текущее пространство имен проекта WinReport2, но и в подпространство имен WinReport2.NorthwindDataSetTableAdapters из расчета, что будет создано несколько типизированных наборов в одном проекте

    Настройка отчета

    Теперь подошла очередь присоединить наш отчет к созданному объектному источнику данных и настроить его (отчет).

  • Перейдите в графический режим дизанера отчетов Report Designer и выполните команду контекстного меню Database/Database Expert
  • Раскройте узел Project Data и поместите в правый список таблицу Customers
  • Обратите внимание, что эксперты, вызываемые в режиме Report Designer, отличаются только заголовками окон от вкладок мастера Standard Report Creation Wizard, который мы использовали в предыдущем упражнении. Ну и правильно, проще подставлять новые заголовки, чем дублировать весь инструмент, да и нам попривычнее будет!

  • Щелкните на кнопке OK и отчет окажется подключенным к созданному ранее строго типизированному источнику данных
  • Откройте панель Field Explorer через меню Crystal Reports, контекстное меню Report Designer или щелчком на пиктограмме панели интсрументов 'Crystal Reports - Main' и разверните в ней узел Database Fields/Customers
  • Перетащите в секцию Details формы отчета поля CustomerID, CompanyName, Address, Region и распределите их равномерно по ширине листа. Позже мы скорректируем ширину рабочих полей, когда настроим приложение на просмотр отчета.
  • После отпускания кнопки мыши одновременно в секции Page Header тоже появится заголовок поля текстового типа, который можно отредактировать. Имена столбцов в секции Details не редактируются, а редактируется только их формат через команду Format Object контекстного меню. Следует иметь ввиду, что вертикальный размер секции Details определяет междустрочное расстояние выводимой в рабочую область отчета информации.

  • Перейдите на вкладку Main Report Preview эксперта Report Designer
  • Здесь можно увидеть, что в рабочей области отчета вместо реальных данных таблицы Customers подставляются дежурные значения, генерируемые Crystal Reports. Это происходит потому, что мы не напрямую соединились с БД, как это было в предыдущем упражнении, а через набор данных. На этапе проектирования созданный нами ранее типизированный набор данных заполнен только схемой таблицы Customers, поэтому Crystal Reports видит сейчас только названия полей и их типы. Но сам типизированный набор пока не содержит реальных данных таблицы и в отчет помещаются случайные данные, чтобы можно было представить их будущее расположение

  • Вернитесь на вкладку Main Report и поместите в секцию Report Header из раздела Special Fields панели Field Explorer поле Report Title
  • Выполните команду меню Crystal Reports/Report/Summary Info и заполните поле Title названием отчета, например, 'Отчет компании Рога и Копыта'
  • Настройте стиль заголовка по своему вкусу через контекстное меню поля Report Title, выполнив команду Format Object. Проследите через режим Main Report Preview, чтобы текст заголовка помещался в поле
  • Поместите в секцию Report Header из раздела Special Fields панели Field Explorer поля Data Date и Data Time и настройте их стиль по вкусу, вызвав через контекстное меню командой Format Object окно Format Editor. Проследите через режим Main Report Preview, чтобы содержимое помещалось в поле. Пользуйтесь групповым выделением полей отчета и перемещением в рамках секции с помощью клавиатурных стрелок.
  • Система Crystal Reports позволяет очень красиво и тонко настроить отчет, но в данном упражнении нам пока достаточна выполненных простых возможностей.

    Интеграция отчета в приложение

    Вспомните, что Crystal Reports может работать в двух режимах: Pull -выталкивание и Push -заталкивание. Мы в данном упражнении хотим реализовать режим Push и для этого подготовили форму простого отчета вручную с помощью Report Designer. Это форма отчета должна храниться в отдельном файле CrystalReport1.rpt вместе со сборкой и загружаться приложением из кода. Мы также подготовили типизированный источник данных NorthwindDataSet, который имеет все необходимые настройки для связи с БД и выборки нужных нам данных. Строка соединения хранится в конфигурационном файле. На форме Form1 размещен объект с именем crystalReportViewer1 для отображения отчета на этапе выполнения. Теперь осталось связать все вместе с помощью кода.

  • Перейдите в режим Form Designer для формы Form1 и двойным щелчком на ее заголовке (потому что в клиентской области размещен объект CrystalReportViewer ) создайте обработчик события Load, который заполните так
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
        
    using CrystalDecisions.Shared;
    using CrystalDecisions.CrystalReports.Engine;
    using CrystalDecisions.Windows.Forms;
        
    namespace WinReport2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
        
            private void Form1_Load(object sender, EventArgs e)
            {
                // Создаем адаптер типизированного набора, в котором уже
                // содержатся все настройки для извлечения нужных данных
                // Классы сгенерированы оболочкой при создании набора данных
                NorthwindDataSetTableAdapters.CustomersTableAdapter adapter = 
                    new WinReport2.NorthwindDataSetTableAdapters.CustomersTableAdapter();// Сгенерированный класс
                // Извлекаем данные из БД
                NorthwindDataSet.CustomersDataTable table = adapter.GetData();// Сгенерированные составной класс
        
                // Создаем объект документа отчета
                ReportDocument reportDocument = new ReportDocument();
                // Загружаем шаблон отчета
                reportDocument.Load("CrystalReport1.rpt");// !!! Должен стоять перед загрузкой данными
                // Заталкиваем (Push) данные по шаблону 
                reportDocument.SetDataSource(table as DataTable);// !!! Должен стоять после загрузки отчета
                //reportDocument.Database.Tables["Customers"].SetDataSource(dataSet.Tables["Customers"]);// Вариант
                crystalReportViewer1.ReportSource = reportDocument;// Привязываем к элементу отображения отчета
        
                // Донастраиваем объект отображения отчета
                crystalReportViewer1.ShowGroupTreeButton = false;// Отключить кнопку
                crystalReportViewer1.DisplayGroupTree = false;   // Отключить панель
        
                // Вариант. Если передается параметр Test типа DateTime
                //reportDocument1.SetParameterValue("Test", DateTime.Now);
                //crystalReportViewer1.ReportSource = reportDocument;
            }
        }
    }

    Обратите внимание, что мы вначале создаем объект, производный от класса DataTable, и извлекаем в него данные из базы в соответствии с настройками набора данных NorthwindDataSet через созданный в нем адаптер CustomersTableAdapter. Далее создаем объект отчета ReportDocument и загружаем в него созданный шаблон отчета CrystalReport1.rpt.

  • Проследите, чтобы настройки файла CrystalReport1.rpt заставляли оболочку копировать шаблон в каталог размещения исполнимой сборки приложения (точно также, как файл БД) при его компиляции
  • Особенно важно, чтобы шаблон отчета CrystalReport1.rpt оказался в объекте отчета ReportDocument раньше загрузки туда самих данных, поскольку во время загрузки он выполняет форматирование данных, пропуская их через себя. А далее мы связываем объект просмотра с самим отчетом и попутно донастраиваем его. Вот пока и все, наступил момент истины!

  • Запустите приложение и полюбуйтесь на результат, который вы и я сами сделали вручную, можно сказать, с нуля
  • Нам необязательно идти таким сложным путем через создание типизированного набора данных. В предыдущих лабораторных работах мы создавали нетипизированные наборы данных и заполняли их нужными данными. Учитывая, что шаблоны отчетов могут существовать самостоятельно в отдельных файлах, можно заранее их изготовить под готовые структуры данных, а потом в коде загружать в документ отчета необходимые данные и необходимую форму отчета. Можно воспользоваться и готовыми формами отчетов, созданными другими людьми. Существуют, также, способы управлять объектом отчета и программно, по мы их в данном упражнении рассматривать не будем.

    Страницы:

    Введение

    Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.

    Генератор отчетов Crystal Reports был создан компанией Crystal Decisions в 1992 году и разрекламирован как "первый в мире генератор отчетов для Windows". С тех пор этот программный продукт интенсивно развивается и существует как самостоятельный пакет, так и в виде интегрированной в Visual Studio .NET библиотеки. В настоящее время этой работой занимается компания Business Objects (может переименовалась, а может другая, хотя вряд ли - миллионы продаж лицензий в год по всему миру, кто же бросит такой бизнес!). По соглашению с изготовителем компания Microsoft стандартизовала этот пакет в качестве машины формирования отчетов по технологии Crystal Reports .NET, которая включает в себя:

  • Встроенный контструктор отчетов Report Designer, которым можно пользоваться при построении файлов отчетов ( .rpt ), а затем встраивать их в разрабатываемое приложение
  • Модуль просмотра Windows Forms Viewer можно использовать для предварительного просмотра отчетов, встроенных в приложение, с гибким управлением представления содержимого отчета
  • Модуль просмотра Web Forms Viewer той же функциональность, но применительно к Web-приложениям
  • Машина формирования отчетов Report Engine (набор классов библиотек CrystalDecisions.CrystalReports.Engine.dll, CrystalDecisions.Shared.dll и др.) дает возможность программировать даже самые тонкие аспекты отчетов перед передачей их в модуль просмотра или печати
  • Система планирования и распределения отчетов Crystal Enterprise обеспечивает возможность рассылки отчетов большому количеству пользователей
  • Пакет Crystal Reports для Visual Studio .NET является мощным дополнением к комплекту инструментальных средств самой среды разработки. При помощи конструктора отчетов Reports Designer можно создавать и модифицировать отчеты в графическом режиме самой Visual Studio .NET, а с помощью встроенных модулей легко интегрировать отчеты в проект и получать нужную функциональность Windows- или Web-приложения.

    Технология Crystal Reports.NET гармонично связана с ADO.NET. При их совместной работе доступ к данным заметно упрощается. Вместо того, чтобы изобретать способы доступа к различным источникам данных, Crystal Reports .NET может просто обратиться к объекту DataSet (к типизированному или нетипизированному) из ADO.NET как к источнику для генерации любого заданного отчета.

    Различают отчеты двух типов по способу выборки данных:

  • Pull (выталкивание) - машина Crystal Reports сама связывается с БД и выталкивает из нее данные в отчет согласно своим настройкам по выборке данных
  • Push (заталкивание) - с БД связывается ADO-приложение своими средствами доступа к данным, выбирает нужные данные по своим критериям, а машина Crystal Reports уже готовые данные заталкивает в отчет и обеспечивает только удобное представление данных и их печать
  • Вначале мы познакомимся с выборкой и представлением данных средствами Crystal Reports, т.е. будем использовать Pull -режим. В дальнейшем мы рассмотрим способы программирования отчетов на уровне кода C# в самом приложении, а машину Crystal Reports будем использовать для представления и печати уже готовых данных в Push -режиме.

    Примеры приложений с Pull -отчетами можно найти в архиве, поставляемом вместе с Visual Studio .NET, который находится в каталоге C:\Program Files\Microsoft Visual Studio 9.0\Crystal Reports\Samples\En\Code

    Здесь же содержится свободно распространяемый пакет самостоятельного продукта Crystal Reports, в котором можно готовить отчеты отдельно, а затем включать их в приложение, которое может и не использовать возможности ADO.NET. Во всех примерах используется БД xtreme.mdb (учебная БД компании по производству горных велосипедов) формата Access, которая содержит списки заказчиков, заказов, продукции, поставщиков и служащих. Эта база управляется средствами ADO.NET и Crystal Reports .NET и не требует установки системы Access. Схема БД xtreme.mdb приведена на рисунке

    В данной лабораторной работе мы будем пользоваться прежней учебной базой Northwind.mdb и изредка новой учебной базой xtreme.mdb, применяемой в примерах Crystal Reports. БД xtreme.mdb должна быть уже зарегистрирована в операционной системе автоматически после установки Visual Studio 2008. Это можно легко проверить, выполнив команду Настройка/Панель управления/Администрирование/Источники данных (ODBC). Окно настроек System DSN (Data Source Name) должно содержать имя БД xtreme.mdb.

  • Если это не так, щелкните на кнопке Добавить, из списка выберите драйвер *.mdb после чего в следующем окне найдите БД xtreme.mdb (прилагается в каталоге Source ) и зарегистрируйте ее
  • Упражнение 1. Создание отчета Crystal Reports с помощью мастера Standard Report Creation Wizard

    Мало кто, даже из опытных пользователей, создает приложение, в том числе и отчет, с нуля. Как правило, для этого в среде разработки предусмотрено множество мастеров, которые являются путеводителями в рамках всего процесса визуального проектирования. В данном упражнении мы познакомимся с мастером Standard Report Creation Wizard. Но в Crystal Reports есть много и вспомогательных инструметов, которые называются экспертами.

  • Создайте новый проект с именем WinReport1 в решении ADO по следующему шаблону
  • Задайте заголовок формы Упражнение 1
  • Командой Project/Add New Item добавьте к проекту новый отчет Crystal Report, настроив окно мастера следующим образом
  • Откроется новое окно галлереи отчетов Crystal Reports Gallery.

    Здесь мы видим три переключателя, объединенные в группу Create a New Crystal Report Document, а под ней - список предлагаемых экспертов. Переключатели олицетворяют выбираемый метод проектирования отчета и обозначают следующее:

  • Using the Report Wizard - создание отчета с использованием мастера, подходит для большинства программистов. Далее отчет можно доработать с помощью конструктора (дизайнера) отчетов
  • As a Blank Report - создание отчета с нуля как пустого, продходит для опытных программистов (при выборе этого метода эксперты становятся недоступными). Отчет разрабатывается только средствами дизайнера отчетов
  • From an Existing Report - создается новый отчет на основе уже существующего отчета (эксперты недоступны) и может быть доработан с помощью дизайнера отчетов
  • Если принято решение воспользоваться мастером отчетов, то далее нужно выбрать один из трех предлагаемых экспертов:

  • Standard - эксперт стандартных отчетов, используется чаще других и является наиболее универсальным.
  • Cross-Tab - отчет с перекрестными ссылками
  • Mail Label - применяется для вывода почтовых этикеток
  • В данном упражнении мы будем использовать эксперт Standard.

  • Выберите метод Using the Report Wizard и эксперт Standard и щелкните на кнопке OK
  • Мастер проведет разработчика через несколько вкладок. На каждой вкладке кнопка Finish мастера создания отчетов всегда доступна и его работу на любой вкладке можно прервать. Но не будем торопиться ее нажимать, а пройдем все предлагаемые вкладки, иначе несделанную автоматизированную работу по настройке отчета придется потом доделывать вручную в графическом режиме дизайнера отчетов Report Designer.

    Вкладка Data

    Следующее действие при работе с экспертом заключается в выборе источника данных для отчета.

    Появившееся окно мастера предлагает выбрать следующие варианты источника:

  • Project Data - наборы данных, которые используются в проекте приложения
  • Current Connections - источники, с которыми установлено соединение в приложении
  • Favorites - предподчтимые источники данных
  • History - ранее используемые источники данных
  • Create New Connection - иные способы выбора источников
  • Как один из множества вариантов, дважды щелкните на узле ODBC (RDO)/Make New Connection и в появившемся окне выберите Xtreme Sample Database 2008, как показано на рисунке
  • Щелчок на кнопке Finish окна Data Source Selection завершит процедуру выбора источника, откроет его соединение с мастером в режиме проектирования и вновь вернет нас к вкладке Data мастера Standard Report Creation Wizard. Если пройти в этом окне по кнопке Next, то появится вкладка выбора стилей генерации отчета

  • Оставьте стиль по умолчанию Standard и вернитесь на вкладку Data мастера Standard Report Creation Wizard
  • Раскройте узел соединения с выбранным источником данных Xtreme Sample Database 2008 и переместите в список выбора Selected Tables две таблицы Customer и Orders
  • Через контекстное меню для узла Tables можно вызвать командой Options окно настроек параметров работы с источником данных. Оно позволяет настроить параметры отображения информации об источнике данных в данном конкретном случае: отфильтровать какие-то таблицы или представления, показать служебные таблицы и т.п.

    Вкладка Link

    Теперь, если пройти по ссылке Next к следующей вкладке мастера, то это уже будет вкладка Link, которая отображает связи или дает возможность их установить между полями таблиц.

  • В данном упражнении нам нужна только одна таблица, поэтому вернитесь на вкладку Data и удалите (верните) из списка Selected Tables таблицу Orders, оставив только одну таблицу Customer
  • Вкладка Fields

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

  • Перейдите на следующую вкладку Fields мастера, раскройте узел полей таблицы Customer и переместите в список Fields to Display пять полей, как показано на рисунке
  • Именно эти поля БД будут участвовать в формировании отчета.

    Вкладка Grouping

    После щелчка на кнопке Next появится следующая вкладка Grouping мастера, в которой можно часть полей отсортировать или сгруппировать.

  • Выберите в списке слева поля для группировки и после перемещения их в список справа установите порядок следования в соответствии с рисунком
  • Обратите внимание на раскрывающийся список справа внизу, который позволяет изменить порядок сортировки данных в выбранных полях внутри каждой группы при их выводе в отчет ( in ascending order - в порядке возрастания, in descending order - в порядке убывания).

    Вкладка Summaries

    Очень часто в отчет нужно вставлять требуемые сводки, подсчитывающие те или иные итоговые результаты. Это и позволяет на этапе создания отчета выполнить рассматриваемая вкладка, следующая за вкладкой Grouping.

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

  • Выделите в правом списке группу Customer.Country и из левого списка добавьте в нее базовое поле Last Year's Sales, а в раскрывающемся списке закрепите за вычислимой сводкой операцию Sum (как показано на верхнем снимке)
  • В таблице перечислены наиболее часто используемые операции для полей сводок.

    Некоторые операции вычисления сводок
    Операция вычисления сводки Описание
    Sum (Сумма) Вычисляет сумму всех элементов
    Average (Среднее значение) Вычисляет среднее значение всех элементов
    Sample   variance (Выборочная дисперсия) Вычисляет статистическую выборочную дисперсию конкретной выборки элементов
    Sample standard deviation (Среднее выборочное отклонение) Вычисляет среднее статистическое выборочное отклонение заданной выборки элементов
    Maximum (Максимум) Возвращает максимальное значение
    Minimum (Минимум) Возвращает минимальное значение
    Count (Общее число) Вычисляет общее число элементов списка
    Distinct count (Подсчет числа только уникальных элементов) Подсчитывает число неповторяющихся элементов, например, если слово 'Дурак' встречается много раз, то оно засчитывается только однажды
    Correlation with (Корреляция) Вычисляет меру отношений между двумя или более элементами
    Covariance with (Ковариантность, смешанный момент второго порядка) Вычисляет меру дисперсии между двумя или более элементами
    Median (Медиана) Вычисляет статистическую медиану всей совокупности элементов
    Mode (Мода) Вычисляет статистическую моду (наиболее вероятное значение) всех элементов
    Nth largest, N is: ( N -е максимальное число) Возвращает N -й максимальный элемент (где N есть предопределенное число)
    Nth smallest, N is: ( N -е минимальное число) Возвращает N -й минимальный элемент (где N есть предопределенное число)
    Nth most frequent, N   is: ( N -е наиболее часто встречающееся значение) Возвращает N -е наиболее часто встречающееся в списке значение (где N есть предопределенное число)
    Pth percentile, P is: ( P -й процентиль) Вычисляет P -й процентиль (где P есть предопределенное число)
    Population variance (Дисперсия генеральной совокупности) Вычисляет статистическую дисперсию всей генеральной совокупности элементов
    Population standard deviation (Среднее отклонение генеральной совокупности) Вычисляет среднее отклонение всей генеральной совокупности элементов
    Weighted average with (Взвешенное среднее значение) Вычисляет среднее значение, взвешенное по числу раз появления элементов

    Вкладка Group Sorting

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

    Вкладка Chart

    Эта вкладка служит для включения в отчет диаграмм и графиков.

    Эта вкладка настраивает машину построения диаграмм и графиков, работающую по технологии 3D-графики. Чтобы включить вычисление диаграммы в отчет, нужно выбрать тип диаграммы, а затем указать, откуда должны поступать данные для ее построения. Наиболее распространенным типом диаграммы является групповая диаграмма, которая требует, чтобы в отчет были вставлены поле группы и поле сводки.

    Вкладка Record Selection

    При формировании отчета на базе нескольких таблиц может понадобиться включать в отчет только часть данных из этих таблиц, выбирая их по определенному критерию. Нужные поля помещаются в правый список вкладки и для них в появившемся раскрывающемся списке формул фильтрации закрепляется определенный критерий. При выполнении отчета этот критерий преобразуется в SQL-запросы, передаваемые в БД для выборки помещаемых в отчет данных.

    Фильтр, закрепляемый за полями, при невозможности преобразования в SQL-запрос реализуется собственными средствами генератора отчетов. Здесь интересно отметить, что Crystal Reports самостоятельно связывается с БД и выбирает из нее указанные данные по настроенным критериям.

    Последней вкладкой мастера создания отчета является Report Style, устанавливающая внешний вид будущего отчета.

  • Щелкните на кнопке Finish и мастер создаст заготовку отчета, которую откроет в конструкторе Report Designer (в режиме дизайнера)
  • Обратите внимание на две вкладки внизу рабочей области дизайнера отчета. Они позволяют переключаться в режим конструирования или предварительного просмотра отчета. Наш сгенерированный отчет изначально состоит из 5 основных секций:

  • Report Header - заголовок всего отчета (обычно сюда помещается титульная страница, логотип компании, диаграммы, сведения об авторе и т.п.). По умолчанию обычно подавляется (Suppress).
  • Page Header - заголовок для страницы (заголовки полей, колонтитул для отчета, номера страниц)
  • Group Header - заголовок, или верхний колонтитул, группы. Появляется в начале каждой группы и обычно используется для вывода названия группы
  • Details - поля базы данных или формул (собственно данные из отчета)
  • Group Footer - нижний колонтитул группы. Появляется в конце каждой группы и обычно используется для вывода названия группы, промежуточных или итоговых сумм
  • Report Footer - итоговое поле в конце отчета (общие итоги, авторские права, официальные предупреждения, диаграммы, объекты Cross-Tab для отчета в целом)
  • Page Footer - нижний колонтитул для страницы (номера страниц, описания рисунков, примечания)
  • Дополнительными являются секции Group Header и Group Footer, созданные мастером при формировании групп. Одновременно появится панель Field Explorer (Проводник полей) и дополнительное меню Crystal Reports. Панель можно включить в режиме Report Designer через меню Crystal Reports/Field Explorer или View/Other Windows/Document Outline или щелкнув на пиктограмме Toggle Field View панели инструментов. В состав оболочки .NET включены две панели инструментов: Crystal Reports - Main и Crystal Reports - Insert.

    В панели Field Explorer представлены контейнеры со всеми объектами типа поле, которые могут присутствовать в отчете:

  • Database Fields (Поля базы данных) - отображаются те поля, которые напрямую поступают из базы данных. Как правило, эти поля размещаются в секции Details (Подробности)
  • Formula Fields (Поля формул) - при помощи этого контейнера в отчет можно добавлять поля формул
  • Parameter Fields (Поля параметров) - поля параметров редко используются в отчетах напрямую. Чаще всего они применяются для фильтрации данных в отчете. Однако можно напрямую поместить поле параметра в какую-либо секцию отчета
  • Group Name Fields (Поля имен групп) - обычно они генерируются и добавляются в отчет автоматически, однако при желании их можно добавить в отчет из этого контейнера (после того, как будет создана группировка)
  • Running Total Fields (Поля нарастающих итогов) - специальные поля, значение которых зависит от значения такого же поля для предыдущей записи
  • SQL Expression Fields (Поля SQL-выражений) - используются специальные формулы, вычисление которых производится на сервере баз данных. К сожалению, можно использовать только такие поля выражений SQL, которые возвращают скалярные значения
  • Special Fields (Специальные поля) - многочисленный набор служебных полей отчета
  • Unbound Fields - не связанные с данными поля
  • Добавление полей на форму отчета в режиме Report Designer осуществляется простым перетаскиванием поля из панели Field Explorer в нужное место формы либо через меню Crystal Reports, либо через контекстное меню формы отчета командой Insert. Настройка отображения поля осуществляется через окно Format Editor, вызываемое на форме в контекстном меню поля опцией Format Object.

    Команда Insert/Text Object вставляет на форму отчета текстовое поле, с помощью которого создаются надписи и другие элементы, подобные названиям столбцов и комментариев, которые не должны меняться в зависимости от информации, поступающей из источника. Затем обычным образом этому полю можно настроить параметры форматирования. Во многих ситуациях очень удобно помещать внутрь текстового поля обычные поля из таблиц базы данных. Можно перекрыть несколько текстовых полей друг поверх друга или поля заголовков и подавлять отображение ненужных средствами условного форматирования.

    Другими простыми средствами оформления отчетов, доступных через команду Insert, являются объекты

  • Line - просто линия, вертикальная или горизонтальная
  • Box - прямоугольник, который можно преобразовать в овал. Существует сам по себе. Если в него поместить какие-нибудь объекты (например, текстовые поля), то при перетаскивании объекта Box они перемещаться не будут. Для создания рамок вокруг полей лучше использовать их собственные свойства на вкладке Border окна Format Editor, а не объекты Box
  • Chart - для включения в отчет диаграмм и графиков
  • Picture - для включения рисунков
  • OLE Object - возможность вставить внутрь отчета Crystal Reports файл внешнего приложения. Чаще всего вставляются листы Excel, но можно вставить, например, аудио и видеоролики, документы Word, схемы Visio и т.п. - файл любого приложения, соответствующего стандартам OLE. При активизации этого объекта управление передается "ответственному" за него приложению, например, Excel, которое должно быть установлено на данном компьютере
  • Доступными специальными полями ( Special Fields ) являются следующие:

  • Print Date - дата печати отчета
  • Print Time - время печати отчета
  • Modification Date - дата последнего изменения отчета
  • Modification Time - время последнего изменения отчета
  • Data Date - дата считывания данных из БД
  • Data Time - время считывания данных из БД
  • Record Number - внутренний порядковый номер записи, присваиваемый всем записям, которые передаются в отчет
  • Page Number - номер страницы отчета
  • Group Number - внутренний порядковый номер, присваиваемый всем группам
  • Total Page Count - общее число страниц
  • Report Title - заголовок отчета, сохраненный в разделе Title окна Document Properties, открытого командой Report/Summary Info
  • Report Comments - комментарий, сохраненный в разделе Comments окна Document Properties
  • Record Selection Formula - формула выбора записей, используемая в отчете
  • Group Selection Formula - формула выбора групп, используемая в отчете
  • File Path and Name - полный путь и имя файла отчета
  • File Author - автор отчета, сохраненный в разделе Author окна Document Properties
  • File Creation Date - дата создания файла *.rpt отчета
  • Page N of M - текущая страница N из M страниц
  • Созданный мастером отчет существует независимо в отдельном файле и нужно внедрить его в наше приложение. Однако это не просто отчет, но еще и сгенерированный на языке C# класс CrystalReport1, расположенный в файле CrystalReport1.cs. Такой отчет называется типизированным.

  • Перейдите в режим дизайна формы, найдите в панели Toolbox вкладку Reporting и перетащите на форму компонент CrystalReportViewer
  • Установите свойство ReportSource компонента CrystalReportViewer в значение типизированного документа отчета
  • Запустите приложение, должен получиться отчет с полноценными элементами управления
  • В данном упражнении мы использовали компонент CrystalReportViewer из пространства имен CrystalDecisions.Windows.Forms, который позволяет просматривать отчет и печатать его.

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

  • Переведите файл нашего отчета CrystalReport1.rpt в режим дизайнера (вкладка внизу Main Report ) и через контекстное меню дизайнера (либо через меню Crystal Reports оболочки) вызовите эксперта Report/Group Expert, в котором верните из правого списка в левый все ранее созданные мастером группы
  • Обратите внимание, что все групповые секции в графическом представлении отчета исчезли и остались только основные секции

    Теперь введем сортировку для некоторых полей отчета, для чего воспользуемся экспертом Record Sort Expert.

  • Вызовите контекстное меню для отчета в режиме дизайнера и выполните команду Report/Record Sort Expert (либо то же самое выполните через меню Crystal Reports оболочки)
  • Настройте окно эксперта как показано на снимке, чтобы отчет сортировал данные по двум столбцам в указанном порядке, вначале по первому столбцу, а затем в рамках первого - и по второму
  • Обведите лассо (резиновая рамка) курсора сразу два поля Contact Title в секциях 2 ( Page Header ) и 3 ( Details ) и удалите эти выделенные поля, а остальные поля, также попарно выделяя курсором, распределите по горизонтали равномерно и задайте им достаточную для отображения данных ширину. Периодически переключайтесь в режим Main Report Preview (кнопка внизу рабочей области) для контроля размещения данных
  • Для более точного выравнивания полей выполните команду Crystal Reports/Design/Default Settings, на вкладке Layout включите флажок Show Grid, сбросьте флажок отображения линеек в режиме проектирования Show Rulers и поменяйте значение шага сетки привязки Grid Size на 0,1
  • Щелкните на пиктограмме Toggle Field View панели инструментов оболочки, чтобы вызвать панель Field Explorer, раскройте узел Special Fields и поместите в середину секции Report Header поле Report Title
  • Выполните команду контекстного меню (или меню Crystal Reports оболочки) Report/Summary Info и заполните поле Title содержимым заголовка отчета
  • Выполните команду Report/Section Expert и для секции Report Header сбросьте флажок Suppress, установленный по умолчанию, чтобы включить ее в отчет
  • Вызовите контекстное меню для компонента Report Title, помещенного нами ранее в секцию Report Header, и выполните команду Format Object. Настройте вкладку Font как показано на рисунке
  • Выделите заголовок секции Section2 (Page Header) графического представления отчета и оттащите эту секцию вниз (зацепив мышью за верхнюю границу), чтобы компонент Report Title поместился по высоте в верхней секции Report Header
  • Измените размеры компонента Report Title так, чтобы весь заголовок поместился в нем. Периодически переключайтесь в режим Main Report Preview (кнопка внизу рабочей области) для контроля размещения заголовка, но предварительно сохраняйте отчет на диске (только после этого можно увидеть изменения)
  • Выделите на форме объект CrystalReportViewer и сбросьте его свойство DisplayGroupTree в значение False, чтобы дерево отчета вначале, при запуске проекта, не отображалось
  • Запустите приложение и получите ожидаемый результат
  • Упражнение 2. Создание отчета Crystal Reports с помощью дизайнера Report Designer

    В данном упражнении мы создадим отчет с нуля без помощи мастера, но используя графический режим дизанера отчетов Report Designer наподобие графического дизайнера Form Designer, позволяющего графически компоновать пользовательский интерфейс форм. Мы уже частично использовали его в предыдущем упражнении для донастройки отчета, созданного с помощью мастера.

    Создание заготовки приложения

    Прежде всего добавим к решению новый проект, но сделаем это отличным от прежнего способом.

  • Выполните команду оболочки File/New/Project и заполните окно мастера как показано на рисунке. При этом установите раскрывающийся список Solution в значение Add to Solution, а тип приложения выберите как Crystal Reports Application
  • Выберите режим создания проекта как пустого (не совсем) и тогда будет сгенерирована только простая заготовка отчета и форма Windows Forms с готовым объектом CrystalReportViewer
  • Обратите внимание, что настройки секций предыдущего проекта сохранились.

  • Перейдите на форму Form1 и убедитесь, что мастер заготовки создал строго типизированный документ отчета с компонентом просмотра CrystalReportViewer, только не подключил к нему источник данных
  • В предыдущем упражнении, когда мы пользовались мастером отчета, форма Windows Forms была пустой и мы сами размещали в ней элемент CrystalReportViewer.

  • Присвойте форме заголовок Упражнение 2 и назначьте проект WinReport2 стартовым
  • Создание типизированного набора данных

    Теперь создадим строго типизированный набор данных, который будет связываться с БД и к которому позднее мы подключим наш отчет.

  • Выполните команду меню оболочки Data/Add New Data Source и в качестве типа источника данных выберите Database
  • Пройдите по ссылке Next и на следующей вкладке мастера поключения щелкните на кнопке New Connection, чтобы создать новое соединение с источником данных
  • Через кнопку Browse выберите БД из прилагаемого к работе каталога Source или из другого источника, сразу протестируйте созданное соединение кнопкой Test Connection
  • На следующей вкладке мастера задайте новое имя строке подключения или оставьте сгенерированное по умолчанию (мы все равно ею явно пользоваться не будем)
  • Включенный флажок ' Yes, save the connection as:' означает, что строка соединения будет записана в конфигурационный файл приложения App.config и будет извлекаться из него менеджером конфигурации при каждом запуске исполнимой сборки проекта. В противном случае строку соединения с БД нужно будет прописывать вручную в коде приложения.

  • На следующей вкладке отметьте таблицу Customers, а имя типа создаваемого набора данных оставьте сгенерированным по умолчанию
  • Щелкните на кнопке Finish, чтобы мастер создал строго типизированный набор данных NorthwindDataSet для таблицы Customers, которую мы далее будем выводить в отчет
  • Через панели Solution Explorer и Object Browser можно убедиться, что мастер создал не только всю инфраструктуру для доступа к источнику данных, но и физически скопировал саму БД в каталог проекта, а также создал файл конфигурации App.config со строкой соединения с БД заданного типа.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <connectionStrings>
            <add name="WinReport2.Properties.Settings.NorthwindConnectionString"
                connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Northwind.mdb"
                providerName="System.Data.OleDb" />
        </connectionStrings>
    </configuration>
  • Проследите, чтобы файл БД был настроен на копирование его оболочкой в каталог сборки при компиляции проекта
  • Также было создано целое семейство классов для управления данными таблицы, упакованное не только в текущее пространство имен проекта WinReport2, но и в подпространство имен WinReport2.NorthwindDataSetTableAdapters из расчета, что будет создано несколько типизированных наборов в одном проекте

    Настройка отчета

    Теперь подошла очередь присоединить наш отчет к созданному объектному источнику данных и настроить его (отчет).

  • Перейдите в графический режим дизанера отчетов Report Designer и выполните команду контекстного меню Database/Database Expert
  • Раскройте узел Project Data и поместите в правый список таблицу Customers
  • Обратите внимание, что эксперты, вызываемые в режиме Report Designer, отличаются только заголовками окон от вкладок мастера Standard Report Creation Wizard, который мы использовали в предыдущем упражнении. Ну и правильно, проще подставлять новые заголовки, чем дублировать весь инструмент, да и нам попривычнее будет!

  • Щелкните на кнопке OK и отчет окажется подключенным к созданному ранее строго типизированному источнику данных
  • Откройте панель Field Explorer через меню Crystal Reports, контекстное меню Report Designer или щелчком на пиктограмме панели интсрументов 'Crystal Reports - Main' и разверните в ней узел Database Fields/Customers
  • Перетащите в секцию Details формы отчета поля CustomerID, CompanyName, Address, Region и распределите их равномерно по ширине листа. Позже мы скорректируем ширину рабочих полей, когда настроим приложение на просмотр отчета.
  • После отпускания кнопки мыши одновременно в секции Page Header тоже появится заголовок поля текстового типа, который можно отредактировать. Имена столбцов в секции Details не редактируются, а редактируется только их формат через команду Format Object контекстного меню. Следует иметь ввиду, что вертикальный размер секции Details определяет междустрочное расстояние выводимой в рабочую область отчета информации.

  • Перейдите на вкладку Main Report Preview эксперта Report Designer
  • Здесь можно увидеть, что в рабочей области отчета вместо реальных данных таблицы Customers подставляются дежурные значения, генерируемые Crystal Reports. Это происходит потому, что мы не напрямую соединились с БД, как это было в предыдущем упражнении, а через набор данных. На этапе проектирования созданный нами ранее типизированный набор данных заполнен только схемой таблицы Customers, поэтому Crystal Reports видит сейчас только названия полей и их типы. Но сам типизированный набор пока не содержит реальных данных таблицы и в отчет помещаются случайные данные, чтобы можно было представить их будущее расположение

  • Вернитесь на вкладку Main Report и поместите в секцию Report Header из раздела Special Fields панели Field Explorer поле Report Title
  • Выполните команду меню Crystal Reports/Report/Summary Info и заполните поле Title названием отчета, например, 'Отчет компании Рога и Копыта'
  • Настройте стиль заголовка по своему вкусу через контекстное меню поля Report Title, выполнив команду Format Object. Проследите через режим Main Report Preview, чтобы текст заголовка помещался в поле
  • Поместите в секцию Report Header из раздела Special Fields панели Field Explorer поля Data Date и Data Time и настройте их стиль по вкусу, вызвав через контекстное меню командой Format Object окно Format Editor. Проследите через режим Main Report Preview, чтобы содержимое помещалось в поле. Пользуйтесь групповым выделением полей отчета и перемещением в рамках секции с помощью клавиатурных стрелок.
  • Система Crystal Reports позволяет очень красиво и тонко настроить отчет, но в данном упражнении нам пока достаточна выполненных простых возможностей.

    Интеграция отчета в приложение

    Вспомните, что Crystal Reports может работать в двух режимах: Pull -выталкивание и Push -заталкивание. Мы в данном упражнении хотим реализовать режим Push и для этого подготовили форму простого отчета вручную с помощью Report Designer. Это форма отчета должна храниться в отдельном файле CrystalReport1.rpt вместе со сборкой и загружаться приложением из кода. Мы также подготовили типизированный источник данных NorthwindDataSet, который имеет все необходимые настройки для связи с БД и выборки нужных нам данных. Строка соединения хранится в конфигурационном файле. На форме Form1 размещен объект с именем crystalReportViewer1 для отображения отчета на этапе выполнения. Теперь осталось связать все вместе с помощью кода.

  • Перейдите в режим Form Designer для формы Form1 и двойным щелчком на ее заголовке (потому что в клиентской области размещен объект CrystalReportViewer ) создайте обработчик события Load, который заполните так
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
        
    using CrystalDecisions.Shared;
    using CrystalDecisions.CrystalReports.Engine;
    using CrystalDecisions.Windows.Forms;
        
    namespace WinReport2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
        
            private void Form1_Load(object sender, EventArgs e)
            {
                // Создаем адаптер типизированного набора, в котором уже
                // содержатся все настройки для извлечения нужных данных
                // Классы сгенерированы оболочкой при создании набора данных
                NorthwindDataSetTableAdapters.CustomersTableAdapter adapter = 
                    new WinReport2.NorthwindDataSetTableAdapters.CustomersTableAdapter();// Сгенерированный класс
                // Извлекаем данные из БД
                NorthwindDataSet.CustomersDataTable table = adapter.GetData();// Сгенерированные составной класс
        
                // Создаем объект документа отчета
                ReportDocument reportDocument = new ReportDocument();
                // Загружаем шаблон отчета
                reportDocument.Load("CrystalReport1.rpt");// !!! Должен стоять перед загрузкой данными
                // Заталкиваем (Push) данные по шаблону 
                reportDocument.SetDataSource(table as DataTable);// !!! Должен стоять после загрузки отчета
                //reportDocument.Database.Tables["Customers"].SetDataSource(dataSet.Tables["Customers"]);// Вариант
                crystalReportViewer1.ReportSource = reportDocument;// Привязываем к элементу отображения отчета
        
                // Донастраиваем объект отображения отчета
                crystalReportViewer1.ShowGroupTreeButton = false;// Отключить кнопку
                crystalReportViewer1.DisplayGroupTree = false;   // Отключить панель
        
                // Вариант. Если передается параметр Test типа DateTime
                //reportDocument1.SetParameterValue("Test", DateTime.Now);
                //crystalReportViewer1.ReportSource = reportDocument;
            }
        }
    }

    Обратите внимание, что мы вначале создаем объект, производный от класса DataTable, и извлекаем в него данные из базы в соответствии с настройками набора данных NorthwindDataSet через созданный в нем адаптер CustomersTableAdapter. Далее создаем объект отчета ReportDocument и загружаем в него созданный шаблон отчета CrystalReport1.rpt.

  • Проследите, чтобы настройки файла CrystalReport1.rpt заставляли оболочку копировать шаблон в каталог размещения исполнимой сборки приложения (точно также, как файл БД) при его компиляции
  • Особенно важно, чтобы шаблон отчета CrystalReport1.rpt оказался в объекте отчета ReportDocument раньше загрузки туда самих данных, поскольку во время загрузки он выполняет форматирование данных, пропуская их через себя. А далее мы связываем объект просмотра с самим отчетом и попутно донастраиваем его. Вот пока и все, наступил момент истины!

  • Запустите приложение и полюбуйтесь на результат, который вы и я сами сделали вручную, можно сказать, с нуля
  • Нам необязательно идти таким сложным путем через создание типизированного набора данных. В предыдущих лабораторных работах мы создавали нетипизированные наборы данных и заполняли их нужными данными. Учитывая, что шаблоны отчетов могут существовать самостоятельно в отдельных файлах, можно заранее их изготовить под готовые структуры данных, а потом в коде загружать в документ отчета необходимые данные и необходимую форму отчета. Можно воспользоваться и готовыми формами отчетов, созданными другими людьми. Существуют, также, способы управлять объектом отчета и программно, по мы их в данном упражнении рассматривать не будем.

    Вернуться к учебному плану