Ich versuche derzeit, einen Bericht von CrystalRReports nach SSRS zu migrieren. Ich bin sehr neu in der Berichterstattung und habe noch nie mit einem dieser Berichtssysteme gearbeitet.Reportmigration: CrystalReports in SSRS Parameter wird angewendet, aber nicht verwendet
Ich habe einen Hauptbericht mit 2 Unterberichten. Sie arbeiten korrekt und zeigen die gewünschten Daten an. Es gibt 2 Parameter, den AllFields-Parameter und den SelectedId-Parameter.
AllFields gibt an, ob leere Felder pro Datarow ausgelassen werden sollen. SelectedId gibt an, welcher Datarow im Viewer ausgewählt wurde, sodass der Bericht nur über diese spezifischen Daten erfolgen kann.
Wenn ich meinen Code debuggen, werden die richtigen Parameter angewendet. Ich habe überhaupt keine Ahnung, warum er immer noch alle Daten verarbeitet, egal was ich wähle.
Dies ist der C# -Code unter dem Bericht:
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);
}
}
Was habe ich verpasst oder falsch gemacht? Warum wird mein Parameter korrekt angewendet (ich sehe den richtigen Wert im Debugger), aber er wird trotzdem nicht wirklich benutzt?