Spec-Zone .ru
спецификации, руководства, описания, API

21.2.5.17. Используя Соединитель/Сеть с Crystal Reports

Crystal Reports является общим инструментом, используемым разработчиками Приложения Windows, чтобы выполнить генерация документа и создание отчетов. В этом разделе мы покажем, как использовать Crystal Reports XI с MySQL и Соединителем/Сетью.

21.2.5.17.1. Создание Источника данных

Создавая отчет в Crystal Reports есть две опции для того, чтобы получить доступ к данным MySQL, разрабатывая Ваш отчет.

Первая опция должна использовать Соединитель/ODBC в качестве источника данных ADO, разрабатывая Ваш отчет. Вы будете в состоянии просмотреть свою базу данных и выбрать, табличное и полевое использование перетаскивают и отбрасывают, чтобы создать Ваш отчет. Недостаток этого подхода - то, что дополнительная работа должна быть выполнена в пределах Вашего приложения, чтобы произвести набор данных, который соответствует тот, ожидаемый Вашим отчетом.

Вторая опция должна создать набор данных в VB.NET и сохранить его как XML. Этот XML-файл может тогда использоваться, чтобы разработать отчет. Это работает вполне хорошо, выводя на экран отчет в Вашем приложении, но менее универсально во время проектирования, потому что следует выбрать все соответствующие столбцы, создавая набор данных. Если Вы забываете столбец, следует воссоздать набор данных прежде, чем столбец сможет быть добавлен к отчету.

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

