【水晶报表内功心法】--数据过滤
索引
.【水晶报表内功心法】--序言
.【水晶报表内功心法】--推拉之间
.【水晶报表内功心法】--PULL模式样板招式
.【水晶报表内功心法】--PUSH模式样板招式
.【水晶报表内功心法】--信手拈来,掌控对象
....
....
.【水晶报表内功心法】--完美Excel(上)
.【水晶报表内功心法】--完美Excel(下)
============================================================
周末比上班忙,好不容易等老婆和孩子都睡下了,才终于能静下心来写点东西,不知不觉地都是后半夜了。
在讲解了PULL和PUSH模式后,有一个问题随着而来。
两篇文章中,都从数据表中取了完整的数据,而实际应用中,我们一般只会用到其中的一部分数据,也就是要对数据进行过滤。
数据过滤的操作,在这里我归并为两个要点:一是要实现数据过滤,二是要把过滤条件显示在报表上。
1:PUSH模式下的数据过滤方法
这两个要点的实现,在PUSH模式下是非常方便的,我这里也只是做一下说明
只要在
- C# code
da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);而过滤条件可以通过参数传递给报表,进行显示
- C# code
myReport.SetParameterValue(参数名,参数值);
很容易理解吧。
2:PULL模式下的数据过滤的几种实现方法
之前经常看到一些代码里,为了实现数据过滤,用PULL制作了模板,然后用PUSH方式再SetDataSource一个动态记录集过去的错误做法。
PULL模式下,用到的是“记录选定公式”。
这里我直接在模板里操作一下,因为PULL模式是直接连数据库的,所以可以立刻看到效果
我们的初始模板是这样的,
目标是要显示出图上粉色标注出的数据,也就是Scores<=11
(1)在模板上点右键,插入,特殊字段,记录选定公式
看到这个图,估计有些朋友会想到前面我们文章里用到的ReportObject,不错,这个也是报表对象
不过我们这里暂时不是用报表对象的操作功能
(2)在这个“记录选定公式”上点右键,选“选择专家”
(3)在这个界面上选我们要控制的字段“Scores”,点确定
(4)在后面的界面上,设定条件为 小于或等于 11
点“显示公式”,可以看到我们设置的条件,在这个公式框里,可以输入更复杂的过滤条件,如多个字段的过滤条件等
要注意,该过滤条件,必须符合当前数据的语法。
确定后我们要的结果就出来了,上面是选定的条件。
后面要说很重要的一点,就是这个过滤条件,是推到服务器端去执行的,而不是先拉下数据,再过滤
下面是我在执行过程中在SQL性能监视器中的抓图(这个图可能被被缩小,请另存到本地看)
注意绿色的部分,条件已经直接附加上去了。
(5)如果要删除条件的话,仅仅把前面在模板上的那个记录选定公式拿掉是不行的。
再次进入刚才我们设置的那个界面,点“删除”才可以。
(6)
这个是模板上的设定,而且是个固定的值,那么怎么结合到代码中,实现灵活控制呢?其实代码很简单。
前面是讲解了原理的,实际上操作中,根本不用上述的任何操作。(白讲了?呵呵,我更希望大家能明白他具体是怎么去实现的)
只要在代码中加一行就可以了。
这是我们的基础代码
- C# code
myReport = new ReportDocument();string reportPath = Server.MapPath("Crystalreport1.rpt");myReport.Load(reportPath);//定义水晶报表的数据库连接信息ConnectionInfo connectionInfo = new ConnectionInfo();connectionInfo.DatabaseName = "crZenSample";connectionInfo.UserID = "sa";connectionInfo.Password = "*****";connectionInfo.ServerName = "ataipc";//设置报表里的认证信息(这个方法参见之前的文章)SetDBLogonForReport(connectionInfo, myReport);CrystalReportViewer1.ReportSource = myReport;只需要这么一句,真的。~~
- C# code
//注意字段名称要遵照水晶报表里的语法规则 表名.字段 ,语句要符合当前数据库的语法//此代码段放在CrystalReportViewer1.ReportSource = myReport;前后均可myReport.RecordSelectionFormula = "{RPT_CR_TEST1.Scores} <=11";这是方法一。
(7)延续上面的例子,忽略掉(6),结合起来参数来实现。这个实现起来稍微有点繁琐,不过在某些场合用的到。
新一个数值型参数testP
(8)编辑我们的记录选定公式,使其大于参数{?testP}
(9)预览一下,输入13
效果出来了
再跟踪一下SQL,仍然是组合好传给数据库的
(10)写代码,使用此方法,因为记录选定公式已经内嵌在报表中,代码中只需要控制参数就行了。
- C# code
CrystalReportViewer1.ReportSource = myReport;//此句可以出现在CrystalReportViewer1.ReportSource = myReport;之前或之后myReport.SetParameterValue("testP", 13);(11)部分人的参数是这样写的。。好复杂。。
- C# code
//把参数代码段放到CrystalReportViewer1.ReportSource = myReport;后面CrystalReportViewer1.ReportSource = myReport;ParameterFields paramFields = new ParameterFields();ParameterField paramField = new ParameterField();ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();paramField.ParameterFieldName = "testP";discreteVal.Value = 13;paramField.CurrentValues.Add(discreteVal);paramFields.Add(paramField);CrystalReportViewer1.ParameterFieldInfo = paramFields;
之所以要说一下这个复杂的代码,是因为用这个复杂代码的目的,本来是为了做区间参数和多值参数的
其目的主要是为了实现过滤条件里的
{表名.字段} in (1,2,3,4,5) 或 {表名.字段} between 100 and 200这种效果
而实际上,这样的代码完全可以写在我们所说的方法1里面
myReport.RecordSelectionFormula = "{RPT_CR_TEST1.Scores} <=11";
界面上加一个简单的文本参数提示即可,不需要那么复杂,呵呵。
给使用这种方法的朋友,减轻点工作量,呵呵。
其他:
1:实际上PUSH模式报表也可以用这种方法的,操作方法和基本代码都一样
但是因为其本身不连接数据库,所以这个条件不会被推送到数据库执行
而是在当前数据下依赖于报表能力的一个过滤,反而增加了报表的负担和数据的传输量
一般是不建议使用的。
写完这一篇,整个数据层面的基础体系就基本完善了。
预告:第一阶段小结与答疑
[解决办法]
早起的鸟儿有虫吃
sf啦
[解决办法]
板凳也不错,阿泰辛苦了
搞到一点多,,
[解决办法]
[解决办法]
阿泰哥太强大了。支持。
[解决办法]
支持,学习中。。。。
[解决办法]
推荐一个
[解决办法]
占楼学习. 貌似想给我们展示的where子句在图片上没显示出来.
[解决办法]
关注中.....
[解决办法]
阿泰辛苦了
[解决办法]
学习中...谢谢
[解决办法]
好好好
[解决办法]
OK 好东西
[解决办法]
[解决办法]
辛苦了,好东西收藏一下先
[解决办法]
好东西 多些了!!!
[解决办法]
收藏了先
[解决办法]
Tag!
[解决办法]
好东西
[解决办法]
学习中
[解决办法]
恍然大悟顶
[解决办法]
晚起的虫儿有鸟吃,来吃鸟了~
学习学习~
[解决办法]
有点空了,操作下试试,
[解决办法]
厉害~~~
[解决办法]
太强了。
[解决办法]
很好很强大
---
ps:操作和看完全是两个概念,看着觉得会了,但是操作自己写起来,还是不一样
之前看pull代码,觉得还行,自己试着写的时候,写不全,无奈,又去那篇Pull里面参考了下
[解决办法]
o ahaha ~~谢谢楼主·~学习中、、、、
[解决办法]
善用工具也能 成为 一流高手,学习。。。。。。。。。。。
[解决办法]
LZ又发好贴了, 顶
[解决办法]
终于看到总结了。嘻嘻,感谢楼主
我决定把你的博客关于水晶报表的东西都要看完
最近有个项目我想用到水晶报表
[解决办法]
感谢阿泰!
[解决办法]
谢谢楼主。我一直想学水晶报表的知识,这下有资料可以参考了。
[解决办法]
mark 学习了
[解决办法]
谢谢楼主。我一直想学水晶报表的知识,这下有资料可以参考了。
高深啊!
[解决办法]
看看,收藏!~
[解决办法]
对于区分高级报表设计人员跟普通的报表开发人员来说,这是一个比较重要的指标吧
谢谢阿泰的无私奉献
[解决办法]
mark
[解决办法]
mark
[解决办法]
正好在学习报表。
[解决办法]
mark
[解决办法]
mark
[解决办法]
做高手很不容易啊~~!
不简单~!
[解决办法]
UP