Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.
Генератор отчетов Crystal Reports был создан компанией Crystal Decisions в 1992 году и разрекламирован как "первый в мире генератор отчетов для Windows". С тех пор этот программный продукт интенсивно развивается и существует как самостоятельный пакет, так и в виде интегрированной в Visual Studio .NET библиотеки. В настоящее время этой работой занимается компания Business Objects (может переименовалась, а может другая, хотя вряд ли - миллионы продаж лицензий в год по всему миру, кто же бросит такой бизнес!). По соглашению с изготовителем компания Microsoft стандартизовала этот пакет в качестве машины формирования отчетов по технологии Crystal Reports .NET, которая включает в себя:
.rpt ), а затем встраивать их в разрабатываемое
приложениеCrystalDecisions.CrystalReports.Engine.dll, CrystalDecisions.Shared.dll и др.) дает возможность программировать даже самые тонкие аспекты отчетов
перед передачей их в модуль просмотра или печатиПакет Crystal Reports для Visual Studio .NET является мощным дополнением к комплекту инструментальных средств самой среды разработки. При помощи конструктора отчетов Reports Designer можно создавать и модифицировать отчеты в графическом режиме самой Visual Studio .NET, а с помощью встроенных модулей легко интегрировать отчеты в проект и получать нужную функциональность Windows- или Web-приложения.
Технология Crystal Reports.NET гармонично связана с ADO.NET.
При их совместной работе доступ к данным заметно упрощается. Вместо того, чтобы
изобретать способы доступа к различным источникам данных, Crystal Reports .NET может
просто обратиться к объекту DataSet (к типизированному или нетипизированному)
из ADO.NET как
к источнику для генерации любого заданного отчета.
Различают отчеты двух типов по способу выборки данных:
Вначале мы познакомимся с выборкой и представлением данных средствами 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 ) и зарегистрируйте
ее
Мало кто, даже из опытных пользователей, создает приложение, в том числе и отчет, с нуля. Как правило, для этого в среде разработки предусмотрено множество мастеров, которые являются путеводителями в рамках всего процесса визуального проектирования. В данном упражнении мы познакомимся с мастером Standard Report Creation Wizard. Но в Crystal Reports есть много и вспомогательных инструметов, которые называются экспертами.
Создайте новый проект
с именем WinReport1 в решении ADO по следующему шаблону
Задайте заголовок формы Упражнение 1
Командой Project/Add
New Item добавьте к проекту новый отчет Crystal Report, настроив окно мастера
следующим образом
Откроется новое окно галлереи отчетов Crystal Reports Gallery.

Здесь мы видим три переключателя, объединенные в группу Create a New Crystal Report Document, а под ней - список предлагаемых экспертов. Переключатели олицетворяют выбираемый метод проектирования отчета и обозначают следующее:
Если принято решение воспользоваться мастером отчетов, то далее нужно выбрать один из трех предлагаемых экспертов:
В данном упражнении мы будем использовать эксперт Standard.
Выберите метод Using
the Report Wizard и эксперт Standard и щелкните на кнопке OKМастер проведет разработчика через несколько вкладок. На каждой вкладке кнопка Finish мастера создания отчетов всегда доступна и его работу на любой вкладке можно прервать. Но не будем торопиться ее нажимать, а пройдем все предлагаемые вкладки, иначе несделанную автоматизированную работу по настройке отчета придется потом доделывать вручную в графическом режиме дизайнера отчетов Report Designer.
Следующее действие при работе с экспертом заключается в выборе источника данных для отчета.

Появившееся окно мастера предлагает выбрать следующие варианты источника:
Как один из множества
вариантов, дважды щелкните на узле 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 окно
настроек параметров работы с источником данных. Оно позволяет настроить параметры
отображения информации об источнике данных в данном конкретном случае: отфильтровать
какие-то таблицы или представления, показать служебные таблицы и т.п.
Теперь, если пройти по ссылке Next к следующей вкладке мастера, то это уже будет вкладка Link, которая отображает связи или дает возможность их установить между полями таблиц.

