Службы Reporting Services: источник данных бизнес-объекта с родителем-потомком-внуком

Как создать отчет с отношениями родитель-потомок-внук, используя 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).


person Brian Low    schedule 13.02.2012    source источник


Ответы (1)


Invoice.rdlc

  • Добавьте набор данных с именем InvoiceDataset (из окна инструмента Report Data)
  • Добавьте элемент управления «Список» (поскольку отчет должен быть привязан к списку счетов-фактур, даже если список будет содержать только один элемент)
  • В элементе управления «Список» добавьте поля уровня счета, такие как «Имя клиента».
  • В элементе управления «Список» добавьте элемент управления «Подотчет», указывающий на Account.rdlc с именем «Учетная запись» и параметром InvoiceId.

Account.rdlc

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

LineItem.rdlc

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

Чтобы создать этот отчет в формате 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");
}
person Brian Low    schedule 21.02.2012