ReportViewer具有多个参数

时间:2012-09-04 18:13:37

标签: c# asp.net sql parameters report-viewer2010

我有一个存储过程,用于在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。如果有人可以告诉我如何通过代码应用过滤器,我可以使用过滤功能。

提前感谢您提供任何帮助。 辛迪

1 个答案:

答案 0 :(得分:0)

由于您使用的是客户端报告(RDLC),请记住您是生成报告使用的数据的人。我相信您可以将参数传递给报表并使用它来过滤数据以进行显示,但您当然不需要。

过去,我使用服务器端报告(RDL)做过这种事情。在这种情况下,我将逗号分隔的字符串传递给存储过程。在程序中,我将其分解,将其插入临时表中,并加入我过滤结果的数据集。如果您有很多行,并且通常只输出其中的几行,那么您将希望在此过程中执行此操作。如果您想在某个时刻将此报告移至服务器端,这也可能是一种更好的方法。

如果你没有很多行,那么在你的代码中过滤它可能就好了。您可以使用LINQ(请参阅this question在DataTable上使用LINQ)。请记住,您可以使用任何IEnumerable通过ReportDataSet传递到报表中。