Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

Работа с Crystal Report .NET
опубликовано: 02.11.2004 16:05

Популярный пакет генератора отчетов Crystal Report предназначен для создания отчетов презентабельного вида различного типа: табличные запросы к базам данных, сводные диаграммы, OLAP данные. Версия Crystal Report .NET несколько ограничена в возможностях по сравнению с Crystal Report, поставляемым как отдельное приложение, но тем не менее она позволяет реализовать широкий спектр отчетов для Windows и Web приложений.

Введение

Популярный пакет генератора отчетов Crystal Report предназначен для создания отчетов презентабельного вида различного типа: табличные запросы к базам данных, сводные диаграммы, OLAP данные. Версия Crystal Report .NET несколько ограничена в возможностях по сравнению с Crystal Report, поставляемым как отдельное приложение, но тем не менее она позволяет реализовать широкий спектр отчетов для Windows и Web приложений.

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

Настройки сайта, общие для всех страниц, будем хранить в файле web.config

  <appSettings>
     <add key="server" value="vevv"/>
      <add key="database" value="Northwind"/>
      <add key="user" value="srs-user"/>
      <add key="password" value="12345"/>
  </appSettings> 

Значения этих параметров говорят сами за себя - имя SQL сервера, название базы данных на сервере, имя пользователя базы данных пароль пользователя.

Подключение к базе данных с постраничным выводом запроса

Для создания нового файла отчета необходимо выбрать в Solution Explorer щелкнуть правой клавишей мыши на узле проекта и выбрать следующий пункт меню – Add -> Add New Item и ввести в качестве имени файла connectDatabase.rpt.

После добавления файла отчета откройте его в среде.

На следующем шаге необходимо добавить подключение к базе данных, откуда отчет будет брать данные.

В качестве источника данных будем использовать Microsoft OLE DB Provider for SQL Server.

Щелкните правой клавишей мыши на поле отчета и выберите Database -> Add\Remove Database -> OLDE DB (ADO). При раскрытии этого узла появиться мастер для подключения базы данных SQL сервера. Заполните все необходимые поля, и убедитесь, что в блоке Available Data Sources стало доступно подключение к учебной базе NorthWind вашего сервера .

В качестве источников данных перенесите в блок Selected Tables таблицу Customers.

Теперь к нашему отчету подключена таблица Customers учебной базы NorthWind.

Теперь добавим поля таблицы Customers к нашему отчету.

Для этого щелкнем правой клавишей мыши на поле отчета и выберем Report -> Report Expert. Далее следуем указаниям мастера:

Закладка Data – в блоке Tables in report оставим Customers

Закладка Fields - в поле Fields to Display добавим поля Customers.CompanyName, Customers.ContactName, Customers.ContactTitle, Customers.Adress, Customers.City, Customers.Region, Customers.PostalCode, Customers.Country, Customers.Phone, Customers.Fax.

 

Закладка Group – в блок Group By добавим Customers.CompanyName

Закладка Style – укажем стиль Drop Table.

Теперь наш отчет готов к выполнению.

Далее создадим страницу для отображения отчета. Для этого

добавим в проект новую aspx страницу connect_to_db_padding.aspx

на форму из панели инструментов Web forms добавим компоненту CrystalReportViewer.

Для этого элемента выполним следующие настройки:

свойство ID=crPaging

свойство DysplayGroupTree = False

свойство EnableDrillDown= False.

Для вызова созданного нами отчета необходимо в метод Page_Init нашей страницы добавить инициализацию компоненты crPaging. Так как наш отчет ображается к базе MS SQL Server, требующий авторизации подключений, то так же необходимо обеспечить авторизацию на SQL Server’е.

Для этого после вызова метода InitializeComponent() введем следующий код:

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) 
	Handles MyBase.Init

    'CODEGEN: This method call is
required by the Web Form Designer
    'Do not modify it using the code editor.
   InitializeComponent()
   Dim log As New TableLogOnInfo
   Dim ci As New ConnectionInfo
    ci.ServerName = ConfigurationSettings.AppSettings("server")
    ci.DatabaseName =
