2012-02-13 18 views
5

¿Cómo puedo crear un informe con una relación padre-hijo-nieto utilizando POCO/objetos comerciales personalizados?Reporting Services: origen de datos de objeto comercial 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 })); 
} 

Preferiblemente usando los controles de Tabla y Lista sobre Subinformes. Reporting Services v10 con procesamiento local (archivos .rdlc).

Respuesta

8

Invoice.rdlc

  • Añadir un conjunto de datos llamado InvoiceDataset (desde la ventana de la herramienta de informes de datos)
  • Añadir un control de la lista (ya que el informe debe estar enlazado a una lista de facturas, incluso si el la lista solo contendrá un elemento)
  • En el control de lista, agregue campos de nivel de factura como Nombre de cliente
  • Dentro del control de lista, agregue un control de subinforme que apunte a Account.rdlc con un nombre de "Cuenta" y un parámetro de InvoiceID

Account.rdlc

  • Añadir un conjunto de datos llamado AccountDataset (desde la ventana de la herramienta de informes de datos)
  • Añadir un parámetro InvoiceID para que coincida con el parámetro especificado en Invoice.rdlc Control de subinforme
  • Agregue un control de lista
  • Dentro del control de lista agregue campos de nivel de cuenta como número de cuenta
  • Dentro del control de la lista Agregar un subinforme que apunta a LineItem.rdlc con dos parámetros: InvoiceID y ACCOUNTID

LineItem.rdlc

  • Añadir un conjunto de datos llamado LineItemDataset (desde la ventana de la herramienta de informes de datos)
  • añadir parámetros InvoiceID y AccountId para que coincida con los parámetros especificados en Account.rdlc control de subinforme
  • Añadir un control de lista
  • Dentro del control de la lista Agregar campos de nivel de línea de artículos como la descripción, cantidad, precio

Para generar este informe en 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"); 
} 
Cuestiones relacionadas