根据参数依赖关系过滤报表参数有效值
Filter report parameter valid values based on parameter dependencies
我正在开发一个 ASP.net 应用程序,它允许用户从下拉列表中 select SSRS 报告,填写报告参数,然后在下一页的 ReportViewer 中查看报告。一些参数具有有效值,我使用以下代码从 RDLC 文件中获取这些值:
private ValidValue[] GetParameterValidValues(string parameterName, string reportDirectory)
{
ServerReport serverReport = new ServerReport();
string reportServerUrl = Application["ReportServerUrl"] as string;
serverReport.ReportPath = reportDirectory + lbReports.SelectedItem.Value;
serverReport.ReportServerUrl = new Uri(reportServerUrl);
ReportParameterInfo reportParameter = serverReport.GetParameters()[parameterName];
ValidValue[] validValues = reportParameter.ValidValues.ToArray();
return validValues;
}
然后将这些值添加到页面上动态创建的下拉列表中。
问题是在某些情况下,参数 A 可以过滤参数 B 的有效值。当 select在 ReportViewer 控件中输入参数时,此功能可以是观察者。
我的问题是,如何在我的代码中实现此功能?
每次选择另一个参数所依赖的值时,您都需要填充参数依赖值。我找到的最佳解决方案是根据本文使用散列 table:
http://www.codeproject.com/Articles/9161/SQL-Reporting-Services-Viewer-Page-Using-SOAP-API
在调用 GetItemParameters 的地方,遍历每个参数以检查它们是否具有依赖关系。然后将每个依赖项添加到散列table 以便稍后设置值...
private ParameterValue[] _ParamDependenciesValues = new ParameterValue[0];
protected ItemParameter[] GetReportParameterDependencies()
{
ItemParameter[] Parameters = _Rs.GetItemParameters(_ThisReportPath, null, true, _ParamDependenciesValues, null);
if (Parameters.Length > 0)
{
foreach (ItemParameter p in Parameters)
{
if (p.Dependencies != null)
{
foreach (var d in p.Dependencies)
{
if (!_Dependencies.Contains(d))
{
_Dependencies.Add(d, null);
}
}
}
}
}
return Parameters;
}
然后,每次选择参数值时,都需要在数组中设置参数值,然后再次调用GetItemParameters,并设置依赖值
protected void SetParamValues(ItemParameter[] Params)
{
foreach (ItemParameter Rp in Params)
{
if (Rp.Dependencies != null)
{
foreach (var d in Rp.Dependencies)
{
var MyParamValue = _ParamDependenciesValues.FirstOrDefault(c => c.Name == d);
if (MyParamValue == null)
{
Array.Resize(ref _ParamDependenciesValues, _ParamDependenciesValues.Count() + 1);
var MyNewParamValue = new ParameterValue {Name = d};
_ParamDependenciesValues[_ParamDependenciesValues.Length - 1] = MyNewParamValue;
MyParamValue = _ParamDependenciesValues.FirstOrDefault(c => c.Name == d);
}
if (_Dependencies.Contains(d))
{
if (MyParamValue != null && _Dependencies[d] != null)
MyParamValue.Value = _Dependencies[d].ToString();
}
}
}
}
ItemParameter[] Parameters = _Rs.GetItemParameters(_ThisReportPath, null, true, _ParamDependenciesValues, null);
}
这需要重复,直到所有参数都解决了所有依赖关系...
我正在开发一个 ASP.net 应用程序,它允许用户从下拉列表中 select SSRS 报告,填写报告参数,然后在下一页的 ReportViewer 中查看报告。一些参数具有有效值,我使用以下代码从 RDLC 文件中获取这些值:
private ValidValue[] GetParameterValidValues(string parameterName, string reportDirectory)
{
ServerReport serverReport = new ServerReport();
string reportServerUrl = Application["ReportServerUrl"] as string;
serverReport.ReportPath = reportDirectory + lbReports.SelectedItem.Value;
serverReport.ReportServerUrl = new Uri(reportServerUrl);
ReportParameterInfo reportParameter = serverReport.GetParameters()[parameterName];
ValidValue[] validValues = reportParameter.ValidValues.ToArray();
return validValues;
}
然后将这些值添加到页面上动态创建的下拉列表中。
问题是在某些情况下,参数 A 可以过滤参数 B 的有效值。当 select在 ReportViewer 控件中输入参数时,此功能可以是观察者。
我的问题是,如何在我的代码中实现此功能?
每次选择另一个参数所依赖的值时,您都需要填充参数依赖值。我找到的最佳解决方案是根据本文使用散列 table: http://www.codeproject.com/Articles/9161/SQL-Reporting-Services-Viewer-Page-Using-SOAP-API
在调用 GetItemParameters 的地方,遍历每个参数以检查它们是否具有依赖关系。然后将每个依赖项添加到散列table 以便稍后设置值...
private ParameterValue[] _ParamDependenciesValues = new ParameterValue[0];
protected ItemParameter[] GetReportParameterDependencies()
{
ItemParameter[] Parameters = _Rs.GetItemParameters(_ThisReportPath, null, true, _ParamDependenciesValues, null);
if (Parameters.Length > 0)
{
foreach (ItemParameter p in Parameters)
{
if (p.Dependencies != null)
{
foreach (var d in p.Dependencies)
{
if (!_Dependencies.Contains(d))
{
_Dependencies.Add(d, null);
}
}
}
}
}
return Parameters;
}
然后,每次选择参数值时,都需要在数组中设置参数值,然后再次调用GetItemParameters,并设置依赖值
protected void SetParamValues(ItemParameter[] Params)
{
foreach (ItemParameter Rp in Params)
{
if (Rp.Dependencies != null)
{
foreach (var d in Rp.Dependencies)
{
var MyParamValue = _ParamDependenciesValues.FirstOrDefault(c => c.Name == d);
if (MyParamValue == null)
{
Array.Resize(ref _ParamDependenciesValues, _ParamDependenciesValues.Count() + 1);
var MyNewParamValue = new ParameterValue {Name = d};
_ParamDependenciesValues[_ParamDependenciesValues.Length - 1] = MyNewParamValue;
MyParamValue = _ParamDependenciesValues.FirstOrDefault(c => c.Name == d);
}
if (_Dependencies.Contains(d))
{
if (MyParamValue != null && _Dependencies[d] != null)
MyParamValue.Value = _Dependencies[d].ToString();
}
}
}
}
ItemParameter[] Parameters = _Rs.GetItemParameters(_ThisReportPath, null, true, _ParamDependenciesValues, null);
}
这需要重复,直到所有参数都解决了所有依赖关系...