ConfigurationSettings.AppSettings("database")
    ci.UserID = ConfigurationSettings.AppSettings("user")
    ci.Password = ConfigurationSettings.AppSettings("password")
    log.ConnectionInfo = ci
   
   Dim tbs As Tables
    Dim tb As
Engine.Table
   Dim rDoc As New ReportDocument
    rDoc.Load(Server.MapPath("reports\connectDatabase.rpt"))
    crPaging.ReportSource = rDoc
    
    tbs = rDoc.Database.Tables
    tb = tbs(0)
    log = tb.LogOnInfo
    log.ConnectionInfo = ci
    tb.ApplyLogOnInfo(log)
    crPaging.DataBind()

End Sub

В этом коде мы создаем объекты типа TableLogOnInfo и ConnectionInfo, инициализируем их параметрами подключения к базе данных, которые мы описали в файле web.config.

После этого загружаем в объект типа ReportDocument наш отчет, и присваиваем его в качестве источника данных для объекта CrystalReportViewer.

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

Подключение к базе данных MS SQL без постраничного вывода записей отчета

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

Если же вам необходимо отображать все выбранные записи, то для этого необходимо дополнительно настроить объект CrystalReportEngine.

В этом примере мы рассмотрим две возможности подключения к файлам отчета – через модель пространства CrystalDecisions.Web и через функции API Crystal Report Engine пространства CrystalDecisions.CrystlReports.Engine.

Для этого примера будем использовать тот же отчет connectDatabase.rpt.

Добавим в проект новый файл connect_to_db.aspx, разместим на нем объекты со следующими названиями

кнопка btnFile - загружает отчет по имени файла отчета

кнопка btnEngine – загружает отчет на основе объектной модели CrystalEngine

объект crDataBase – объект для отображения отчета.

Подключение отчета через объектную модель пространства CrystalDecisions.Web

В качестве отклика на нажатие мыши кнопки btnFile введем следующую функцию:

Private Sub btnFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
	Handles
btnFile.Click

    Dim log As New TableLogOnInfo
   Dim ci As New ConnectionInfo

    ci.ServerName =
ConfigurationSettings.AppSettings("server")
    ci.DatabaseName =
ConfigurationSettings.AppSettings("database")
    ci.UserID = ConfigurationSettings.AppSettings("user")
    ci.Password = ConfigurationSettings.AppSettings("password")
    log.ConnectionInfo = ci

    Dim tbs As Tables
    Dim tb As
Engine.Table
   Dim rDoc As New ReportDocument
    rDoc.Load(Server.MapPath("reports\connectDatabase.rpt"))
    crDataBase.ReportSource = rDoc

    tbs = rDoc.Database.Tables
    tb = tbs(0)
    log = tb.LogOnInfo
    log.ConnectionInfo = ci

    tb.ApplyLogOnInfo(log)
    crDataBase.DataBind()
    crDataBase.Visible = True

End Sub 

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

Для этого в панели инструментов Propertires объекта crDataBase установим поля DisplayGroupTree, DisplayToolBar,EnableDrillDown,SeparatePages   в false.

 

  Значения полей следующие
DisplayGroupTree Включает\выключает отображение дерева детализации выборки
DisplayToolBar Включает\выключает отображение панели инструментов отчета
EnableDrillDown Включает\выключает возможность детализации отчета
SeparatePages Включает\выключает разбиение на страницы отчета

Подключение отчета через объектную модель пространства CrystalDecisions.CrystlReport.Engine

В качестве отклика на нажатие мыши кнопки btnEngine введем следующую функцию:

Private Sub
btnEngine_Click(ByVal sender As
System.Object, ByVal e As
System.EventArgs) 
	Handles btnEngine.Click

Dim log As New TableLogOnInfo
Dim ci As New
ConnectionInfo