В данном упражнении
нам нужна только одна таблица, поэтому вернитесь на вкладку Data и
удалите (верните) из списка Selected Tables таблицу Orders, оставив только
одну таблицу CustomerТеперь с помощью мастера нужно выбрать поля в выделенной таблице, значения которых будут отображаться в отчете.
Перейдите на следующую
вкладку Fields мастера, раскройте узел полей таблицы Customer и
переместите в список Fields to Display пять полей, как показано на рисунке
Именно эти поля БД будут участвовать в формировании отчета.
После щелчка на кнопке Next появится следующая вкладка Grouping мастера, в которой можно часть полей отсортировать или сгруппировать.

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

Поля для сводок представляют собой вычисляемые дополнительные поля, которые не требуют специальных формул для записи информации. Они заменяют собой наиболее распространенные вычислительные запросы к БД, такие как вычисление суммы и средних значений, что уменьшает объем кодирования и вычислительные затраты. Чтобы создать поле сводки, нужно выбрать базовое поле таблицы данных и из раскрывающегося списка вкладки мастера задать выполняемое над данными действие. Список действий соответствует контексту выбранного базового поля данных, для разных типов полей список содержит разные действия.
Выделите в
правом списке группу Customer.Country и из левого списка добавьте в
нее базовое поле Last Year's Sales, а в раскрывающемся списке закрепите
за вычислимой сводкой операцию Sum (как показано на верхнем снимке)В таблице перечислены наиболее часто используемые операции для полей сводок.
| Операция вычисления сводки | Описание |
|---|---|
Sum |
(Сумма) Вычисляет сумму всех элементов |
Average |
(Среднее значение) Вычисляет среднее значение всех элементов |
Sample |
(Выборочная дисперсия) Вычисляет статистическую выборочную дисперсию конкретной выборки элементов |
Sample standard |
(Среднее выборочное отклонение) Вычисляет среднее статистическое выборочное отклонение заданной выборки элементов |
Maximum |
(Максимум) Возвращает максимальное значение |
Minimum |
(Минимум) Возвращает минимальное значение |
Count |
(Общее число) Вычисляет общее число элементов списка |
Distinct count |
(Подсчет числа только уникальных элементов) Подсчитывает число неповторяющихся элементов, например, если слово 'Дурак' встречается много раз, то оно засчитывается только однажды |
with |
(Корреляция) Вычисляет меру отношений между двумя или более элементами |
Covariance with |
(Ковариантность, смешанный момент второго порядка) Вычисляет меру дисперсии между двумя или более элементами |
|
(Медиана) Вычисляет статистическую медиану всей совокупности элементов |
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 |
(Дисперсия генеральной совокупности) Вычисляет статистическую дисперсию всей генеральной совокупности элементов |
Population standard |
(Среднее отклонение генеральной совокупности) Вычисляет среднее отклонение всей генеральной совокупности элементов |
Weighted average with |
(Взвешенное среднее значение) Вычисляет среднее значение, взвешенное по числу раз появления элементов |
Эта вкладка позволяет выполнить операцию по выделению в специальную группу лидеров или аутсайдеров данных по выбранному критерию. Остальные данные будут проигнорированы. Например, можно выделить в группу 10 лучших клиентов по итогам прошлогодних продаж. Таким же образом можно составить отчет по заданному числу наихудших клиентов.

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

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

