none
c# winform内的reportviewer传递参数的问题 RRS feed

  • 问题

  • 要出一个考勤表报,通过reportviewer如何使用户可以选择日期后生成报表?

    原来用rdl的格式已经写好代码,这里面的startdata是通过报表参数里面设置的,虽然也有,但是数据源配置的时候不能设置这个变量改变数据源,愿哪位不吝赐教,给个整体解决办法~~~谢谢~~~

    select
    co2.name Name,
    (case
    when co3.groupName = '' then co2.name
    else co3.groupName end) Dept,

    min(case
    when (convert(nvarchar(10),co1.evttime,120)>=@StartDate and convert(nvarchar(10),co1.evttime,120)<=@EndDate) and datename(weekday,co1.evttime)='星期一' then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive1,
    max(case
    when (convert(nvarchar(10),co1.evttime,120)>=@StartDate and convert(nvarchar(10),co1.evttime,120)<=@EndDate) and datename(weekday,co1.evttime)='星期一' then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave1,
    right(convert(nvarchar(25),max(case
    when (convert(nvarchar(10),co1.evttime,120)>=@StartDate and convert(nvarchar(10),co1.evttime,120)<=@EndDate) and datename(weekday,co1.evttime)='星期一' then co1.evttime end)-min(case
    when (convert(nvarchar(10),co1.evttime,120)>=@StartDate and convert(nvarchar(10),co1.evttime,120)<=@EndDate) and datename(weekday,co1.evttime)='星期一' then co1.evttime end),120),8) Hours1,

    min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+1 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive2,
    max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+1 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave2,
    right(convert(nvarchar(25),max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+1 then co1.evttime end)-min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+1 then co1.evttime end),120),8) Hours2,

    min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+2 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive3,
    max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+2 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave3,
    right(convert(nvarchar(25),max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+2 then co1.evttime end)-min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+2 then co1.evttime end),120),8) Hours3,

    min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+3 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive4,
    max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+3 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave4,
    right(convert(nvarchar(25),max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+3 then co1.evttime end)-min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+3 then co1.evttime end),120),8) Hours4,

    min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+4 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive5,
    max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+4 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave5,
    right(convert(nvarchar(25),max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+4 then co1.evttime end)-min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+4 then co1.evttime end),120),8) Hours5,

    min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+5 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive6,
    max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+5 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave6,
    right(convert(nvarchar(25),max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+5 then co1.evttime end)-min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+5 then co1.evttime end),120),8) Hours6,

    min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+6 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive7,
    max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+6 then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave7,
    right(convert(nvarchar(25),max(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+6 then co1.evttime end)-min(case
    when convert(nvarchar(10),co1.evttime,120)=@StartDate+6 then co1.evttime end),120),8) Hours7

    from trans_normal as co1
    inner join users as co2 on co1.userid = co2.userid
    inner join deptgroups as co3 on co2.groupid = co3.groupid
    where co2.deptid = '1'

    group by co2.name,
    co3.groupName
    --Hours
    --co1.evttime
    --having max(co1.evttime) = min(co1.evttime)

    order by Dept,
    Name

    2011年3月8日 3:18