ci.ServerName = ConfigurationSettings.AppSettings("server")
ci.DatabaseName = ConfigurationSettings.AppSettings("database")
ci.UserID = ConfigurationSettings.AppSettings("user")
ci.Password = ConfigurationSettings.AppSettings("password")
log.ConnectionInfo = ci

Dim tbs As
Tables
Dim tb As Engine.Table
Dim rDoc As New connectDatabase

tbs = rDoc.Database.Tables
tb = tbs(0)
log = tb.LogOnInfo
log.ConnectionInfo = ci
tb.ApplyLogOnInfo(log)

crDataBase.ReportSource = rDoc
crDataBase.DataBind()
crDataBase.Visible = True

End Sub

Единственное отличие в данном примере вышеуказанного метода подключения состоит в методе инициализации объекта отчета

Dim rDoc As New connectDatabase

tbs = rDoc.Database.Tables

В данном случае документ отчета инициализируется объектом класса connectionDatabase, имя которого совпадает с именем файла отчета.

Отчет на основе SQL запроса

Источником данных для создания отчета может послужить и обыкновенный SQL запрос.

Для начала нужно создать в проекте новый файл отчета connectSQLQuerry.rpt и подключить SQL сервер к отчету через команду Database -> Add\Remove Database.

В качестве источника данных OLE DB (ADO) необходимо указать наш SQL сервер, подключить базу NorthWind. Сам же запрос необходимо вводить через команду Add command в блоке Available Data Sources

Щелкните мышью на узле Add Command и введите следующий SQL запрос

    select CompanyName,ContactName,Address from dbo.Customers order by CompanyName

Далее убедитесь, что все поля, перечисленные в операторе select, доступны в разделе DataBase Fields панели инструментов Field Explorer.

Далее воспользуйтесь мастером-генератором отчетов и создайте простой табличный отчет из введенного запроса.

Далее добавьте файл connect_to_sql_querry.aspx, в котором метод Page_Init модифицируйте следующим образом:

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) 
	Handles MyBase.Init

'CODEGEN: This method call is required by the Web Form
Designer
'Do not modify it using the code editor.

InitializeComponent()

Dim log As New TableLogOnInfo
Dim ci As New
ConnectionInfo

ci.ServerName = ConfigurationSettings.AppSettings("server")
ci.DatabaseName = ConfigurationSettings.AppSettings("database")
ci.UserID = ConfigurationSettings.AppSettings("user")
ci.Password = ConfigurationSettings.AppSettings("password")
log.ConnectionInfo = ci

Dim tbs As
Tables
Dim tb As Engine.Table
Dim rDoc As New ReportDocument

rDoc.Load(Server.MapPath("reports\connectSQLQuerry.rpt"))
tbs = rDoc.Database.Tables
tb = tbs(0)
log = tb.LogOnInfo
log.ConnectionInfo = ci
tb.ApplyLogOnInfo(log)

crQuerry.ReportSource = rDoc
crQuerry.DataBind()

End Sub 

Создание отчета на основе хранимой процедуры

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

Для этого создадим файл отчета connect_to_hpr.rpt, и включим возможность отображения хранимых процедур при подключении, щелкнув правой клавишей мыши на поле отчета и выбрав Desiner -> Default Settings -> Database. На этом окне выберем селектор Stored Procedure

Теперь ваш отчет может работать с хранимыми процедурами вашего SQL сервера.

Добавьте к отчету базу NorthWind вашего SQL сервера.в качестве источника данных укажите хранимую процедуру “Ten Most Expensive Products”. Убедитесь, что все поля, возвращаемые оператором select хранимой процедуры, присутствуют в Fields Explorer вашего отчета. Создайте простой текстовый отчет, воспользовавшись мастером отчетов Report Expert.

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

rDoc.Load(Server.MapPath("reports\connect_to_hpr.rpt"))

Параметризированный отчет с полями-параметрами

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

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

В данном примере мы будем использовать поля параметры отчета из панели Fields Explorer.

