В этой статье по-шагово будет показан процесс применения CrystalReports в
построении трехзвенных приложений.
Программное обеспечение:
ОС: Windows 2003 Server
Средства разработки:
Visual Studio.Net 2003 Enterprise Architecht
База данных: MS SQL Server 2000
Источник данных: Northwind
1. Создаем новый проект (File/New/ASP.NET Web Service), с именем
WebServiceCRVB1
2. Добавляем в проект компонент CrystalReport1.rpt (при создании выбираете As
Blank Report)
3. Подключаетесь к базе данных Northwind
Выбрав провайдер Microsoft OLE DB Provider for SQL Server, далее - Next
Заполняете информацию по подключению (в Server - имя вашего ПК, где размещена
база данных Northwind)
Нажимаете Next, потом Finish
Переносите таблицу Orders и нажимаете OK
4. Методом drag-and-drop переносите из FieldExplorer в поле Details объекты
OrderID, CustomerID, ShipCity и ShipCountry
5. Публикуем CrystalReport1.rpt (в результате в проекте появляется файл
CrystalReport1Service.asmx)
6. Создаем приложение Win-клиент путем добавления в Solution WebServiceCRSh
(для VB.Net - "WebServiceCRVB1") новый проект WinClientCRSh (для VB.Net
"WinClientWebServiceCRVB") (из Windows Application)
7. В проекте WinClientCRSh (для VB.Net - "WinClientWebServiceCRVB") переносим
на дизайнер форм Form1.cs (для VB.Net - Form1.vb) компоненты
CrystalReportViewer1 и кнопку (называем её btnLoadReport)
8. Добавляем Web Reference на CrystalReport1Service.asmx
Нажимаем Add Reference
8. Дважды кликаем по кнопке btnLoadReport и в обработчик события вписываем
следующий код:
С#-код:
private void btnLoadReport_Click(object sender, System.EventArgs e)
{
wscr.CrystalReport1Service wscr = new WinClientCRSh.wscr.CrystalReport1Service();
crystalReportViewer1.ReportSource = new wscr.CrystalReport1Service();
}
(После using System.Data; вставляем
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
)
VB.NET-код
Dim wscr As WinClientCRVB1.wscr.CrystalReport1Service
wscr = New WinClientCRVB1.wscr.CrystalReport1Service
CrystalReportViewer1.ReportSource = New wscr.CrystalReport1Service
(предварительно перед Public Class Form1 вставляем Imports
CrystalDecisions.CrystalReports.Engine)
9. Ставим проектом по умолчанию WinClientCRSh (для VB.Net -
"WinClientWebServiceCRVB")
10. Компилируем проект и запускаем.
11. Теперь перейдем к добавлению к web-сервису логики работы с
параметрическими запросами.
12. Переходим на проект WebServiceCRSh (для VB.Net - "WebServiceCRVB1"),
открываем дизайнер (Service1.asmx) переносим на него SqlDataAdapter1,
конструируем запрос: SELECT * FROM Orders WHERE (ShipCountry = @ShipCountry) (см
рисунок)
13. После двойного клика на Service1.cs (Service1.vb), в области кода
вписываем метод Web service-а (см рисунок)
С#-код:
[WebMethod]
public DataSet LoadReport(string ShipCountry)
{
DataSet ds;
ds = new DataSet();
sqlDataAdapter1.SelectCommand.Parameters["@ShipCountry"].Value = ShipCountry;
sqlDataAdapter1.Fill(ds);
return ds;
}
}
VB-код:
<WebMethod()> Public Function LoadReport(ByVal ShipCountry As String) As DataSet
Dim ds As New DataSet
SqlDataAdapter1.SelectCommand.Parameters("@ShipCountry").Value = ShipCountry
SqlDataAdapter1.Fill(ds)
Return ds
End Function
14. Тестируем web-service (запускаем на выполнение, при выполнении функции
LoadReport вводим в поле ShipCountry значение USA (или Germany) и нажимаем
Invoke)
15. После этого переходим в Win-клиент, где добавляем кнопку
btnParameterLoadReport и элемент управления Textbox (переименовываем в
tbShipCountry)
16. В корневую папку исполняемого файла win-клиента (WinClientCRSh (для
VB.Net - "WinClientWebServiceCRVB"); имя файла WinClientCRSh.exe (для VB.Net
WinClientWebServiceCRVB.exe)) переносим CrystalReport1.rpt (WebServiceCRSh (для
VB.Net - "WebServiceCRVB1")).
17. Двойным кликом по кнопке btnParameterLoadReport создаем обработчик
события нажатия кнопки, куда и вписываем следующий код:
С#-код:
private void btnParameterLoadReport_Click(object sender, System.EventArgs e)
{
ws.Service1 ws = new WinClientCRSh.ws.Service1();
DataSet myDataSet = new DataSet();
ReportDocument myReport = new ReportDocument();
string ShipCountry;
ShipCountry = tbShipCountry.Text;
myDataSet.Merge(ws.LoadReport(ShipCountry));
myReport.Load("CrystalReport1.rpt");
myReport.SetDataSource(myDataSet);
crystalReportViewer1.ReportSource = myReport;
}
VB-код:
Private Sub btnParameterLoadReport_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles btnParameterLoadReport.Click
Dim ws As WinClientWebServiceCRVB.ws.Service1
ws = New WinClientWebServiceCRVB.ws.Service1
Dim myDataSet As New DataSet
Dim ShipCountry As String
ShipCountry = tbShipCountry.Text
myDataSet.Merge(ws.LoadReport(ShipCountry))
Dim myReport As New ReportDocument
myReport.Load("CrystalReport1.rpt")
myReport.SetDataSource(myDataSet)
CrystalReportViewer1.ReportSource = myReport
End Sub
18. Нажимаем F5 и тестируем web-сервис.