如果这个问题看起来很愚蠢,请放轻松。仍在学习 SSRS 的广度,不确定以前是否有人问过这个问题,但到目前为止还无法找到可靠的解决方案......
当前希望生成一个具有主/父级数据集的报告,该数据集由调用存储过程的 TableAdapter 生成,以及基于数据分组的子报告(还包含必须从存储过程获取的数据)来自家长级别的报告。
例如,我们可能有一个顶级报告,用于检索各种与经理相关的项目并按 ManagerID 对它们进行分组(理论上给出唯一经理 ID 的精简列表)。对于每个经理(及其 ID),他们都会有一个子报告,显示与其相关的任务。但需要注意的是,子报表需要根据父级分组中获得的 ID 来提取其存储过程数据;不能使用初始子报表数据集的过滤,因为在实际运行父存储过程之前不知道管理器 ID。
这与 Crystal Reports 的行为类似;子报表可以与存储过程关联,并具有来自父报表的链接参数。使用这些参数,子报表能够根据组级别提供的参数执行存储过程。
如何使用此分组的 ManagerID 列将子报表及其存储过程 DataSet 链接到主父报表?任何帮助将不胜感激。
目前使用:
根据我的理解,在生成/处理报告之前,数据集的详细信息均已填充(TableAdapter.Fill())并作为带有填充的数据表的 ReportDataSource 附加到报告中。这在处理仅过滤同一个表上的数据的父级报表或子报表时有效,因为可以将相同的数据集发送到子报表并通过从父级发送的参数进行过滤。
不完全确定如何将可能的分组 ManagerID 参数发送到子报表并让它动态地从存储过程获取数据。可能只是想太多了......
令人相当惊讶的是,考虑到这个问题已经存在了很多年,这个问题还没有出现或在很多地方记录下来,但我解决这个问题的主要方法是在我的 SSRS 的 SubreportProcessingEventHandler 中处理每个子报表存储过程的新数据检索类。
例如:
private void LoadSubreportDataSource(SubreportProcessingEventArgs e) {
e.DataSources.Clear();
DataSet dataSet = new DataSet(); // the .xsd
TableAdapter subreportTableTblAdapter = new TableAdapter(); // the subreport's TableAdapter in the DataSet
// Filling the data based on the ID retrieved from the grouped Manager ID in the parent report tablix
tblAdapter.Fill(
dataSet.subreportTable,
e.Parameters["Manager_ID"].Values.FirstOrDefault()
);
ReportDataSource ds_subreport = new ReportDataSource(dataSet .subreportTable.TableName, (DataTable)dataSet.subreportTable);
e.DataSources.Add(ds_subreport);
}
不能说这是否是最有效的方法,但它似乎按预期工作:在管理器按 ID 分组后,每个子报表将使用从父报表传递给它的 ID 正确获取存储过程数据。
如果有更清晰、更简洁的方法来做到这一点,仍然分享任何答案。