Мы будем использовать хранимую процедуру “Employee Sales by Country” базы NorthWind. Данная процедура выбирает список продаж сотрудника в заданном временном интервале.

Добавьте в проект файл отчета connect_parameters.rpt, добавьте в качестве источника данных хранимую процедуру базы “Employee Sales by Country” базы NorthWind. Ей необходимо передать в качестве параметров начало и конец интервала продаж. Для этого в панели Fields Explorer в разделе Parameter Fields добавьте два поля – BeginingDate и EndingDate типа DateTime.

Для того, чтобы хранимая процедура могла ими пользоваться, необходимо проинициализировать эти параметры соответствующими значениями.

Для этого добавим в проект страницу connect_parameter.aspx. Разместим на ней два объекта Calendar, один – Button, один CrystalReportViewer.

При их помощи мы будем устанавливать дату в параметрах отчета и генерировать отчет, соответствующий заданному интервалу.

В качестве отклика на нажатие кнопки введите следующий код

Private Sub
btnParameter_Click(ByVal sender As
System.Object, ByVal e As
System.EventArgs) 
	Handles btnParameter.Click

Dim log As New TableLogOnInfo
Dim ci As New
ConnectionInfo

ci.ServerName = ConfigurationSettings.AppSettings("server")
ci.DatabaseName = ConfigurationSettings.AppSettings("database")
ci.UserID = ConfigurationSettings.AppSettings("user")
ci.Password = ConfigurationSettings.AppSettings("password")
log.ConnectionInfo = ci

Dim tbs As
Tables
Dim tb As Engine.Table
Dim rDoc As New ReportDocument

rDoc.Load(Server.MapPath("reports\connect_parameters.rpt"))
crParameter.ReportSource = rDoc

Dim pr As
ParameterField
Dim dv As New
ParameterDiscreteValue

pr = crParameter.ParameterFieldInfo.Item("@Ending_Date")
dv = New ParameterDiscreteValue
dv.Value = cldEnd.SelectedDate.ToShortDateString.ToString(New
System.Globalization.CultureInfo("ru-ru"))
pr.CurrentValues.Add(dv)

dv = New ParameterDiscreteValue
dv.Value = cldBegin.SelectedDate.ToShortDateString.ToString(New
System.Globalization.CultureInfo("ru-ru"))
pr = crParameter.ParameterFieldInfo.Item("@Beginning_Date")
pr.CurrentValues.Add(dv)

tbs = rDoc.Database.Tables
tb = tbs(0)
log = tb.LogOnInfo
log.ConnectionInfo = ci
tb.ApplyLogOnInfo(log)

crParameter.DataBind()

End Sub

В данном примере инициализируются параметры @Ending_Date и @Beginning_Date отчета, после чего отчет загружается для выполнения.

Отчет с использованием фильтра

Условие на выборку записей из базы данных можно задавать не только применением полей параметров.

Для этого можно использовать возможность указания условия выбора в файле отчета rpt или при помощи объекта CrystalReportViewer.

В данном примере реализуем обе возможности.

Создадим новый файл отчета crystal_inreport.rpt. В качестве источника данных укажем таблицу Customers базы NorthWind вашего сервера. Через Report Expert в качестве полей, используемых в отчете, укажем следующие поля: CompanyName, ContactName, Address, City, Region. Country.

Для указания условия выбора будем использовать диалог условия выбора записей отчета. Для этого щелкнем правой клавишей мыши на поле отчета и выберем Report -> Edit Selection Formula -> Records. Откроется окно Record Selection Formula Editor. В поле для ввода условия введите {Customers.Country}='Usa' . Для ввода условия можно воспользоваться деревом элементов Report Fields. Данное условие выбирает всех продавцов, проживающих в Америке и эквивалентно условию where в операторе select.

Для указания условия выбора записей при помощи объекта CrystalReportViewer создадим новый файл connect_outreport.rpt, подключим к нему базу NorthWind и укажем в качестве источника данных те же таблицы и поля.

