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

Я использую VS2013 и ReportViewer2012.

Итак, в среде разработки и тестирования все в порядке, но в производственной среде, когда я вызываю печать, происходит следующее: «Не удалось получить данные для подотчета ... (для всех подотчетов)». Почему?

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

Источник

    loadDataSources(); //loading all datatables of subreports
    ReportViewer ReportViewer1 = new ReportViewer();
    ReportViewer1.LocalReport.DataSources.Clear();
    ReportViewer1.Visible = false;
    ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/ReportContainer.rdlc");
    ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet0", _datatableContainer));
    ReportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);

    CreatePDF(ReportViewer1, uniquefilename);


    void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
    {
        if (e.ReportPath.ToLower() == "rpt_sub_1")
        {
            e.DataSources.Add(new ReportDataSource("DataSet1", _datatable1));
            e.DataSources.Add(new ReportDataSource("DataSet2", _datatable2));
            e.DataSources.Add(new ReportDataSource("DataSet3", _datatable3));
        }
        if (e.ReportPath.ToLower() == "rpt_sub_2")
        {
            e.DataSources.Add(new ReportDataSource("DataSet4", _datatable4));
            e.DataSources.Add(new ReportDataSource("DataSet5", _datatable5));
            e.DataSources.Add(new ReportDataSource("DataSet6", _datatable6));
            e.DataSources.Add(new ReportDataSource("DataSet7", _datatable7));
        }
        //...

Большое спасибо

0
usr4217 24 Июн 2016 в 18:12

1 ответ

Лучший ответ

Хорошо, я исправил эту проблему.

Проблема заключалась в значении e.ReportPath.

Это было в среде тестирования и разработки: «rpt_sub_1» или «rpt_sub_2».

Но в производственной среде было иначе: «C: \ inetpub \ wwwroot \ MyWebSite \ rpt_sub_1.rdlc» и «C: \ inetpub \ wwwroot \ MyWebSite \ rpt_sub_2.rdlc»

Я исправил создание метода расширения следующим образом:

    public static string CleanerReportName(this string value)
    {
        value = value.ToLower();
        List<string> _listRemoveItems = new List<string>();
        _listRemoveItems.Add(@"C:\inetpub\wwwroot\MyWebSite\");
        _listRemoveItems.Add(".rdlc");
        _listRemoveItems.ForEach(x => value = value.Replace(x, ""));
        return value;
    }

А затем я изменил источник следующим образом:

    void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
    {
        if (e.ReportPath.CleanerReportName() == "rpt_sub_1")
        {
            e.DataSources.Add(new ReportDataSource("DataSet1", _datatable1));
            e.DataSources.Add(new ReportDataSource("DataSet2", _datatable2));
            e.DataSources.Add(new ReportDataSource("DataSet3", _datatable3));
        }
        if (e.ReportPath.CleanerReportName() == "rpt_sub_2")
        {
            e.DataSources.Add(new ReportDataSource("DataSet4", _datatable4));
            e.DataSources.Add(new ReportDataSource("DataSet5", _datatable5));
            e.DataSources.Add(new ReportDataSource("DataSet6", _datatable6));
            e.DataSources.Add(new ReportDataSource("DataSet7", _datatable7));
        }
        //...

Я надеюсь, что этот пост может кому-то помочь в будущем. до свидания

0
usr4217 24 Июн 2016 в 19:12