Службы Reporting Services: источник данных бизнес-объекта с родителем-ребенком-внуком - PullRequest
6 голосов
/ 14 февраля 2012

Как мне создать отчет с отношением родитель-ребенок-внук с использованием POCO / пользовательских бизнес-объектов?

public class Invoice
{
  public List<Account> Accounts { get; set; }
}

public class Account
{
  public List<LineItem> LineItems { get; set; }
}

public void GenerateReport()
{
    var localReport = new LocalReport();
    localReport.LoadReportDefinition(GetEmbeddedResource("Invoice.rdlc"));
    localReport.DataSources.Add(new ReportDataSource("InvoiceDataset", new List<Invoice> { invoices }));
}

Желательно использовать элементы управления Table и List над вложенными отчетами.Службы Reporting Services v10 с локальной обработкой (файлы .rdlc).

1 Ответ

8 голосов
/ 22 февраля 2012

Invoice.rdlc

  • Добавить набор данных с именем InvoiceDataset (из окна инструмента Данные отчета)
  • Добавить элемент управления List (поскольку отчет должен бытьпривязан к списку счетов-фактур, даже если список будет содержать только один элемент)
  • В элемент управления List добавьте поля уровня счета-фактуры, такие как имя клиента
  • В элемент управления List добавьте указатель элемента управления Subreportв Account.rdlc с именем «Account» и параметром InvoiceId

Account.rdlc

  • Добавить набор данных с именем AccountDataset (изокно «Данные отчета»)
  • Добавить параметр InvoiceId, соответствующий параметру, указанному в элементе управления Invoice.rdlc Подотчет
  • Добавить элемент управления List
  • В элемент управления List добавить Account-поля уровня, такие как Account Number
  • В элементе управления List добавьте вложенный отчет, указывающий на LineItem.rdlc с двумя параметрами: InvoiceId и AccountId

LineItem.rdlc

  • Добавление набора данных с именем LineItemDataset (из окна инструмента «Данные отчета»)
  • Добавление параметров InvoiceId и AccountId для соответствия параметрам, указанным в элементе управления Account.rdlc Подотчет
  • ДобавлениеЭлемент управления List
  • В элементе управления List добавьте поля уровня элемента строки, такие как Описание, Количество, Цена

Для создания этого отчета в формате PDF:

public byte[] GenerateInvoicePdf(Invoice invoice)
{
    var localReport = new LocalReport();

    localReport.LoadReportDefinition(GetEmbeddedResource("Invoice.rdlc"));
    localReport.LoadSubreportDefinition("Account", GetEmbeddedResource("Account.rdlc"));
    localReport.LoadSubreportDefinition("LineItem", GetEmbeddedResource("LineItem.rdlc"));
    var datasource = new List<Invoice> {invoice};
    localReport.DataSources.Add(new ReportDataSource("InvoiceDataset", datasource));
    localReport.SubreportProcessing +=
        (o, args) =>
            {
                if (args.ReportPath == "Account")
                {
                    var invoiceId = long.Parse(args.Parameters["InvoiceId"].Values[0]);
                    var invoice = datasource.First(x => x.InvoiceId == invoiceId);
                    args.DataSources.Add(new ReportDataSource("AccountDataset", invoice.Accounts));
                }
                else if (args.ReportPath == "LineItem")
                {
                    var invoiceId = long.Parse(args.Parameters["InvoiceId"].Values[0]);
                    var accountId = long.Parse(args.Parameters["AccountId"].Values[0]);
                    var invoice = datasource.First(x => x.InvoiceId == invoiceId);
                    var account = invoice.Accounts.First(x => x.AccountId == accountId);
                    args.DataSources.Add(new ReportDataSource("LineItemDataset", account.LineItems));
                }
            };
    return localReport.Render("pdf");
}
...