Чтобы проиллюстрировать эту тему, сначала создадим параметризованную хранимую процедуру для работы с таблицей базы данных 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 _ Dim scmCustomersSP As New SqlClient.SqlCommand("spCustomers", _ Dim sdaCustomersSP As New SqlClient.SqlDataAdapter(scmCustomersSP) cbsMain.SetDataSource(dsReport) 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).
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 |