Как создать отчет (RDLC) без базы данных? - PullRequest
23 голосов
/ 11 марта 2011

Задача

При создании отчета (RDLC) источником данных представляется только та или иная база данных. Есть ли способ убедить VS установить ссылку на источник данных в памяти? Нечто похожее на привязку данных WPF.

Проблема в том, что я хотел бы создать отчет с несколькими данными (введенными пользователем), весь смысл в макете, у меня нет большого количества данных. Поэтому установка БД, запись данных в БД, а затем их выборка, просто чтобы показать, что отчет является огромным перебором.

Итак, я ищу возможность создать отчет из данных памяти.

Фон

Я хотел бы разработать макет, добавить изображения, задать стили, цвета шрифта и т. Д. И добавить не более нескольких параметров, таких как «имя», «фамилия» (пользователя) и «текст». Пользователь введет эти 3 значения, получит листовку и напечатает ее X раз. Макет должен быть точным - начиная с размера бумаги, размещения изображений, размера шрифтов и т. Д.

Возможно, есть лучшие решения, чем RDLC, но это встроенный движок, и как бы я ни искал, он всегда появляется в результатах поиска.

Ответы [ 5 ]

29 голосов
/ 11 марта 2011

Источником данных для отчета RDLC может быть все, что реализует IEnumerable.Если это перечисление объектов, то свойства объекта становятся полями в отчете.

Суть отчетов в том, что они имеют собственное внутреннее представление о том, что такое набор данных.Во время разработки вам необходимо предоставить конструктору отчетов набор данных для работы.Отчет принимает этот набор данных изнутри, и он используется для разработки отчета.Реальность такова, что сам отчет не заботится о фактическом наборе данных.Он заботится только о своей схеме.Однако во время выполнения объекты, которые вы предоставляете для удовлетворения этого набора данных, могут поступать откуда угодно, если они удовлетворяют той же схеме.

У меня есть небольшая запись в блоге в мои дни MS, в которой рассказывается о том, как получить хорошую поддержку во время разработки, а затем во время выполнения предоставить отчет с любыми данными, которые вы хотите:

http://blogs.msdn.com/b/magreer/archive/2008/10/16/setting-the-datasource-for-a-report-at-runtime.aspx

11 голосов
/ 11 марта 2011

Недавно я написал сообщение в блоге о создании сборки отчетов и ее использовании в проекте. Мои отчеты принимают список моих классов в качестве источника данных и не читают сами из БД.

Если вы посмотрите здесь:

http://wraithnath.blogspot.com/2011/02/visual-studio-2010-report-viewer-object.html

это должно помочь. По сути, вы создаете библиотеку классов, содержащую источники данных, поскольку в VS 2010 существует реальная проблема с обнаружением источников данных объектов. Это работает примерно в 20% случаев, поэтому я решил сделать это таким образом.

N

2 голосов
/ 11 марта 2011

Вы можете определенно привязать к DataTables.Поскольку вы можете создавать DataTables вручную, это один из способов сделать это без базы данных.

Вот пример, в котором мы программно загружаем элемент управления RDLC для рендеринга PDF, используя DataTables:

Dim Viewer As New ReportViewer
Viewer.LocalReport.ReportPath = "Physicians\Patients\OrderPlacement\DownloadRx\RxPdf.rdlc"

Me.LoadReport(orderID, Viewer)

Dim Renderer As New Code.Reporting.RenderToPDF
Renderer.Save(Viewer, FileFullPath)

А вот содержимое LoadReport:

Private Sub LoadReport(ByVal orderID As Integer, ByVal viewer As ReportViewer)
    'This is adapted from here: http://www.codeproject.com/KB/reporting-services/RDLC_and_DataSet.aspx
    '--Setup
    viewer.LocalReport.DataSources.Clear()
    viewer.LocalReport.EnableHyperlinks = True

    '--Configure DataSources
    Dim DocumentData As New RxDocumentData(orderID)
    Me.SetupRxPdfDataSourceHeader(DocumentData, viewer)
    Me.SetupRxPdfDataSourceMetrics(DocumentData, viewer)
    Me.SetupRxPdfDataSourceOrderHeader(DocumentData, viewer)
    Me.SetupRxPdfDataSourceOrderItems(DocumentData, viewer)
    Me.SetupRxPdfDataSourceChainOfCustody(DocumentData, viewer)
    Me.SetupRxPdfDataSourcePreTreatmentWorkupOrderTags(DocumentData, viewer)
    Me.SetupRxPdfDataSourceTakeHomeMedicationsOrderTags(DocumentData, viewer)

    viewer.LocalReport.Refresh()
End Sub

И вот один из тех маленьких методов настройки:

Private Sub SetupRxPdfDataSourceHeader(ByVal data As RxDocumentData, ByVal viewer As ReportViewer)
    Dim Dset_Header As New ReportDataSource("Dset_Header", data.HeaderDataTable)
    viewer.LocalReport.DataSources.Add(Dset_Header)
End Sub

data.HeaderDataTable - это просто строго типизированная DataTable, которую мы создаемпрограммно и вводить данные вручную.

В DataTable нет ничего особенного, но до того момента, когда этот код работал, вероятно, потребовалась целая неделя.Надеюсь, это поможет.

1 голос
/ 11 марта 2011

Вы можете вручную создать объект DataTable, заполнить там коллекцию Columns, а затем вызвать NewRow (). Возьмите результат этого и заполните поля, затем передайте его Rows.Add (). Это то, что я делал (на самом деле не люблю rdlc, он такой медленный и неуклюжий по сравнению с html).

0 голосов
/ 09 февраля 2012

Возвращает список ваших бизнес-объектов и добавляет его в качестве источника данных:

ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("Report", new List<ReportDto> { new ReportDto(businessObj) }));

ReportDto - это оболочка для вашего бизнес-объекта, в которой выполняются все форматирования, объединения и другие изменения, связанные с отчетами.Он генерирует только те свойства, которые необходимы для отчета.

Затем перейдите, чтобы добавить набор данных, выберите пространство имен ReportDto в качестве источника данных и выберите ReportDto в качестве набора данных.Теперь все свойства, включенные в ReportDto, будут доступны в конструкторе.

...