Reporting Services:具有父子孙的业务对象数据源

时间:2012-02-13 23:48:03

标签: reporting-services poco master-detail

如何使用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 }));
}

最好使用“子报表”上的“表”和“列表”控件。具有本地处理功能的Reporting Services v10(.rdlc文件)。

1 个答案:

答案 0 :(得分:8)

<强> Invoice.rdlc

  • 添加名为InvoiceDataset的数据集(来自“报告数据”工具窗口)
  • 添加列表控件(因为即使列表只包含一个元素,报表也必须绑定到发票列表)
  • 在列表控件中添加“客户名称
  • 等发票级别字段”
  • 在List控件中添加一个指向Account.rdlc的子报表控件,其名称为“Account”,参数为InvoiceId

<强> Account.rdlc

  • 添加名为AccountDataset的数据集(来自“报告数据”工具窗口)
  • 添加InvoiceId参数以匹配Invoice.rdlc子报表控件
  • 中指定的参数
  • 添加列表控件
  • 在列表控件中添加帐户级字段,如帐号
  • 在List控件中添加一个指向LineItem.rdlc的子报表,其中包含两个参数:InvoiceId和AccountId

<强> LineItem.rdlc

  • 添加名为LineItemDataset的数据集(来自“报告数据”工具窗口)
  • 添加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");
}