Лучшие практики для использования RDLC в распределенной среде - PullRequest
1 голос
/ 24 августа 2010

В моей компании есть приложение Windows Forms, которое использует ClickOnce и .NET Remoting (скоро станет WCF) для внутреннего веб-приложения IIS, которое обрабатывает все операции доступа к данным. В настоящее время для отчетности мы используем SSRS, а распределенные клиенты подключаются напрямую к серверу отчетов.

Мы хотели бы удалить или увеличить нашу зависимость от отчетов SSRS с возможностью поддержки локальных отчетов через файлы RDLC. Единственное препятствие, которое мне нужно преодолеть, заключается в том, что маловероятно, что отдельные клиентские машины будут иметь прямой доступ к базе данных и, следовательно, потребуют, чтобы данные отчета были получены из веб-приложения через наш транспортный уровень Remoting или WCF.

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

Кто-нибудь экспериментировал с каким-то образом встраиванием информации в файл RDLC (либо через комментарий в отчете, либо иным образом), который можно использовать в качестве «подсказки» для уровня приложения сервера для определения того, какой метод выполнять? Вероятно, что фактический RDLC будет храниться в базе данных, а не распространяться с нашим приложением.

Любое понимание или руководство будет оценено.

-MrB

1 Ответ

1 голос
/ 24 августа 2010

Проверьте www.gotreportviewer.com и пример средства просмотра RDL (последний пример справа).В нем уже есть код для загрузки RDLC и синтаксического анализа XML-файла для получения параметров, а также информации о соединении и информации о запросах.Вооружившись этим, вы должны иметь возможность использовать бэкэнд, чтобы получить все, заполнить / загрузить отчет и запустить его.

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

Мы делали что-то подобное раньше:

VB Версия:

Select Case GetReportName()

            Case "SiteEval"
                Using adp As New DataSetsTableAdapters.SiteEvalTableAdapter, _
                 objDT As New DataSets.SiteEvalDataTable
                    adp.Fill(objDT)
                    objLR.DataSources.Add(New ReportDataSource("DataSets_SiteEval", objDT))
                End Using
            Case ....

C # версия:

switch (GetReportName()) {

    case "SiteEval":
        using (DataSetsTableAdapters.SiteEvalTableAdapter adp = new DataSetsTableAdapters.SiteEvalTableAdapter()) {
            using (DataSets.SiteEvalDataTable objDT = new DataSets.SiteEvalDataTable()) {
                adp.Fill(objDT);
                objLR.DataSources.Add(new ReportDataSource("DataSets_SiteEval", objDT));
            }
        }

        break;

Использование наших XSD и наборов данных для загрузки наших отчетов.В этом случае наши локальные отчеты имеют доступ к БД.В вашем случае вы могли бы воспользоваться этой идеей и заполнить набор данных своими собственными возвращенными данными из звонка в ваш сервис.Это не самый элегантный или самый простой в обслуживании, если у вас большой набор отчетов.

В нашем случае мы сейчас берем пример RDL Viewer и модифицируем его в соответствии с нашими потребностями, так что приведенный выше код не нужен,Мы просто передадим путь к файлу RDLC, и код загрузит все необходимое, прочитав XML-файл RDLC.Однако в этом случае локальный отчет имеет доступ к БД.Было бы несложно, я думаю, изменить его так, чтобы он получал данные из внешнего источника, либо используя приведенную выше идею кода, либо изменяя пример средства просмотра RDL с www.gotreportviewer.com , как мы сейчас делаем.

С измененным примером RDL Viewer у нас есть кое-что подобное в данный момент (все еще работает ...) Код в VB.

    Dim r As New Report(Server.MapPath("App_Reports/" & GetReportName() & ".rdlc"), GetReportName())

    Dim p As ReportParameterInfoCollection = r.GetParameters() 'read only....
    If p.Count > 0 Then
        Dim rptParams(p.Count - 1) As ReportParameter
        Dim i As Integer = 0
        For Each param In p
            rptParams(i) = New ReportParameter(param.Name)
            rptParams(i).Values.Add("99999999")
            i += 1
        Next
        r.SetParameters(rptParams)
    End If

    r.LoadReport()

Прощай, уродливый и длинный переключательзаявление.До свидания, нужно знать, как загрузить отчет .... Теперь, если мы можем просто выяснить, как обрабатывать параметры, немного лучше ... Этот код находится в стадии разработки, но пример RDL Viewer заставил нас начать быстро .....

Я тоже играю с тем же, что и с Reflection.Я нашел эту статью, которая делает работу отражения легким.http://www.slimee.com/2009/09/net-using-reflection-to-execute.html

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...