读书人

[分享]水晶报表交叉表及数据过滤基础篇

发布时间: 2012-01-02 22:40:04 作者: rapoo

[分享]水晶报表交叉表及数据过滤基础篇
本文章为解http://topic.csdn.net/u/20100529/21/93e38af1-e2d7-4875-8a35-d94b2eb90fe1.html
之答,且对水晶报表交叉表制作和数据过滤有一定的参考价值,特此分享,做得不好的地方还请大家多多指教!
下面以PUSH模式为例,图解制作过程:
首先在界面上放置两个dataTimePicker控件,分别取名dtpStart,dtpEnd,可以任意选择起止时间,一个“测试报表”按钮(本案例该按钮起到刷新报表作用),取名btnReport,还有crytalReportView控件是少不了的(要不然怎么查看报表呢:)),采用默认名称,Form界面就这些东西。
既然是PUSH模式,就必须给它一个“骨架”,在项目中添加新项选择数据集,如图示:

名称随意(我这里是默认名DataSet1),然后打开数据集设计界面,右击->添加->DataTable,此时界面已多出DataTable1,右击DataTable1->添加->列,输入列名dtValue,在属性框中更改其数据类型为System.DateTime,如图示:

继续添加两列(根据需求而定,这里的列相当于数据库中的字段),TextType(System.String),iCount(System.Int32),记得保存,此时“骨架”构造完毕,此时还是一个空匣子。

往项目中添加一模板rpt文件,跟刚才添加数据集过程类似,我这边继续采用默认名,打开rpt文件,会有一个“字段资源管理器”框,右击数据库字段->数据库专家,会弹出一个数据库专家界面,在这个界面我们把刚才构造的“骨架”放到报表中来,如图示:

在数据库字段中把要显示的字段拖放到报表详细资料节,如图示:

然后插入交叉表,该是本文的重点之一:
右击报表尾 空白处->插入->交叉表,在交叉表专家中设置如下:

重点也就是这样,很简单吧 :)

然后我们设置下日期和数字的显示格式,右击日期字段dtValue对象->设置对象格式

相应的数字对象也设置下

这样交叉表部分就算完成了,最后我们再根据设置的起止时间进行数据过滤(本文另一重点)
这里我们用两个参数来接收这两个起止时间值,在字段资源管理器中右击参数字段->新建,如图示

同理再新建一参数(注意类型的选择),取名periodEnd,然后在报表空白处点右键->报表->选择专家,此时会弹出选择专家界面

点确定后在设置如下:

嗯,最后该进入代码部分了

C# code
        // 我这里设置成全局变量        DataSet1 ds = new DataSet1();          private void btnReport_Click(object sender, EventArgs e)        {            CrystalReport1 myReport = new CrystalReport1();            //给报表设置数据源            myReport.SetDataSource(ds);            /* 注意这里的起止时间设置             * 如果直接把dtpStart.Value和dtpEnd.Value传给水晶报表,             * 并且dtpStart.Value和dtpEnd.Value设为同一天的情况下,则无记录呈现 */            DateTime start = Convert.ToDateTime(dtpStart.Value.ToShortDateString() + " 0:0:0");            DateTime end = Convert.ToDateTime(dtpEnd.Value.ToShortDateString() + " 23:59:59");            // 把参数传给水晶报表            myReport.SetParameterValue("periodStart", start);            myReport.SetParameterValue("periodEnd", end);            crystalReportViewer1.ReportSource = myReport;        }        //页面加载时给“空壳”数据集DataSet1 填充数据,此时的“骨架”就不再是一个空匣子了~        private void Form1_Load(object sender, EventArgs e)        {            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-1"), "空柜查询", 25);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-1"), "拖车做柜查询", 35);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-1"), "集装箱查询", 28);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-2"), "空柜查询", 27);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-2"), "拖车做柜查询", 30);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-2"), "集装箱查询", 32);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-3"), "空柜查询", 17);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-3"), "拖车做柜查询", 19);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-3"), "集装箱查询", 21);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-4"), "空柜查询", 24);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-4"), "拖车做柜查询", 39);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-4"), "集装箱查询", 28);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-5"), "空柜查询", 28);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-5"), "拖车做柜查询", 36);            ds.DataTable1.AddDataTable1Row(Convert.ToDateTime("2010-5-5"), "集装箱查询", 16);        }

