0

我目前正在尝试将报表从 CrystalrReports 迁移到 SSRS。我对报告非常陌生,以前没有使用过其中一个报告系统。

我有一份主报告,还有 2 个子报告。它们工作正常并显示所需的数据。有 2 个参数,AllFields-Parameter 和 SelectedId-Parameter。

AllFields 告诉每个数据行是否应省略空字段。SelectedId 告诉在查看器中选择了哪个数据行,因此报告只能关于该特定数据。

当我调试我的代码时,会应用正确的参数。我完全不知道为什么他仍在处理所有数据,无论我选择什么。

这是报告下方的 c# 代码:

    public HauptformularReportForm(DataTable themen, GespraechprotokollDAO gespraechprotokollDao, GrundlagendokumenteDAO grundlagendokumenteDao, bool onlyFilledFiels, int themaId)
        : this()
    {
        themaDS = new ReportDataSource("DataSet1", themen);
        // fill themen to display
        bewertungDS = ComputeAndFillBewertungs(themen);
        // display all fields = also empty ones
        ReportParameter rp = new ReportParameter("AllFields", (!onlyFilledFiels).ToString());
        // -1 means all themen
        tid = new ReportParameter("SelectedId", themaId.ToString());
        parameterList = new List<ReportParameter>();
        parameterList.Add(rp);
        parameterList.Add(tid);
        this.crystalReportViewer.LocalReport.SetParameters(parameterList);
        this.crystalReportViewer.LocalReport.DataSources.Clear();
        this.crystalReportViewer.LocalReport.DataSources.Add(themaDS);
        this.crystalReportViewer.LocalReport.DataSources.Add(bewertungDS);
        this.crystalReportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SetSubDataSource);
        //this.crystalReportViewer.LocalReport.Refresh();
        this.crystalReportViewer.RefreshReport();
    }

    public void SetSubDataSource(object sender, SubreportProcessingEventArgs e)
    {
        // display all fields = also empty ones
        e.DataSources.Add(themaDS);
        e.DataSources.Add(bewertungDS);
    }

    /// <summary>
    /// The report will only display the given thema
    /// </summary>
    /// <param name="themaId"></param>
    public void DisplaySingleThema(int themaId)
    {
        tid.Values.Clear();
        tid.Values.Add(themaId.ToString());
        parameterList.Add(tid);
    }

    /// <summary>
    /// Compute the average Bewertungs for all given themen, 
    /// fill a DataTable with the computed averages and use is as datasource in the report.
    /// </summary>
    /// <param name="themen"></param>
    private ReportDataSource ComputeAndFillBewertungs(DataTable themen)
    {
        HauptformularReportDataSet.BewertungDataTable bewertungDataTable = new HauptformularReportDataSet.BewertungDataTable();

        // get bewertungs of all themen
        Dictionary<int, IList<IFrageWithBewertung>> dictionary = BewertungsExtractor.Extract(themen);

        // fill table with thema_id and computed bewertung
        foreach (KeyValuePair<int, IList<IFrageWithBewertung>> themaBewertung in dictionary)
        {
            HauptformularReportDataSet.BewertungRow row = bewertungDataTable.NewBewertungRow();

            row.THEMA_ID = themaBewertung.Key;
            row.BewertungOfAllFragen = BewertungAverageComputer.ComputeAverage(themaBewertung.Value);
            row.BewertungOfFragenWithStatus = BewertungAverageComputer.ComputeAverage(themaBewertung.Value, true);

            bewertungDataTable.AddBewertungRow(row);
        }

        // set datasource in report
        report.Database.Tables["Bewertung"].SetDataSource(bewertungDataTable as DataTable);
        return new ReportDataSource("DataSet2", bewertungDataTable as DataTable);

    }
}

我错过了什么或做错了什么?为什么我的参数应用正确(我在调试器中看到了正确的值)但仍然没有真正使用?

4

1 回答 1

0

好吧,代码大部分是正确的,除了我在上例中为子报表提供了错误的数据源。

我不知道过滤器,当我用谷歌搜索我的问题时甚至没有提到它们。无论如何它现在正在工作,需要对每个报告/子报告进行过滤。

于 2016-04-19T14:09:10.667 回答