Далее создадим новую страницу connect_filter.aspx, в которую добавим два объекта типа Button и один объект типа CrystalReportViewer.

Одному объекту типа Button дадим название btnInFilter и в качестве отклика на нажатие мыши введем следующий код

Private Sub btnInReport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
	Handles
btnInReport.Click

Dim log As New TableLogOnInfo
Dim ci As New
ConnectionInfo
crFilter.Visible = True

ci.ServerName = ConfigurationSettings.AppSettings("server")
ci.DatabaseName = ConfigurationSettings.AppSettings("database")
ci.UserID = ConfigurationSettings.AppSettings("user")
ci.Password = ConfigurationSettings.AppSettings("password")
log.ConnectionInfo = ci

Dim tbs As
Tables
Dim tb As Engine.Table
Dim rDoc As New ReportDocument


crFilter.SelectionFormula = ""
rDoc.Load(Server.MapPath("reports\connect_inreport.rpt"))
crFilter.ReportSource = rDoc
tbs = rDoc.Database.Tables

tb = tbs(0)
log = tb.LogOnInfo
log.ConnectionInfo = ci
tb.ApplyLogOnInfo(log)

crFilter.DataBind()

End Sub

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

Второму объекту Button дадим имя btnOutReport и в качестве отклика на нажатие мыши введем следующий код

Private Sub
btnOutReport_Click(ByVal sender As
System.Object, ByVal e As
System.EventArgs) 
	Handles btnOutReport.Click

crFilter.Visible = True
Dim log As New
TableLogOnInfo
Dim ci As New
ConnectionInfo

ci.ServerName = ConfigurationSettings.AppSettings("server")
ci.DatabaseName = ConfigurationSettings.AppSettings("database")
ci.UserID = ConfigurationSettings.AppSettings("user")
ci.Password = ConfigurationSettings.AppSettings("password")

log.ConnectionInfo = ci

Dim tbs As
Tables
Dim tb As Engine.Table
Dim rDoc As New ReportDocument
rDoc.Load(Server.MapPath("reports\connect_outreport.rpt"))
crFilter.ReportSource = rDoc
crFilter.SelectionFormula = "{Customers.Country}='UK'"

tbs = rDoc.Database.Tables
tb = tbs(0)
log = tb.LogOnInfo
log.ConnectionInfo = ci
tb.ApplyLogOnInfo(log)

crFilter.DataBind()

End Sub

Данный код загружает всех заказчиков, проживающих в Великобритании. Условие на выбор задается оператором crFilter.SelectionFormula = "{Customers.Country}='UK'", которое эквивалентно указанию условия выбора в файле отчета.

Теперь при нажатии на кнопку btnInReport страница отображает заказчиков

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

Отчет на основе DataSet

До этого примера мы создавали отчеты, которые “вытягивали” данные из таблиц базы данных. В этом же примере мы будем использовать объект DataSet, который работает по принципу “втягивания” в себя данных. Мы создадим строго типизированный DataSet, который послужит источником для отчета.

Для начала добавим в проект страницу cdDS.aspx. добавим в нее объекты SqlDataConnection, SqlDataAdapter для подключения к базе данных NorthWind. Наиболее простой путь для этого – открыть Server Explorer, выбрать таблицу Customers базы NorthWind вашего сервера и перетащить ее на рабочую область вашей страницы. Среда создаст два объекта SqlDataConnection1 и SqlDataAdapter1, которые обеспечивают возможность подключения и выборки из базы данных. Переименуем их в connNorthWind и daNorthWind.

 

Так же с панели Data на поле формы разместим объект типа ReportDocument и дадим ему имя cbsMain. Впоследствии его будем использовать в качестве источника документа отчета.

Для создания набора данных обратимся к конструктору набора данных ADO.NET. Для этого выберем в Solution Explorer и щелкнем правой клавишей на узле проекта и выберем Add – Add New Item. В поле Categories выберем Data и создадим новый набор DataSet с именем dsNorthWind.xsd. Результат этих действий представлен ниже

