Crystal Report с двумя источниками DataSet (xsd) - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть отчет, который должен получить данные из двух логических областей DAL моего приложения, Vendors.xsd и Customers.xsd. Я могу использовать эксперт по базам данных, чтобы поместить и DataSet, и их DataTables в отчет, но я получаю эту ошибку:

В этом отчете использовалось несколько источников данных или хранимых процедур. Пожалуйста, убедитесь, что не добавлено выражение SQL и нет серверной стороны group_by выполняется.

Кажется, все в построении / дизайне отчетов работает нормально. Когда я на самом деле запускаю отчет, он просит меня войти в один из двух наборов данных (кажется, тот, который я добавляю вторым) и не получает данные.

Я проверил и подтвердил, что у меня нет этой проблемы, если для начала поместить все таблицы в один xsd.

EDIT

Вот код, который я использую для загрузки отчета:

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 Ответ

3 голосов
/ 29 ноября 2011

Если вы не свяжете два набора данных логически, Crystal не сможет использовать их в одном отчете.

Однако, если вы создадите один или два вложенных отчета (в зависимости от того, связаны ли данные) и добавите соответствующий набор данных в каждый вложенный отчет, Crystal будет намного счастливее.

Обновление для новой информации в вопросе

Проблема в том, что у вас есть два различных набора отношений данных: клиент / адрес и клиент / поставщик.По сути, Crystal не знает, как объединить их в один большой оператор SQL, потому что нет никакой связи между поставщиком и адресом.

Решение состоит в том, чтобы в основном отчете была только информация о клиенте, а затем один подотчет.для данных поставщика и один подотчет для данных адреса.Эти подотчеты могут быть связаны по обычному адресу, так что в случае, если вы запустите этот отчет для нескольких клиентов, Crystal сможет автоматически получить правильную информацию о клиенте.

В нынешнем виде вы должны иметь возможность просто назначить таблицу поставщиков для одного источника данных подотчета и адресные данные для другого.

...