最终运行效果如下

我们发现交叉表左上角有一大大缺口,实在不雅,可参考阿泰这篇文章解决
左上角缺口 大补丸



原帖的百分比部分尚未实现,对原帖该需求不太明确,可参考
交叉表百分比之实现
亦是泰哥的杰作~

[解决办法]
沙发先~~


[解决办法]
不错,支持
[解决办法]
mark
[解决办法]

[解决办法]
To luols,阿泰哥

步骤非常的详细,我研究学习下,太感激了!再次感谢!
[解决办法]

探讨

引用:
沙发先~~


泰哥~大补丸的图片又不见了~

[解决办法]
很详细!咋这么像阿泰的风格呢!
[解决办法]
探讨

引用:
沙发先~~


泰哥~大补丸的图片又不见了~

[解决办法]
非常感luols么的分享..
[解决办法]
mark 谢谢分享
[解决办法]
谢谢分享
[解决办法]
难道是阿泰室友痞子?!

呵呵,不错的分享
[解决办法]
顶了
………………
[解决办法]

[解决办法]
好啊啊啊啊
[解决办法]
终于等到葛优来推荐了~~~
[解决办法]
谢谢分享了 ............
[解决办法]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[解决办法]
感谢分享!很有用!
[解决办法]
谢谢,谢谢楼主分享水晶报表
[解决办法]
study!!!
[解决办法]
zzzz
[解决办法]
study!!!
[解决办法]
学习~~~~
[解决办法]
学习了!
[解决办法]
先顶下,再看,哈哈!
[解决办法]
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分

[解决办法]
顶。。。
[解决办法]
学习了
[解决办法]
谢谢----
[解决办法]
这个比较牛啊

[解决办法]
learning......
[解决办法]
asddddddddddddddddddd
[解决办法]
哎呦 不错哦
[解决办法]
做得很不错
[解决办法]
水晶易表更好些把
[解决办法]
收藏,学习!
[解决办法]
学习···
[解决办法]
顶!谢谢了
[解决办法]
学习了 呵呵

[解决办法]
不错啊、、、、、
[解决办法]
Good
[解决办法]
very good!thanks!
[解决办法]
学习一下 我也正需要 啊
[解决办法]
学习一下 我也正需要 啊
[解决办法]
thanks you
[解决办法]
收藏 学习。。。。。。
[解决办法]
太强了,坚决挺你。我也学学。
[解决办法]
支持。
[解决办法]
支持!!
[解决办法]
步骤非常的详细,我研究学习下,太感激了!再次感谢
[解决办法]
学习拉 谢谢楼主
[解决办法]
混点分

[解决办法]
学习中。、。。。
[解决办法]
顶。。。。。
[解决办法]
学习一下,又长见识了
[解决办法]

探讨
终于等到葛优来推荐了~~~

[解决办法]
Mark...
[解决办法]
很用心的人,好的解
[解决办法]
弱弱的问句:

为什么<<左上角缺口 大补丸>>在WinForm下正常显示,而在WebForm就实现不了呢?


[解决办法]
探讨
弱弱的问句:

为什么<<左上角缺口 大补丸>>在WinForm下正常显示,而在WebForm就实现不了呢?

[解决办法]
感觉有点迷惘
[解决办法]
very well
------解决方案--------------------



very well

[解决办法]

探讨

引用:
弱弱的问句:

为什么<<左上角缺口 大补丸>>在WinForm下正常显示,而在WebForm就实现不了呢?


试试
http://www.cnblogs.com/babyt/archive/2009/05/19/1460967.html

[解决办法]
mark!
[解决办法]
太感谢了,这正是我所需要的!!!!
[解决办法]
不错 学习

读书人网 >.NET

热点推荐