2012-02-13 54 views
5

如何使用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文件)。

回答

8

Invoice.rdlc

  • 添加一個名爲InvoiceDataset(從報表數據工具窗口)數據集
  • 添加列表控制(因爲該報告必須綁定到即使一個發票清單名單將只包含一個元素)
  • 在列表控件添加,如客戶名稱
  • 發票級別字段中的列表控件添加一個子報表控件指向與「戶口」的名字Account.rdlc和InvoiceId的參數

Account.rdlc

  • 添加一個名爲AccountDataset(從報表數據工具窗口)數據集
  • 添加InvoiceId參數在Invoice.rdlc指定的參數相匹配子報表控件
  • 添加列表控件
  • 在列表控件中添加帳戶級別字段,如帳戶號
  • 在列表控件添加指向LineItem.rdlc子報表有兩個參數:InvoiceId和ACCOUNTID

LineItem.rdlc

  • 添加一個名爲LineItemDataset(從報表數據工具窗口集)
  • 添加InvoiceId和AccountId參數以匹配在Account.rdlc Subreport控件中指定的參數
  • 添加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"); 
}