В этой статье я приведу пример создания и использования отчёта Crystal Reports в Visual Studio.
Приведённый пример — это реально рабочий проект по подготовке к печати билетов на обычном лазерном принтере.
Начнём с того что нам потребуется источник данных поэтому вначале создадим проект в котором будем использовать наш отчёт и создадим источник данных который выгрузим в XML файл, для более простого и наглядного создания нового отчёта и его настройки.
1. Создаём обычный проект C# в Visual Studio, форму и добавляем 3 поля: префикс (на нашем билете будет штрихкод и номер, в штриховом коде будет использован префикс), начальный номер билета (с какого номера начать печать), конечный номер (каким закончить). Также добавляем кнопку, ао нажатию на которую будет происходить заполнение источника данных и вызов формы.

Вот как это выглядит:
2. Теперь по нажатию кнопки описываем процедуру создания XML файла с данными для отчёта.
private void button1_Click(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0","utf-8",null));
XmlNode rootNode = doc.AppendChild(doc.CreateElement("ticket"));
int j = int.Parse(textBox2.Text);
int j1 = int.Parse(textBox3.Text);
for (int i = j; i < j1+1; i++)
{
XmlNode bookNode = rootNode.AppendChild(doc.CreateElement("ticket"));
XmlNode titleNode = bookNode.AppendChild(doc.CreateElement("bar"));
long number = int.Parse(textBox1.Text);
number = number * 10000;
number = number+i;
titleNode.InnerText = "*" + number.ToString() + "*";
XmlNode titleNode1 = bookNode.AppendChild(doc.CreateElement("number"));
string num = number.ToString();
titleNode1.InnerText = num[2].ToString()+num[3].ToString()+num[4].ToString()+num[5].ToString();
}
doc.Save(@".\dataset.xml");
}
(Код создаёт XML файл с номерами и щтриховыми кодами билетов, штриховые коды начинаются и заканчиваются символом "
*" — поскольку будем использовать тип штрихкодов Code39.)
3. После того как наш XML файл сохранён приступаем к созданию непосредственно самого отчёта (отчётной формы).
Создаём новый проект в Visual Studio — Reporting -> Crystal Reports Application.
Появится проект отчёта, в который добавляем источник данных, в дереве слева:
Левой кнопкой по «Database Fields» затем Database Expert -> Database Files (выбираем созданный нашим проектом XML файл), затем выбираем поля, в нашем случае все.
Для размещения полей в отчёте просто перетаскиваем их на лист.
Вот что получилось у меня:

Чтобы сделать так, как на рисунке необходимо изменить параметры отчёта в Report->Section Expert. (там задаются основные параметры отчёта, от которых зависит какой именно вид он примет).
По завершении сохраняем наш отчёт и копируем из полученного проекта CrystalReport1.rpt в папку Debug предыдущего проекта.
4. Теперь возвращаемся к нашему проекту и пишем оставшуюся часть кода для вызова отчёта.
Прежде всего добавляем ещё одну форму (в нашем случае FormRW), и размещаем на ней элемент CrystalReportViewer — здесь мы будем отображать наш отчёт.

И дописываем процедуру нажатия кнопки:
private void button1_Click(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0","utf-8",null));
XmlNode rootNode = doc.AppendChild(doc.CreateElement("ticket"));
int j = int.Parse(textBox2.Text);
int j1 = int.Parse(textBox3.Text);
for (int i = j; i < j1+1; i++)
{
XmlNode bookNode = rootNode.AppendChild(doc.CreateElement("ticket"));
XmlNode titleNode = bookNode.AppendChild(doc.CreateElement("bar"));
long number = int.Parse(textBox1.Text);
number = number * 10000;
number = number+i;
titleNode.InnerText = "*" + number.ToString() + "*";
XmlNode titleNode1 = bookNode.AppendChild(doc.CreateElement("number"));
string num = number.ToString();
titleNode1.InnerText = num[2].ToString()+num[3].ToString()+num[4].ToString()+num[5].ToString();
}
doc.Save(@".\dataset.xml");
//Создаём отчёт
ReportDocument myReport = new ReportDocument();
//Задаём форму (которую создавали в пункте 3)
myReport.Load(@".\CrystalReport1.rpt");
DataSet myDS = new DataSet();
//Указываем источнику данных вновь сформированный XML файл.
myDS.ReadXml(@".\dataset.xml");
//Указываем отчёту откуда брать данные.
myReport.SetDataSource(myDS);
//Создаём форму.
FormRW frm = new FormRW();
//Указываем отчёт для CrystalReportViewer
frm.crystalReportViewer1.ReportSource = myReport;
//Открываем форму.
frm.Show();
}
Для работы всех используемых в проекте компонент потребуется подключить:
using System.Xml;
using System.Xml.Schema;
using CrystalDecisions.CrystalReports.Engine;
using System.IO;
P.S.
Вот что получилось в результате (после некоторых доработок):
Скачать исходник:
MakeBarTicket.rar
Комментарии (47)
RSS свернуть / развернутьRoman
PavelDemyanenko
Roman
dixus
Этот метод простой, но ограничен тем, что нельзя для заранее не заданного количества записей, как в моем случае с билетами, задать каждому отдельную картинку (например фото). Однако можно динамически подгружать некоторый набор изображений.
Блин… Во написал, сам запутался. Вообщем это как на билетах в примере, можно скажем менять зверушек, но на всех билетах они будут одинаковые, хотя и будут отличаться от параметров вывода отчета. А вот чтобы на каждом билете сделать, это наверное и можно — но скорее всего сложно, не пробовал.
Через OLE object — так:
Правой кнопкой по отчету в редакторе там выбираем — Insert -> Ole Object…
Появится вот это
Тут надо обязательно поставить галочку связь.
Затем перед выводом отчета уже из программы — меняем файл на нужный нам (сохраняем на его место нужный нам файл). При выводе отчета его и отобразит.
Остается только из базы вытянуть файл и положить на место указанного.
P.S. Файл должен быть .BMP!!!
Roman
Необходимо печатать одно изображение на одном листе, но имя берётся из БД. Как такое провернуть и возможно ли?
Делаю так:
1. Правой кнопкой по отчету, в редакторе выбираю — Insert -> Ole Object…
2. Ставлю галочку связь.
3. Перед выводом отчета подменяю файл test.bmp любым другим файлом, например Photo.bmp. Но при выводе отчета всё равно отображается test.bmp.
Необходимо, например:
Имя файла test.bmp (берётся из mbd файла — каким образом?), вставляем его в отчёт, потом подменяем этот файл любым другим, но путь динамически изменяется (в зависимости от того. где находится запускной файл).
Что не верно?
Madster
Описал как по нормальному добавлять изображения в отчёт.
Roman
mrzlodey
Я обычно для тестов выгружаю набор данных в XML — и используя XML-ку создаю сам отчет, редактирую меняю как надо (удобно, при выгрузке из DataSet-а в XML структура данных сохраняется), потом rpt файл забираю и в приложении уже данные берутся не из XML.
Roman
mrzlodey
Создать программно DataTable, задать в ней колонки допустим PARAM и VALUE, заполнить чем хотим, и затем добавить в наш DataSet.
P.S. В DataSet можно добавлять много таблиц и все они будут переданы в отчет.
Roman
В шаблоне отчета необходимо создать параметр «prm».
mrzlodey
Roman
А как можно вытягивать данные в отчет, используя написанный Вами класс для работы с MySQL?
it-serv
Далее, как в примере добавляем источник данных ds в отчёт и всё.
Roman
Отчёт создаётся и заполняется, но заполняется без учёта скульного фильтра. В чём может быть дело?
Madster
Запрос же вернёт набор одинаковых значений
Возвращает набор чисел 546.
Roman
код номер
1 123
2 234
3 546
После обработки фильтром, в отчет должна попасть строка с кодом 3. Но попадают все. Не может это быть связано с неправильно составленным файлом отчёта?
Madster
Если всё ОК, то копать в сторону отчёта. При создании RPT файла, он же чем-то заполняется, так вот то чем он заполняется по структуре должно быть таким же как то что передаём в момент выполнения.
Самый лучший способ правильно сделать RPT — файл это подключить к нему xml — файл источника данных, а сам xml — файл из источника данных получить очень просто:
Roman
На 6 и 7 — ом версии CrystalReport, (это не применимо к Visual Studio) из проектов на Delphi когда запускал, помню как раз схожая проблема была с обновлением, там надо было специально запускать обновление данных, иначе отчёт вроде как запоминал последний результат выборки. (точно не помню, может параметр там какой-то в отчёте ставился чтобы этот эффект не проявлялся, давно было).
Всё что я описал перед этим должно сработать, пробуйте делать отчёт с использованием xml-ки.
Roman
Madster
Попробовал сделать как описано в посте:
«Сделал так:
В шаблоне отчета необходимо создать параметр «prm».»
Добавил строки так:
Создал новый параметр в отчёте. И теперь при его запуске появляется запрос на ввод этого параметра. А нужно, чтобы он подцеплял string str = «150». Что не верно?
Madster
Создаём переменную в отчёте, вот так:
Затем, задаём параметр в коде:
Я это сделал в самом конце, уже после того как источник данных подключил к отчёту.
И вот, что получилось:
Roman
Madster
Madster
1. Создаю из основного проекта XML-ку с набором данных, для отчёта (чтобы было с чем экспериментировать.
2. Создаю совершенно новый проект в студии CrystalReport — не имеющий ничего общего с основным.
3. Добавляю в него в качестве данных XML-ку и использую поля для размещения на форме отчёта.
4. Сохраняю.
5. Забираю из этого проекта rpt — файл и использую его в основном проекте, обычно они у меня в отдельной папочке c отчётиками все лежат, подключая к нему напрямую источник данных — и всё работает.
Roman
Madster
А если уж без этого никак, то перед загрузкой данных из XML, неплохо бы датасет вычистить:
Roman
А как тогда происходит привязка к базе, если в отчёте мы указываем в качестве источника XML, а потом его не используем?
И второй вопрос: на машинах, где нет студии программа не запускается. Какие компоненты должны быть обязательно установлены помимо .NET Framework 2.0?
Madster
На клиенте нужны:
.NET — Не ниже той под которую писали.
И библиотеки Crystal Report-а — CRRedist2008_x86.msi или CRRedist2008_x64.msi в зависимости от разрядности платформы.
Библиотеки поиском можно найти в каталоге с VisualStudio.
Roman
Компоненты среды выполнения Crystal Reports
Madster
хочу сделать динамически создаваемый отчет без XML,
1)сейчас остановился на том что в этой строке выдает ошибку:
GetAllTypeStreet() — возвращает DataTable
если у кого есть готовый пример, вышлите на hvvmail@mail.ru
спасибо
HVV83
Roman
в CrystalReport.rpt1 я добавлял только два поля в Parametr Fields, в которые в последующем думал подставить значения.
HVV83
Просто передавайте параметры:
pram1 — это наименование параметра.
Go Go Go! — значение, подставляете своё, и всё.
Roman
хочу отобразить столбец, а мне выдает одну запись такого вида:
или надо в цикле перебрать?, и как правильно отобразить значения?
HVV83
Вам, как я понимаю необходимо передать в отчёт таки набор данных.
Для этого — сохраните ваш DataSet — в файл xml.
После чего в редакторе rpt — файла, подключите внешним источником данных этот xml файл, настройте как необходимо, при этом сможете визуально это всё просмотреть (как оно будет при выполнении).
После этого полученный rpt — можно использовать в своём проекте просто передав ему DataSet (той же структуры — что сохраняли в xml).
Вот это вот, вообще не правильно:
Так можно только отдельное значение из таблицы в строку передать, и правильно это будет, вот так:
Вот так вот, а вообще советую скачать пример и вдумчиво перечитать все комментарии от начала, в них уже есть ответы на ваши вопросы.
Roman
1)устранить ошибку в этой части кода: ;
2)в коде создать привязку элементов на отчете с данными из DataSource.
З.Ы.
С Crystal Reports пока практически не знаком, до этого работал с отчетами в Access, там я в дизайнере отчета создавал поле с именем из DataSource в Section (Details) и наблюдал ожидаемый результат. Здесь я думаю все не на много отличается.
HVV83
Чтобы создать отчёт, с таким же источником данных какой мы ему будем передавать, мы просто (только для создания отчёта!) сохраняем источник данных в XML файл, вот так:
Это необходимо только чтобы создать rpt — файл! Который будет работать с таким же в точности источником данных какой мы ему будем передавать через myDS Только для создания! Далее в работе нам потребуется просто передать требуемый DataSet в отчёт и всё, без XML.
Разумеется перед сохранением надо его заполнить пробными данными, которые собираетесь выводить.
К отчёту RPT-файлу, для настройки:
В Field Explorer правой кнопкой по Database Fields. Там выбрать Databse Expert.
В нём подключаете файловый источник данных, как здесь:
После этого, можно будет настраивать отчёт используя загруженную структуру данных, с демо-данными.
XML — файл это всего лишь источник данных! Который используется для первоначальной настройки формы, далее он не нужен. Его вообще можно убрать из кода. В примере к публикации он используется для заполнения всё того-же DataSet — но это не значит, что DataSet нельзя заполнить прямо из базы, запросами.
Roman
HVV83
HVV83
HVV83
Спасибо. Просьба модератору объединить мои последние сообщения, или убрать лишние
HVV83
Сбой при загрузке информации из базы данных.
Ошибка в файле CrystalReport1 {4B582FDD-47AC-499A-8831-36EA5955CB1E}.rpt:
Сбой при загрузке информации из базы данных.
Как исправить?
MS Visual 2010 Ultimate 10.0.30319.1
AmFa
Он отличается от того что идёт в комплекте с 2008 студией, и скачивается и устанавливается отдельно.
Проект автоматически из версии 2008 в 2010 наврядли — скомпилируется. Во всяком случае я делал отдельный, новый проект.
Roman
Roman
AmFa
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.