Invoice.rdlc
- Добавить набор данных с именем InvoiceDataset (из окна инструмента Данные отчета)
- Добавить элемент управления List (поскольку отчет должен бытьпривязан к списку счетов-фактур, даже если список будет содержать только один элемент)
- В элемент управления List добавьте поля уровня счета-фактуры, такие как имя клиента
- В элемент управления List добавьте указатель элемента управления Subreportв Account.rdlc с именем «Account» и параметром InvoiceId
Account.rdlc
- Добавить набор данных с именем AccountDataset (изокно «Данные отчета»)
- Добавить параметр InvoiceId, соответствующий параметру, указанному в элементе управления Invoice.rdlc Подотчет
- Добавить элемент управления List
- В элемент управления List добавить Account-поля уровня, такие как Account Number
- В элементе управления List добавьте вложенный отчет, указывающий на LineItem.rdlc с двумя параметрами: InvoiceId и AccountId
LineItem.rdlc
- Добавление набора данных с именем LineItemDataset (из окна инструмента «Данные отчета»)
- Добавление параметров InvoiceId и AccountId для соответствия параметрам, указанным в элементе управления Account.rdlc Подотчет
- ДобавлениеЭлемент управления List
- В элементе управления 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");
}