Добавление отчетов профессионального качества в приложение пользователя в Visual Studio (2)

   степашко сандлер Ирина Владимировна Отзывы Стоимость. |       

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


Чтобы проиллюстрировать эту тему, сначала создадим параметризованную хранимую процедуру для работы с таблицей базы данных Customers, имеющей имя spCustomers. Эта хранимая процедура забирает параметр строки, который должен использоваться в операторе WHERE для ограничения количества возвращаемых записей. После этого в тексте программы я построю объект набора данных DataSet для этой процедуры и свяжу отчет с этим набором данных. Вот текст хранимой процедуры.

CREATE PROCEDURE dbo.spCustomers
(
@CustPattern nVarChar(40)
)
AS
select * from Customers Where CompanyName Like @CustPattern + '%'
RETURN

Вы можете создать хранимую процедуру любым удобным способом; например, с помощью Visual Studio .NET, как это показано на рисунке 6.

Рис. 6. Создание хранимой процедуры с помощью Visual Studio .NET

Чтобы создать отчет из хранимой процедуры (присвоив параметру @CustPattern произвольное значение "A"), я изменил текст события формы Load (см. пример на рисунке 7).

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

Dim scmCustomersSP As New SqlClient.SqlCommand("spCustomers", _
scnNorthwind)
scmCustomersSP.CommandType = CommandType.StoredProcedure
scmCustomersSP.Parameters.Add("@CustPattern", "A")

Dim sdaCustomersSP As New SqlClient.SqlDataAdapter(scmCustomersSP)
Dim dsReport As New DataSet()
sdaCustomersSP.Fill(dsReport, "Customers")

cbsMain.SetDataSource(dsReport)
cvwMain.ReportSource = cbsMain

End Sub

Рис. 7. Модифицированный OnLoad Event

В этой программе не используется ни один из тех объектов, которые были созданы на этапе разработки, за исключением объекта scnNorthwind. Существенно и то, что в этой программе также не используется экземпляр dsNorthwind строго типизированного набора DataSet в качестве источника данных для отчета. Вместо него я применил объект ADO.NET DataSet без контроля типов и с именем dsReport. Это чрезвычайно важно несмотря на то, что этот отчет разработан для строго типизированного набора DataSet.



Во время запуска отчета в качестве источника данных будет задан универсальный объект DataSet без контроля типов, структура которого соответствует структуре экземпляра dsNorthwind. Когда потребуется вызвать метод Fill объекта DataAdapter, я буду использовать переопределяемую версию, которая должна принять некое табличное имя. Чтобы гарантировать структурное соответствие dsReport и dsNorthwind, я задам для этого табличного имени имя Customers. Если я этого не сделаю, то на экране появится отчет без каких-либо данных.

Отчет можно создать не только на основе таблицы базы данных, как это было продемонстрировано в первом примере, но и на основе хранимой процедуры. Для установки значения параметра в программе требуется определенная команда, затрагивающая объекты, атрибуты и методы в разных пространствах имен генератора отчетов Crystal Reports for Visual Studio .NET. Рассмотрим это более подробно.

Чтобы хранимые процедуры можно было выбирать в качестве источников данных, требуется настроить генератор отчетов Crystal Reports for Visual Studio .NET. Для этого щелкните правой кнопкой мыши по пустой области в плоскости разработки отчета и выберите в контекстном меню пункт Designer | Default Settings. В диалоговом окне Default Settings откройте вкладку Database, проверьте, установлен ли флажок Stored Procedures в разделе Show, и щелкните по кнопке OK.

Затем щелкните правой кнопкой мыши по плоскости разработки отчета и выберите в контекстном меню пункт Database | Set Location. Спуститесь по иерархическому дереву Replace With к узлу OLE DB (ADO), еще раз щелкните правой кнопкой мыши, чтобы открылось диалоговое окно OLE DB (ADO), и введите всю необходимую информацию для подключения к вашей копии базы данных SQL Server Northwind. Вернувшись к диалоговому окну Set Location, разверните узел Northwind, затем узел Stored Procedures и выберите узел spCustomers;1. В комбинированном списке Current Data Source укажите Customers, щелкните по кнопке Replace и затем по кнопке Close.

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


Поскольку spCustomers является параметризированной хранимой процедурой, генератор отчетов Crystal Reports for Visual Studio .NET автоматически добавит в ваш отчет поле для параметров Crystal Reports с именем параметра хранимой процедуры. Чтобы в этом убедиться, разверните в окне Field Explorer узел Parameter Fields. Справа под ним вы увидите поле с параметром @CustPattern (см. рис.8).



Рис. 8. Параметры

Теперь вы можете установить cvwMain.ReportSource как на этапе разработки, так и в самой программе, указав на rpt-файл или на экземпляр cbsMain разработчика компонентов ReportDocument. При запуске приложения генератор отчетов Crystal Reports for Visual Studio .NET автоматически откроет диалоговое окно, запрашивающее значение параметра @CustPattern. Введите любую понравившуюся вам строку, чтобы генератор отчетов подключал только тех клиентов, у которых значение поля CompanyName будет начинаться с этой строки.

Не смотря на то, что генератор отчетов Crystal Reports for Visual Studio .NET может запросить значения параметров и запустить отчет без написания программного кода, в большинстве случаев желательно, чтобы эти значения запрашивались у приложений и передавались в отчет программным путем. На рисунке 9 приведена программа, необходимая для программного присваивания значений параметров с помощью объектной модели Crystal Reports. В этой программе я снова использовал произвольное значение "A", присвоив его параметру pdvCustPattern.







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

Dim pvCustPattern As New CrystalDecisions.Shared.ParameterValues()
Dim pdvCustPattern As New _
CrystalDecisions.Shared.ParameterDiscreteValue()

pdvCustPattern.Value = "A"
pvCustPattern.Add(pdvCustPattern)
cbsMain.DataDefinition.ParameterFields _
("@CustPattern").ApplyCurrentValues(pvCustPattern)

cvwMain.ReportSource = cbsMain

End Sub



Рис. 9. Назначение параметров

Относительно этой программы необходимо сделать ряд замечаний.


Мне не совсем понятно, почему параметрам T-SQL можно присвоить только одно значение, в то время как полям параметров генератора отчетов Crystal Reports for Visual Studio .NET присваивается совокупность значений. Учитывая этот факт, я построил такую совокупность значений, которая состоит только из одного элемента, и присвоил ему значение "A". В результате эта программа создает не только pvCustPattern, экземпляр объекта CrystalDecisions.Shared.ParameterValues, который допускает использование нескольких значений, но и pdvCustPattern, экземпляр класса CrystalDecisions.Shared.ParameterDiscreteValue, который допускает использование только одного значения. Программа присваивает строку "A" атрибуту Value для pdvCustPattern и загружает его в pvCustPattern посредством метода суммирования. Затем pvCustPattern присваивается полю параметра @CustPattern посредством метода ApplyCurrentValues, а экземпляр CustomersBasic присваивается атрибуту ReportSource в средстве отображения отчетов. Хотя эта программа может показаться несколько скомканной, она, тем не менее, работает.


Содержание раздела