Пример Visual Basic
Dim myData As New DataSetDim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myAdapter As New MySqlDataAdapterconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=world"Try    conn.Open()    cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _        & "country.name, country.population, country.continent " _        & "FROM country, city ORDER BY country.continent, country.name"    cmd.Connection = conn    myAdapter.SelectCommand = cmd    myAdapter.Fill(myData)    myData.WriteXml("C:\dataset.xml", XmlWriteMode.WriteSchema)Catch ex As Exception    MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try
C# Пример
DataSet myData = new DataSet();MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();conn.ConnectionString = "server=127.0.0.1;uid=root;" +  "pwd=12345;database=test;";try{  cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " +  "country.name, country.population, country.continent " +  "FROM country, city ORDER BY country.continent, country.name";  cmd.Connection = conn;  myAdapter.SelectCommand = cmd;  myAdapter.Fill(myData);  myData.WriteXml(@"C:\dataset.xml", XmlWriteMode.WriteSchema);}catch (MySql.Data.MySqlClient.MySqlException ex){  MessageBox.Show(ex.Message, "Report could not be created",  MessageBoxButtons.OK, MessageBoxIcon.Error);}

Получающийся XML-файл может использоваться в качестве ADO.NET источник данных XML, разрабатывая Ваш отчет.

Если Вы хотите разрабатывать свои отчеты, используя Соединитель/ODBC, он может быть загружен с dev.mysql.com.

21.2.5.17.2. Создание Отчета

В большинстве целей мастер Стандартного отчета помогает с начальным созданием отчета. Чтобы запустить мастер, откройте Crystal Reports и выбрать Новое> опция Standard Report из меню File.

Мастер сначала запрашивает Вас источник данных. Если Вы используете Соединитель/ODBC в качестве своего источника данных, используйте провайдера OLEDB для опции ODBC от OLE DB (ADO) дерево вместо ODBC (RDO) дерево, выбирая источник данных. Используя сохраненный набор данных, выберите ADO.NET (XML) опция и обзор к Вашему сохраненному набору данных.

Остаток от процесса создания отчета делается автоматически мастером.

После того, как отчет создается, выберите Опции Отчета... запись меню File. Непроверьте опцию Save Data With Report. Это препятствует тому, чтобы сохраненные данные вмешались в загрузку данных в пределах нашего приложения.

21.2.5.17.3. Отображение Отчета

Чтобы вывести на экран отчет, мы сначала заполняем набор данных с данными, необходимыми для отчета, затем загружаем отчет и связываем это с набором данных. Наконец мы передаем отчет к управлению crViewer для дисплея пользователю.

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

  • CrystalDecisions. CrystalReports. Механизм

  • CrystalDecisions. ReportSource

  • CrystalDecisions. Совместно используемый

  • CrystalDecisions. Windows. Формы

Следующий код предполагает, что Вы создали свой отчет, используя сохраненное использование набора данных кода, показанного в Разделе 21.2.5.17.1, "Создавая Источник данных", и имейте crViewer контроль на своей названной форме myViewer.

Пример Visual Basic
Imports CrystalDecisions.CrystalReports.EngineImports System.DataImports MySql.Data.MySqlClientDim myReport As New ReportDocumentDim myData As New DataSetDim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myAdapter As New MySqlDataAdapterconn.ConnectionString = _    "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=test"Try    conn.Open()    cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _        & "country.name, country.population, country.continent " _        & "FROM country, city ORDER BY country.continent, country.name"    cmd.Connection = conn    myAdapter.SelectCommand = cmd    myAdapter.Fill(myData)    myReport.Load(".\world_report.rpt")    myReport.SetDataSource(myData)    myViewer.ReportSource = myReportCatch ex As Exception    MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try
C# Пример
using CrystalDecisions.CrystalReports.Engine;using System.Data;using MySql.Data.MySqlClient;ReportDocument myReport = new ReportDocument();DataSet myData = new DataSet();MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " +        "country.name, country.population, country.continent " +        "FROM country, city ORDER BY country.continent, country.name";    cmd.Connection = conn;    myAdapter.SelectCommand = cmd;    myAdapter.Fill(myData);    myReport.Load(@".\world_report.rpt");    myReport.SetDataSource(myData);    myViewer.ReportSource = myReport;}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show(ex.Message, "Report could not be created",        MessageBoxButtons.OK, MessageBoxIcon.Error);}

Новый набор данных это генерировало использование того же самого запроса, используемого, чтобы генерировать ранее сохраненный набор данных. Как только набор данных заполнен, ReportDocument используется, чтобы загрузить файл отчета и связать его с набором данных. ReportDocument является переданным как ReportSource crViewer.

Этот тот же самый подход проявляется, когда отчет создается из единственной таблицы, используя Соединитель/ODBC. Набор данных заменяет таблицу, используемую в отчете, и отчет выводится на экран должным образом.

Когда отчет создается из многократных таблиц, используя Соединитель/ODBC, набор данных с многократными таблицами должен быть создан в нашем приложении. Это позволяет каждой таблице в источнике данных отчета быть замененной отчетом в наборе данных.

Мы заполняем набор данных с многократными таблицами, обеспечивая многократный SELECT операторы в нашем объекте MySqlCommand. Они SELECT операторы основаны на SQL-запросе, показанном в Crystal Reports в опции Show SQL Query меню Database. Примите следующий запрос:

SELECT `country`.`Name`, `country`.`Continent`, `country`.`Population`, `city`.`Name`, `city`.`Population`FROM `world`.`country` `country` LEFT OUTER JOIN `world`.`city` `city` ON `country`.`Code`=`city`.`CountryCode`ORDER BY `country`.`Continent`, `country`.`Name`, `city`.`Name`

Этот запрос преобразовывается в два SELECT запросы и выведенный на экран со следующим кодом:

Пример Visual Basic
Imports CrystalDecisions.CrystalReports.EngineImports System.DataImports MySql.Data.MySqlClientDim myReport As New ReportDocumentDim myData As New DataSetDim conn As New MySqlConnectionDim cmd As New MySqlCommandDim myAdapter As New MySqlDataAdapterconn.ConnectionString = "server=127.0.0.1;" _    & "uid=root;" _    & "pwd=12345;" _    & "database=world"Try    conn.Open()    cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER BY countrycode, name; " _        & "SELECT name, population, code, continent FROM country ORDER BY continent, name"    cmd.Connection = conn    myAdapter.SelectCommand = cmd    myAdapter.Fill(myData)    myReport.Load(".\world_report.rpt")    myReport.Database.Tables(0).SetDataSource(myData.Tables(0))    myReport.Database.Tables(1).SetDataSource(myData.Tables(1))    myViewer.ReportSource = myReportCatch ex As Exception    MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error)End Try
C# Пример
using CrystalDecisions.CrystalReports.Engine;using System.Data;using MySql.Data.MySqlClient;ReportDocument myReport = new ReportDocument();DataSet myData = new DataSet();MySql.Data.MySqlClient.MySqlConnection conn;MySql.Data.MySqlClient.MySqlCommand cmd;MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;conn = new MySql.Data.MySqlClient.MySqlConnection();cmd = new MySql.Data.MySqlClient.MySqlCommand();myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();conn.ConnectionString = "server=127.0.0.1;uid=root;" +    "pwd=12345;database=test;";try{    cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER " +        "BY countrycode, name; SELECT name, population, code, continent FROM " +        "country ORDER BY continent, name";    cmd.Connection = conn;    myAdapter.SelectCommand = cmd;    myAdapter.Fill(myData);    myReport.Load(@".\world_report.rpt");    myReport.Database.Tables(0).SetDataSource(myData.Tables(0));    myReport.Database.Tables(1).SetDataSource(myData.Tables(1));    myViewer.ReportSource = myReport;}catch (MySql.Data.MySqlClient.MySqlException ex){    MessageBox.Show(ex.Message, "Report could not be created",        MessageBoxButtons.OK, MessageBoxIcon.Error);}

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

Этот подход может вызвать проблемы производительности, потому что Crystal Reports должен связать таблицы на стороне клиента, которая будет медленнее чем использование предварительно сохраненного набора данных.