我有一个存储过程,用于在reportviewer(VS2010中提供的)中创建报告。有4个参数 - 开始日期,结束日期 - 单个参数。 多值参数 - 状态(6种可能的选择), 位置(250种可能的选择)。
我无法确定正确的编码方式,以便报告显示日期范围内的所有项目,以查看所请求的各种状态/位置。
例如:显示(开始日期)2012年7月1日和(结束日期)9/3/2012之间的所有部分,来自(位置)Hazleton或Butler,并且(状态)可用或出局。
调用存储过程的代码:
public DataTable StatusRpt(DateTime StartDate, DateTime EndDate)
{
SQLCON = new SqlConnection(connectionString);
SQLCON.Open();
SQLCommand = new SqlCommand("spStatusRpt",SQLCON);
SQLCommand.CommandType = CommandType.Text;
SQLCommand.Parameters.Add("@StartDate", SqlDbType.Date).Value = StartDate;
SQLCommand.Parameters.Add("@EndDate", SqlDbType.Date).Value = EndDate;
//SQLCommand.Parameters.Add("@Status", SqlDbType.Int).Value = Status;
//SQLCommand.Parameters.Add("@OrgName", SqlDbType.VarChar).Value = OrgName;
SqlDataAdapter adapter = new SqlDataAdapter(SQLCommand);
DataTable Detailtable = new DataTable();
adapter.Fill(Detailtable);
return Detailtable;
}
这是我的“onClick”活动
protected void btnStatusReport_OnClick(object sender, EventArgs e)
{
int Status = Convert.ToInt32(lbxStatus.SelectedValue);
string OrgName = lbxLocations.SelectedValue;
DateTime StartDate = Convert.ToDateTime(CalStart.SelectedDate);
DateTime EndDate = Convert.ToDateTime(CalEnd.SelectedDate);
lblPrint.Visible = true;
DataTable DetailTable = equip.StatusRpt(StartDate, EndDate);
this.RV1.Reset();
this.RV1.LocalReport.DataSources.Clear();
this.RV1.LocalReport.ReportPath = "Reports/StatusReport.rdlc";
ReportDataSource rds = new ReportDataSource("StatusDS", DetailTable);
this.RV1.LocalReport.DataSources.Add(rds);
this.RV1.DataBind();
}
我做了一些研究,但我发现的一切都是使用SSRS。如果有人可以告诉我如何通过代码应用过滤器,我可以使用过滤功能。
提前感谢您提供任何帮助。 辛迪
答案 0 :(得分:0)
由于您使用的是客户端报告(RDLC),请记住您是生成报告使用的数据的人。我相信您可以将参数传递给报表并使用它来过滤数据以进行显示,但您当然不需要。
过去,我使用服务器端报告(RDL)做过这种事情。在这种情况下,我将逗号分隔的字符串传递给存储过程。在程序中,我将其分解,将其插入临时表中,并加入我过滤结果的数据集。如果您有很多行,并且通常只输出其中的几行,那么您将希望在此过程中执行此操作。如果您想在某个时刻将此报告移至服务器端,这也可能是一种更好的方法。
如果你没有很多行,那么在你的代码中过滤它可能就好了。您可以使用LINQ(请参阅this question在DataTable上使用LINQ)。请记住,您可以使用任何IEnumerable通过ReportDataSet传递到报表中。