Создание отчетов из хранимых процедур
Чтобы проиллюстрировать эту тему, сначала создадим параметризованную хранимую процедуру для работы с таблицей базы данных 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 в средстве отображения отчетов. Хотя эта программа может показаться несколько скомканной, она, тем не менее, работает.
Содержание раздела