2012-02-13 21 views
5

Come si crea un report con una relazione parent-child-grandchild utilizzando POCO/oggetti business personalizzati?Reporting Services: origine dati dell'oggetto business con parent-child-grandchild

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 })); 
} 

Preferibilmente utilizzando i controlli Tabella e Elenco su Sottoreport. Reporting Services v10 con elaborazione locale (file .rdlc).

risposta

8

Invoice.rdlc

  • Aggiungere un set di dati di nome InvoiceDataset (dalla finestra degli strumenti Dati report)
  • Aggiungere un controllo List (dal momento che la relazione deve essere associato a un elenco delle fatture, anche se il elenco contiene solo un elemento)
  • All'interno del controllo di elenco aggiungi i campi a livello di fattura come Nome cliente
  • All'interno del controllo Elenco aggiungi un controllo Sottoreport che punta a Account.rdlc con un nome di "Account" e un parametro di InvoiceID

Account.rdlc

  • Aggiungere un set di dati di nome AccountDataset (dalla finestra degli strumenti Dati report)
  • Aggiungi un parametro InvoiceID per abbinare il parametro specificato nel Invoice.rdlc Controllo sottoreport
  • Aggiungi un controllo di elenco
  • All'interno del controllo di elenco aggiungi campi a livello di account come numero di conto
  • Nell'ambito del controllo Elenco aggiungere un sottoreport che punta al LineItem.rdlc con due parametri: InvoiceID e accountid

LineItem.rdlc

  • Aggiungere un set di dati di nome LineItemDataset (dalla finestra dello strumento Dati report)
  • aggiungere i parametri InvoiceID e accountid per abbinare i parametri specificati nel Account.rdlc controllo sottoreport
  • Aggiungere un controllo Elenco
  • Nell'ambito del controllo Elenco aggiungere Linea campi a livello di articolo come descrizione, quantità, prezzo

Per generare questo rapporto in formato 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"); 
} 
Problemi correlati