如何在运行时将参数传递给 Crystal Reports






3.36/5 (8投票s)
一篇关于如何在运行时将参数从 Windows 窗体传递给 Crystal 报表的文章。
引言
在本文中,我将向您展示如何在运行时从 Windows 窗体向 Crystal Reports 传递参数。我从我参与的一个项目中展示了一个示例。您可以查看下图。这是一个车辆维护工单窗体。在这种情况下,如果您想打印工单窗体,您必须将此工单号(071208-0104-AVA230/2
)传递给 Crystal Report,以便报告仅显示所请求的工单。

首先,使用向导创建一个 Crystal Report。现在,我假设您知道如何在 VS 2005 中通过向导创建 Crystal Report。假设我们已经创建了与数据库中的 WorkOrders
表关联的报告。
现在,从 字段资源管理器 中,将 无绑定字符串字段 拖放到 Crystal Report 中。然后,从 字段资源管理器 中,浏览 公式字段,右键单击该无绑定字符串字段,并将其重命名为 UBWONo
。然后,右键单击 Crystal Report 中的该字段并格式化对象。然后将其字体颜色设置为白色,以便在运行时不显示。因此,您现在在报告中有一个字段,它将在运行时获取参数。但是,您必须将此参数字段值传递给实际的数据库 WorkOrderNo
字段,以便我们可以从数据库中获取该工单编号的记录。


现在,右键单击数据库字段 WorkOrders.BOWONo
并单击 选择专家…

在选择专家对话框中,提供以下参数

现在您的 Crystal Report 已经准备好接收参数了。在您调用报告的 Windows 窗体后面,在本例中,您将看到如上图所示的第一张图片。
Imports System.Data.SqlClient
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Public Class FrmWOVehicleMaint
Public logOnInfo As New CrystalDecisions.Shared.TableLogOnInfo()
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnPrint.Click
Me.Cursor = Cursors.WaitCursor
If SqlConn.State = 1 Then SqlConn.Close()
Dim frmRept As New FrmReportsDisplay
Dim oCR As New rptBOWorkOrder
oCR.DataDefinition.FormulaFields.Item("UBWONo").Text = "'" & Me.lblWONo.Text & "'"
strSQL = "SELECT VehiclesWorkOrders.BOWONo, VehiclesWorkOrders.DateGiven, _
VehiclesWorkOrders.TimeGiven, VehiclesWorkOrders.VehicleNo, _
VehiclesWorkOrders.Mileage,VehiclesWorkOrders.DateComplete, _
VehiclesWorkOrders.TimeComplete, VehiclesWorkOrders.TotalDownTime, _
Employees.FirstName, Employees.MiddleName, Employees.LastName, _
employees_1.FirstName AS Expr1, employees_1.MiddleName AS Expr2, _
employees_1.LastName AS Expr3,VehicleCard.VehicleType, _
VehicleCard.Manufacturer, VehicleCard.VinNo, _
VehiclesWorkOrders.Problem, VehiclesWorkOrders.Diagnose, _
VehiclesWorkOrders.PartsUsed, VehiclesWorkOrders.Remarks _
FROM VehiclesWorkOrders LEFT OUTER JOIN Employees _
AS Employees ON VehiclesWorkOrders.IssuedBy = _
Employees.EmployeeID LEFT OUTER JOIN Employees AS employees_1 _
ON VehiclesWorkOrders.HandoverTo = _
employees_1.EmployeeID LEFT OUTER JOIN VehicleCard _
AS VehicleCard ON VehiclesWorkOrders.VehicleNo = _
VehicleCard.VehicleNo WHERE VehiclesWorkOrders.BOWONo =_
" & oCR.DataDefinition.FormulaFields.Item("UBWONo").Text
Dim cmd As New SqlCommand(strSQL, SqlConn)
Dim DA As New SqlDataAdapter(cmd)
Dim DS As New DataSet
DA.Fill(DS, "VehiclesWorkOrders,Employees,Employees_1,VehicleCard")
DT = DS.Tables(0)
SqlConn.Open()
oCR.SetDataSource(DS)
frmRept.CRViewer.ReportSource = (oCR)
logOnInfo = oCR.Database.Tables(0).LogOnInfo
logOnInfo.ConnectionInfo.ServerName = mServerName
logOnInfo.ConnectionInfo.DatabaseName = mInitialCatalog
logOnInfo.ConnectionInfo.UserID = mUser
logOnInfo.ConnectionInfo.Password = mPassword
oCR.Database.Tables(0).ApplyLogOnInfo(logOnInfo)
frmRept.Show()
SqlConn.Close()
Me.Cursor = Cursors.Default
End Sub