Фильтр, закрепляемый за полями, при невозможности преобразования в SQL-запрос реализуется собственными средствами генератора отчетов. Здесь интересно отметить, что Crystal Reports самостоятельно связывается с БД и выбирает из нее указанные данные по настроенным критериям.
Последней вкладкой мастера создания отчета является Report Style, устанавливающая внешний вид будущего отчета.
Щелкните на кнопке Finish и мастер создаст заготовку отчета, которую откроет в конструкторе Report
Designer (в
режиме дизайнера)
Обратите внимание на две вкладки внизу рабочей области дизайнера отчета. Они позволяют переключаться в режим конструирования или предварительного просмотра отчета. Наш сгенерированный отчет изначально состоит из 5 основных секций:
Дополнительными являются секции 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 представлены контейнеры со всеми объектами типа поле, которые могут присутствовать в отчете:

Добавление полей на форму отчета в режиме Report Designer осуществляется простым перетаскиванием поля из панели Field Explorer в нужное место формы либо через меню Crystal Reports, либо через контекстное меню формы отчета командой Insert. Настройка отображения поля осуществляется через окно Format Editor, вызываемое на форме в контекстном меню поля опцией Format Object.
Команда Insert/Text Object вставляет на форму отчета текстовое поле, с помощью которого создаются надписи и другие элементы, подобные названиям столбцов и комментариев, которые не должны меняться в зависимости от информации, поступающей из источника. Затем обычным образом этому полю можно настроить параметры форматирования. Во многих ситуациях очень удобно помещать внутрь текстового поля обычные поля из таблиц базы данных. Можно перекрыть несколько текстовых полей друг поверх друга или поля заголовков и подавлять отображение ненужных средствами условного форматирования.
Другими простыми средствами оформления отчетов, доступных через команду Insert, являются объекты
Доступными специальными полями ( Special Fields ) являются следующие:

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, чтобы дерево
отчета вначале, при запуске проекта, не отображалось
Запустите
приложение и получите ожидаемый результат
В данном упражнении мы создадим отчет с нуля без помощи мастера, но используя графический режим дизанера отчетов 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,
чтобы текст заголовка помещался в полеСистема 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, которая включает в себя:
.rpt ), а затем встраивать их в разрабатываемое
приложениеCrystalDecisions.CrystalReports.Engine.dll, CrystalDecisions.Shared.dll и др.) дает возможность программировать даже самые тонкие аспекты отчетов
перед передачей их в модуль просмотра или печатиПакет Crystal Reports для Visual Studio .NET является мощным дополнением к комплекту инструментальных средств самой среды разработки. При помощи конструктора отчетов Reports Designer можно создавать и модифицировать отчеты в графическом режиме самой Visual Studio .NET, а с помощью встроенных модулей легко интегрировать отчеты в проект и получать нужную функциональность Windows- или Web-приложения.
Технология Crystal Reports.NET гармонично связана с ADO.NET.
При их совместной работе доступ к данным заметно упрощается. Вместо того, чтобы
изобретать способы доступа к различным источникам данных, Crystal Reports .NET может
просто обратиться к объекту DataSet (к типизированному или нетипизированному)
из ADO.NET как
к источнику для генерации любого заданного отчета.
Различают отчеты двух типов по способу выборки данных:
Вначале мы познакомимся с выборкой и представлением данных средствами 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 ) и зарегистрируйте
ее
Мало кто, даже из опытных пользователей, создает приложение, в том числе и отчет, с нуля. Как правило, для этого в среде разработки предусмотрено множество мастеров, которые являются путеводителями в рамках всего процесса визуального проектирования. В данном упражнении мы познакомимся с мастером Standard Report Creation Wizard. Но в Crystal Reports есть много и вспомогательных инструметов, которые называются экспертами.
Создайте новый проект
с именем WinReport1 в решении ADO по следующему шаблону
Задайте заголовок формы Упражнение 1
Командой Project/Add
New Item добавьте к проекту новый отчет Crystal Report, настроив окно мастера
следующим образом
Откроется новое окно галлереи отчетов Crystal Reports Gallery.