答案

  • 又过了10多天,终于解决了~~~现在是过来结贴的~~~我前面的代码问题出在reportViewer1.LocalReport.Refresh();这句上,应该改为this.reportViewer1.RefreshReport();

    害我研究了那么多时候,咨询了很多人~~~

    还有人说原先设定的数据集列必须和手动绑定是数据集列一摸一样,其实我试了,根本无所谓的~~~只要原先绑定的数据集列显示在rdlc内table控件中的东西手动绑定的也有就行了~~~

    以下是我整理的rdlc的简单使用方法,方便和我一样的新人,并且给自己mark一下~~~

    1.建立一个winform文件,一个rdlc报表文件
    2.在解决方案资源管理器内,对项目点击鼠标右键,添加新建项内的数据集
    3.选择新建的数据集点击工具集,拖动一个TableAdapter控件进入,添加SQL代码(添加的代码最好和手动绑定的SQL代码列一样)
    4.在rdlc文件内拖入一个表控件,把数据集内的字段拖入表内
    5.在winform内添加一个ReportViewer和一个button控件
    6.在ReportViewer控件上选择创建的rdlc报表
    7.添加代码{ ReportDataSource rds = new ReportDataSource("DataSet1_users", dt);内的数据集名字可在rdlc文件内选中表控件看其属性数据集名称}:

    using Microsoft.Reporting.WinForms;
    using System.Data.SqlClient;     //链接SQL数据库用

            private void button1_Click(object sender, EventArgs e)
            {
                SqlConnection con = new SqlConnection("Data Source = 192.168.1.6;Initial Catalog = soft;User ID=sa; pwd = 123");     //链接SQL数据库
                DataSet ds = new System.Data.DataSet();
                using (SqlDataAdapter da = new SqlDataAdapter("select Name from trans", con))
                da.Fill(ds);
                DataTable dt = ds.Tables[0];
                ReportDataSource rds = new ReportDataSource("DataSet1_users", dt);
                reportViewer1.LocalReport.DataSources.Clear();
                reportViewer1.LocalReport.DataSources.Add(rds);
                this.reportViewer1.RefreshReport();
            }

    • 已标记为答案 chen.chen 2011年3月28日 5:14
    2011年3月28日 4:01

