我有一份报告需要从我的应用程序的DAL,Vendors.xsd和Customers.xsd的两个逻辑区域获取数据。我可以使用Database Expert将DataSet及其DataTable放入报告中,但是我收到此错误:
此报告中使用了多个数据源或存储过程。 请确保没有添加SQL表达式,也没有服务器端group_by 执行。
关于报告构建/设计的一切似乎都运行良好。当我实际运行报告时,它要求我登录到两个DataSet中的一个(似乎是我添加的第二个)并且没有获取数据。
我测试并确认如果我将所有表放在一个xsd中,我就没有这个问题。
修改
以下是我用于加载报告的代码:
Protected Sub CrystalReportViewer1_Init(sender As Object, e As EventArgs) Handles CrystalReportViewer1.Init
'Get Customer ID param
Dim CustomerID As Integer
If Not Integer.TryParse(Request.QueryString("CustomerID"), CustomerID) Then
CancelReportOnError("You must provide a customer ID!")
End If
'Get address type ID param
Dim AddressTypeID As Integer
If Not Integer.TryParse(Request.QueryString("AddressTypeID"), AddressTypeID) Then
CancelReportOnError("You must provide an address type!")
End If
'Gather report data --
'Address
Dim customersControl As New BLL.Customers()
Dim AddressData As DAL.Customers.AddressesDataTable = customersControl.GetAddressByCustomerID(CustomerID, AddressTypeID)
AddressData.TableName = "Addresses"
'Customer
Dim CustomerData As DAL.Customers.CustomersDataTable = customersControl.GetCustomerByID(CustomerID)
CustomerData.TableName = "Customers"
'Confirm customer exists
If CustomerData.Count = 0 Or AddressData.Count = 0 Then
CancelReportOnError(String.Format("Could not find Customer with ID {0}", CustomerID))
End If
'Vendor
Dim vendorsControl As New BLL.Vendors()
Dim VendorData As DAL.Vendors.VendorsDataTable = vendorsControl.GetVendordByCustomerID(CustomerID)
VendorData.TableName = "Vendors"
'Confirm vendor exists
If VendorData.Count = 0 Then
CancelReportOnError(String.Format("Could not find a Vendor associated with Customer ID {0}", CustomerID))
End If
'Build data source
Dim ReportData As New DataSet()
ReportData.Tables.Add(VendorData)
ReportData.Tables.Add(CustomerData)
ReportData.Tables.Add(AddressData)
ReportData.Relations.Add(CustomerData.CustomerIDColumn, AddressData.CustomerIDColumn)
ReportData.Relations.Add(VendorData.VendorIDColumn, CustomerData.VendorIDColumn)
'Load the report
Dim Report As New ReportDocument()
Report.Load(Server.MapPath("~/Members/Customers/MailingEnvelope.rpt"))
Report.SetDataSource(ReportData)
'Set the report to our viewer
CrystalReportViewer1.ReportSource = Report
CrystalReportViewer1.DataBind()
End Sub
答案 0 :(得分:3)
除非您将两个数据集逻辑绑定在一起,否则Crystal将无法在同一报表中使用它们。
但是,如果您创建一个或两个子报表(取决于数据是否相关),并将相应的数据集添加到每个子报表,Crystal将会更加快乐。
有关新信息的更新
问题是您有两组不同的数据关系:客户/地址和客户/供应商。从本质上讲,Crystal不知道如何将这些引入一个大的SQL语句,因为供应商和地址之间没有关系。
解决方案是在主报表中仅包含客户信息,然后为供应商数据提供一个子报表,为地址数据提供一个子报表。这些子报表可以由customerid链接,以便在您为多个客户运行此报表时,Crystal可以自动提取正确的客户信息。
现在,您应该能够将供应商表分配给一个子报表的数据源,并将地址数据分配给另一个子报表。