Здесь мы видим три переключателя, объединенные в группу Create a New Crystal Report Document, а под ней - список предлагаемых экспертов. Переключатели олицетворяют выбираемый метод проектирования отчета и обозначают следующее:
Если принято решение воспользоваться мастером отчетов, то далее нужно выбрать один из трех предлагаемых экспертов:
В данном упражнении мы будем использовать эксперт Standard.
Выберите метод Using
the Report Wizard и эксперт Standard и щелкните на кнопке OKМастер проведет разработчика через несколько вкладок. На каждой вкладке кнопка Finish мастера создания отчетов всегда доступна и его работу на любой вкладке можно прервать. Но не будем торопиться ее нажимать, а пройдем все предлагаемые вкладки, иначе несделанную автоматизированную работу по настройке отчета придется потом доделывать вручную в графическом режиме дизайнера отчетов Report Designer.
Следующее действие при работе с экспертом заключается в выборе источника данных для отчета.

Появившееся окно мастера предлагает выбрать следующие варианты источника:
Как один из множества
вариантов, дважды щелкните на узле 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 окно
настроек параметров работы с источником данных. Оно позволяет настроить параметры
отображения информации об источнике данных в данном конкретном случае: отфильтровать
какие-то таблицы или представления, показать служебные таблицы и т.п.
Теперь, если пройти по ссылке Next к следующей вкладке мастера, то это уже будет вкладка Link, которая отображает связи или дает возможность их установить между полями таблиц.

В данном упражнении
нам нужна только одна таблица, поэтому вернитесь на вкладку Data и
удалите (верните) из списка Selected Tables таблицу Orders, оставив только
одну таблицу CustomerТеперь с помощью мастера нужно выбрать поля в выделенной таблице, значения которых будут отображаться в отчете.
Перейдите на следующую
вкладку Fields мастера, раскройте узел полей таблицы Customer и
переместите в список Fields to Display пять полей, как показано на рисунке
Именно эти поля БД будут участвовать в формировании отчета.
После щелчка на кнопке Next появится следующая вкладка Grouping мастера, в которой можно часть полей отсортировать или сгруппировать.

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

Поля для сводок представляют собой вычисляемые дополнительные поля, которые не требуют специальных формул для записи информации. Они заменяют собой наиболее распространенные вычислительные запросы к БД, такие как вычисление суммы и средних значений, что уменьшает объем кодирования и вычислительные затраты. Чтобы создать поле сводки, нужно выбрать базовое поле таблицы данных и из раскрывающегося списка вкладки мастера задать выполняемое над данными действие. Список действий соответствует контексту выбранного базового поля данных, для разных типов полей список содержит разные действия.
Выделите в
правом списке группу Customer.Country и из левого списка добавьте в
нее базовое поле Last Year's Sales, а в раскрывающемся списке закрепите
за вычислимой сводкой операцию Sum (как показано на верхнем снимке)В таблице перечислены наиболее часто используемые операции для полей сводок.
| Операция вычисления сводки | Описание |
|---|---|
Sum |
(Сумма) Вычисляет сумму всех элементов |
Average |
(Среднее значение) Вычисляет среднее значение всех элементов |
Sample |
(Выборочная дисперсия) Вычисляет статистическую выборочную дисперсию конкретной выборки элементов |
Sample standard |
(Среднее выборочное отклонение) Вычисляет среднее статистическое выборочное отклонение заданной выборки элементов |
Maximum |
(Максимум) Возвращает максимальное значение |
Minimum |
(Минимум) Возвращает минимальное значение |
Count |
(Общее число) Вычисляет общее число элементов списка |
Distinct count |
(Подсчет числа только уникальных элементов) Подсчитывает число неповторяющихся элементов, например, если слово 'Дурак' встречается много раз, то оно засчитывается только однажды |
with |
(Корреляция) Вычисляет меру отношений между двумя или более элементами |
Covariance with |
(Ковариантность, смешанный момент второго порядка) Вычисляет меру дисперсии между двумя или более элементами |
|
(Медиана) Вычисляет статистическую медиану всей совокупности элементов |
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 |
(Дисперсия генеральной совокупности) Вычисляет статистическую дисперсию всей генеральной совокупности элементов |
Population standard |
(Среднее отклонение генеральной совокупности) Вычисляет среднее отклонение всей генеральной совокупности элементов |
Weighted average with |
(Взвешенное среднее значение) Вычисляет среднее значение, взвешенное по числу раз появления элементов |
Эта вкладка позволяет выполнить операцию по выделению в специальную группу лидеров или аутсайдеров данных по выбранному критерию. Остальные данные будут проигнорированы. Например, можно выделить в группу 10 лучших клиентов по итогам прошлогодних продаж. Таким же образом можно составить отчет по заданному числу наихудших клиентов.

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

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