全部回复

  • 拼SQL生成DataSet,然后用reportviewer.LocalReport.DataSources.Add把实际数据载入


    http://feiyun0112.cnblogs.com/
    2011年3月9日 1:43
    版主
  • reportviewer.LocalReport.DataSources.Add载入之后怎么把这些字段引入reportviewer的表内?平时都是字段已经出来自己手动拖一下就好了,这个真不知道怎么引入了....如果我要是还想把引入的数据再在表内的表达式内再做一个SUM可以不可以,应该怎么弄呢??

    另,写我是这样写的,不知道对不对?能不能帮我看一下?小弟实在新手~~~先谢谢了~~~

                SqlConnection con = new SqlConnection("Data Source = 192.168.1.6;Initial Catalog = Access3000;User ID=sa; pwd = 123456");     //链接SQL数据库
                DataSet ds = new System.Data.DataSet();
                using (SqlDataAdapter da = new SqlDataAdapter("select co2.name Name,(case when co3.groupName = '' then co2.name else co3.groupName end) Dept,min(case when (convert(nvarchar(10),co1.evttime,120)>='" + textBox1.Text + "' and convert(nvarchar(10),co1.evttime,120)<='" + textBox2.Text + "') and datename(weekday,co1.evttime)='星期一' then right(convert(nvarchar(25),co1.evttime,120),8) end) as Arrive1,max(case when (convert(nvarchar(10),co1.evttime,120)>=''" + textBox1.Text + "'' and convert(nvarchar(10),co1.evttime,120)<='" + textBox2.Text + "') and datename(weekday,co1.evttime)='星期一' then right(convert(nvarchar(25),co1.evttime,120),8) end) as Leave1,right(convert(nvarchar(25),max(case when (convert(nvarchar(10),co1.evttime,120)>='" + textBox1.Text + "' and convert(nvarchar(10),co1.evttime,120)<='" + textBox2.Text + "') and datename(weekday,co1.evttime)='星期一' then co1.evttime end)-min(case when (convert(nvarchar(10),co1.evttime,120)>='" + textBox1.Text + "' and convert(nvarchar(10),co1.evttime,120)<='" + textBox2.Text + "') and datename(weekday,co1.evttime)='星期一' then co1.evttime end),120),8) Hours1 from trans_normal as co1 inner join users as co2 on co1.userid = co2.userid inner join deptgroups as co3 on co2.groupid = co3.groupid where co2.deptid = '1' group by co2.name,co3.groupName order by Dept,Name", con))

                da.Fill(ds);
                DataTable DT = ds.Tables[0];
                ReportDataSource rds = new ReportDataSource("Access300DateSet", DT);
                reportViewer1.LocalReport.DataSources.Clear();
                reportViewer1.LocalReport.DataSources.Add(rds);
                reportViewer1.LocalReport.Refresh();

     

    2011年3月9日 10:43
  • 这样就可以了吧
    http://feiyun0112.cnblogs.com/
    2011年3月11日 1:16
    版主
  • 不行嘛,提示尚未指定报表定义的来源....不知道是哪里有问题呢??麻烦能不能稍微解释的详细点阿.....我都加了一段了,还是不行....

    reportViewer1.LocalReport.DataSources.Add(rds);
                DataRow row = DT.NewRow();
                row["Name"] = ds.Tables[0].Rows[0]["Name"].ToString();
                row["Dept"] = ds.Tables[0].Rows[0]["Dept"].ToString();
                DT.Rows.Add(row);
                //return DT;

               reportViewer1.LocalReport.Refresh();

    2011年3月11日 1:25
  • Access300DateSet 应该对应report实际数据源名
    http://feiyun0112.cnblogs.com/
    2011年3月11日 1:30
    版主
  • 现在是空白报表~~没有内容~~~

    2011年3月11日 1:44
  • DT有没数据,report设置了什么条件没
    http://feiyun0112.cnblogs.com/
    2011年3月11日 1:49
    版主
  • 没设置什么条件呀...我是半路出家,又没什么学过这个,自己看了两本书,然后reportviewer的介绍几乎没有,所以水平实在是次了点~~~能不能有时间麻烦您远程给我看一下呢??

    2011年3月11日 2:07
  • 正在找这方面的东西呢,我最近也在做报表

    2011年3月11日 7:06
  • 我上次去书店也找过,介绍reportviewer的书没有看到过,有也是介绍CrystalReport的,或者哪位推荐一下有介绍c# winform reportviewer的教材阿??

    2011年3月11日 8:00
  • 你好,

    网上有些这样的资料,你可以找找看看。看代码没什么问题。估计你得仔细检查下了。

    还有就是把这么长sql语句直接写在代码不太好,最好是用存储过程。


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月14日 9:09
  • 你好,

    网上有些这样的资料,你可以找找看看。看代码没什么问题。估计你得仔细检查下了。

    还有就是把这么长sql语句直接写在代码不太好,最好是用存储过程。


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    我网上找了挺多资料,可是没有看到有比较完善的介绍和实例,能不能麻烦你贴个链接看看呢?谢谢~~

    我到现在试了蛮多的,空白报表~~至于feiyun0112兄说的dt没有数据,我看了下dt的table有以下数据的....

    John Zhang AKRO Team 09:46:37 18:36:03 08:49:26

    July Chen AKRO Team 08:07:25 16:57:26 08:50:01

    而且虽然我看到的是空白表,但是竟然下一页箭头可以翻页..而且显示有两页...谁能指导一下阿??万分感谢....

     

    2011年3月15日 2:23
  • 你看看这个吧。因为我们这边无法测试,你只能多试试了。最好是先用简单的SQL来试试,做个测试。

    http://msdn.microsoft.com/zh-cn/library/ms251724%28VS.80%29.aspx

    祝你好运!


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月15日 13:54
  • 你看看这个吧。因为我们这边无法测试,你只能多试试了。最好是先用简单的SQL来试试,做个测试。

    http://msdn.microsoft.com/zh-cn/library/ms251724%28VS.80%29.aspx

    祝你好运!


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    感谢您的回答,我看过这样一些例子,都说是

    4.打开工具箱。将一个 Table 报表项从工具箱拖到报表中。

    5.在“数据源”窗口中,展开 DataTable1 来查看列。将 Dept 字段拖到表中第一列的中间行上。中间行为 Detail 行。请注意,当指定 Detail 行时,将自动填充 Header 行。

    6.将 Shift 字段拖到第二列的 Detail 行上,使其位于 Dept 字段的旁边。

    7.将 EmployeeCount 字段拖到第三列的 Detail 行上,使其位于 Shift 字段的旁边。

    但是我数据源是手动指定的~~~ 并没有这些字段给我拖到table上,以我上面的代码我如果指定表内详细信息为=Fields!Name.Value

    会有错误 1 文本框“textbox10”的 Value 表达式引用了字段“name”。报表项表达式只能引用当前数据集作用域内的字段或指定数据集作用域内的字段(如果该表达式包含在聚合函数中)。

    诚心求教,万望答复,谢谢~~~


    2011年3月16日 2:08
  • 这个帖子里面的人碰到和你一样的问题,好像用下面的代码解决了。你试试吧。

    http://forums.devx.com/showthread.php?t=166037

    reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
          reportViewer1.LocalReport.ReportPath = System.Environment.CurrentDirectory + @"\Report1.rdlc";
          reportViewer1.LocalReport.DataSources.Clear();
          reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("PruebaDs_PruebaDT", ds.Tables[0]));
          
          reportViewer1.DocumentMapCollapsed = true;
          reportViewer1.RefreshReport();
    

    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月16日 6:57
  • 这个帖子里面的人碰到和你一样的问题,好像用下面的代码解决了。你试试吧。

    http://forums.devx.com/showthread.php?t=166037

    reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
    
       reportViewer1.LocalReport.ReportPath = System.Environment.CurrentDirectory + @"\Report1.rdlc";
    
       reportViewer1.LocalReport.DataSources.Clear();
    
       reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("PruebaDs_PruebaDT", ds.Tables[0]));
    
       
    
       reportViewer1.DocumentMapCollapsed = true;
    
       reportViewer1.RefreshReport();
    
    

    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    我现在就试~~先感谢兄台对我帖子的关注~~~
    2011年3月16日 7:03
  • 又过了10多天,终于解决了~~~现在是过来结贴的~~~我前面的代码问题出在reportViewer1.LocalReport.Refresh();这句上,应该改为this.reportViewer1.RefreshReport();

    害我研究了那么多时候,咨询了很多人~~~

    还有人说原先设定的数据集列必须和手动绑定是数据集列一摸一样,其实我试了,根本无所谓的~~~只要原先绑定的数据集列显示在rdlc内table控件中的东西手动绑定的也有就行了~~~

    以下是我整理的rdlc的简单使用方法,方便和我一样的新人,并且给自己mark一下~~~

    1.建立一个winform文件,一个rdlc报表文件
    2.在解决方案资源管理器内,对项目点击鼠标右键,添加新建项内的数据集
    3.选择新建的数据集点击工具集,拖动一个TableAdapter控件进入,添加SQL代码(添加的代码最好和手动绑定的SQL代码列一样)
    4.在rdlc文件内拖入一个表控件,把数据集内的字段拖入表内
    5.在winform内添加一个ReportViewer和一个button控件
    6.在ReportViewer控件上选择创建的rdlc报表
    7.添加代码{ ReportDataSource rds = new ReportDataSource("DataSet1_users", dt);内的数据集名字可在rdlc文件内选中表控件看其属性数据集名称}:

    using Microsoft.Reporting.WinForms;
    using System.Data.SqlClient;     //链接SQL数据库用

            private void button1_Click(object sender, EventArgs e)
            {
                SqlConnection con = new SqlConnection("Data Source = 192.168.1.6;Initial Catalog = soft;User ID=sa; pwd = 123");     //链接SQL数据库
                DataSet ds = new System.Data.DataSet();
                using (SqlDataAdapter da = new SqlDataAdapter("select Name from trans", con))
                da.Fill(ds);
                DataTable dt = ds.Tables[0];
                ReportDataSource rds = new ReportDataSource("DataSet1_users", dt);
                reportViewer1.LocalReport.DataSources.Clear();
                reportViewer1.LocalReport.DataSources.Add(rds);
                this.reportViewer1.RefreshReport();
            }

    • 已标记为答案 chen.chen 2011年3月28日 5:14
    2011年3月28日 4:01
  • 谢谢分享


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月28日 5:50