Подтвердить что ты не робот

Как создать отчет (RDLC) без базы данных?

Проблема

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

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

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

Фон

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

N

Ответ 3

Вы можете привязываться к 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 нет ничего особенного, но до такой степени, что этот код функционировал, вероятно, прошла целая неделя. Надеюсь, это поможет.

Ответ 4

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

Ответ 5

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

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

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

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