Фильтр, закрепляемый за полями, при невозможности преобразования в SQL-запрос реализуется собственными средствами генератора отчетов. Здесь интересно отметить, что Crystal Reports самостоятельно связывается с БД и выбирает из нее указанные данные по настроенным критериям.
Последней вкладкой мастера создания отчета является Report Style, устанавливающая внешний вид будущего отчета.
Щелкните на кнопке Finish и мастер создаст заготовку отчета, которую откроет в конструкторе Report
Designer (в
режиме дизайнера)
Обратите внимание на две вкладки внизу рабочей области дизайнера отчета. Они позволяют переключаться в режим конструирования или предварительного просмотра отчета. Наш сгенерированный отчет изначально состоит из 5 основных секций:
Дополнительными являются секции 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 представлены контейнеры со всеми объектами типа поле, которые могут присутствовать в отчете:

Добавление полей на форму отчета в режиме Report Designer осуществляется простым перетаскиванием поля из панели Field Explorer в нужное место формы либо через меню Crystal Reports, либо через контекстное меню формы отчета командой Insert. Настройка отображения поля осуществляется через окно Format Editor, вызываемое на форме в контекстном меню поля опцией Format Object.
Команда Insert/Text Object вставляет на форму отчета текстовое поле, с помощью которого создаются надписи и другие элементы, подобные названиям столбцов и комментариев, которые не должны меняться в зависимости от информации, поступающей из источника. Затем обычным образом этому полю можно настроить параметры форматирования. Во многих ситуациях очень удобно помещать внутрь текстового поля обычные поля из таблиц базы данных. Можно перекрыть несколько текстовых полей друг поверх друга или поля заголовков и подавлять отображение ненужных средствами условного форматирования.
Другими простыми средствами оформления отчетов, доступных через команду Insert, являются объекты
Доступными специальными полями ( Special Fields ) являются следующие:

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, чтобы дерево
отчета вначале, при запуске проекта, не отображалось
Запустите
приложение и получите ожидаемый результат
В данном упражнении мы создадим отчет с нуля без помощи мастера, но используя графический режим дизанера отчетов 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,
чтобы текст заголовка помещался в полеСистема 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 раньше
загрузки туда самих данных, поскольку во время загрузки он выполняет форматирование
данных, пропуская их через себя. А далее мы связываем объект просмотра с самим
отчетом и попутно донастраиваем его. Вот пока и все, наступил момент истины!
Запустите приложение
и полюбуйтесь на результат, который вы и я сами сделали вручную, можно сказать,
с нуля
Нам необязательно идти таким сложным путем через создание типизированного набора данных. В предыдущих лабораторных работах мы создавали нетипизированные наборы данных и заполняли их нужными данными. Учитывая, что шаблоны отчетов могут существовать самостоятельно в отдельных файлах, можно заранее их изготовить под готовые структуры данных, а потом в коде загружать в документ отчета необходимые данные и необходимую форму отчета. Можно воспользоваться и готовыми формами отчетов, созданными другими людьми. Существуют, также, способы управлять объектом отчета и программно, по мы их в данном упражнении рассматривать не будем.

Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.