Теперь в странице connect_ds.aspx сгенерируем строго типизированный DataSet. Для этого щелкнем на объекте daCustomers и нажмем Generate Datase на панели Properties. В диалоге создания DataSet выберите уже созданный нами crexamples.dsNorthWind.

Переименуйте полученный DataSet в dsMain.

Убедитесь, что адаптер dsCustomers загружает все поля таблицы Customers при помощи функции Preview Data.

Теперь создадим отчет на основе созданного объекта DataSet. Для этого добавим файл отчета cdDS.rpt в наш проект и откроем его в окне редактора. Далее в качестве источника данных укажем созданный нами DataSet. Для этого через функцию Database -> Add/Remove DataBase вызовем DataBase Explorer и укажем в нем в разделе ADO.NET DataSets созданный ранее dsNorthWind. Перенесем таблицу Customers в блок Selected Tables. Теперь в отчете через объект dsNorhtWind будут доступны все поля таблицы Customers.

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

На странице connect_ds.aspx в качестве отклика на событие Load в метод Page_Load введем следующие изменения

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
	Handles MyBase.Load

'Put user code to initialize the page here

daCustomers.Fill(dsMain)
cbsMain.SetDataSource(dsMain)
crDS.ReportSource = cbsMain
crDS.DataBind()

End Sub

В этом коде в объект dsMain загружается данные, после чего в объекте cbsMain типа ReportDocument в качестве источника данных указывается DataSet dsMain. Далее объект cbsMain подключается к объекту типа CrystalReportViewer и отображается на форме.

Диаграммы в Crystal Report .NET

В данном примере рассмотрим возможность применения диаграмм в Crystal Report.

Мы построим диаграмму, отображающую сумму продаж первых пяти компаний, обеспечивших максимум продаж.

Для начала добавим в проект файл отчета connect.chart.rpt и укажем в качестве источника данных в Database Expert таблицы Customers и Orders базы NorhtWind вашего сервера.

Теперь запустим Report Expert и в качестве полей отчета укажем поля Customers.CompanyName, Customers.Address, Orders.OrdersDate, Orders.Freight.

На закладке Group в качестве полей для группировки укажем Customers.CompanyName.

В поле Total укажем поле Orders.Freight в качестве суммирующего поля для каждой группы Customers.CompanyName.

На закладке Style любой стиль отображения данных отчета.

Теперь установим количество компаний, о которых будем выводить суммы продаж. Для этого выберем команду Report -> Top N \ Sort Group Expert и в диалоге Top N Expert установим следующие параметры

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

Теперь добавим в отчет диаграмму. Для этого щелкнем правой клавишей мыши в поле Report Header отчета. Выберем команду Insert ->Chart и установим тип диаграммы – круговой.

В диалоге Chart Expert на закладке Data в блоке On change of выберем Customers.CompanyName, в блоке Show выберем Sum of Orders.Freight.

Таким образом мы создали диаграмму, отображающую сумму продаж выбранной компании.

Далее добавим страницу для отображения отчета connect_diagram.asxp. Добавим объект crDialgram типа CrystalReportViewer, установим его свойство SeparatePages в false.

Код для загрузки отчета ничем не отличается от предыдущих примеров, разве что в качестве файла отчета необходимо указать connect_chart.rpt в методе Page_Init.

rDoc.Load(Server.MapPath("reports\connect_chart.rpt"))

Ваша диаграмма будет следующего вида

Так можно добавить графические объекты в свой отчет.

Литература о Crystal Report .NET

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

Девид Мак-Амис Профессиональная работа с Crystal Report .NET издательства Виллиамс.

Исходные примеры

Текст исходных примеров можно скачать здесь


Может пригодится:


Автор: Веденин Вадим
Прочитано: 8518
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (1)

Прислал: Serj
Очень полезная стаття для начинающих. Спасибо большое, сэкономил кучу времени!

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру