具有两个DataSet(xsd)源的Crystal Report

时间:2011-11-28 23:01:09

标签: asp.net visual-studio crystal-reports dataset

我有一份报告需要从我的应用程序的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

1 个答案:

答案 0 :(得分:3)

除非您将两个数据集逻辑绑定在一起,否则Crystal将无法在同一报表中使用它们。

但是,如果您创建一个或两个子报表(取决于数据是否相关),并将相应的数据集添加到每个子报表,Crystal将会更加快乐。

有关新信息的更新

问题是您有两组不同的数据关系:客户/地址和客户/供应商。从本质上讲,Crystal不知道如何将这些引入一个大的SQL语句,因为供应商和地址之间没有关系。

解决方案是在主报表中仅包含客户信息,然后为供应商数据提供一个子报表,为地址数据提供一个子报表。这些子报表可以由customerid链接,以便在您为多个客户运行此报表时,Crystal可以自动提取正确的客户信息。

现在,您应该能够将供应商表分配给一个子报表的数据源,并将地址数据分配给另一个子报表。