日期:2014-05-20  浏览次数:20768 次

【水晶报表内功心法】--公式、函数与运行时总计
本帖最后由 babyt 于 2010-03-23 12:10:21 编辑
索引 

.【水晶报表内功心法】--序言 
.【水晶报表内功心法】--推拉之间
.【水晶报表内功心法】--PULL模式样板招式
.【水晶报表内功心法】--PUSH模式样板招式
.【水晶报表内功心法】--信手拈来,掌控对象
.【水晶报表内功心法】--数据过滤
.【水晶报表内容心法】--第一阶段小结
...
...
.【水晶报表内功心法】--完美Excel(上)
.【水晶报表内功心法】--完美Excel(下)
============================================================ 

一如既往地忙碌,一如既往地加班。
这个月马上就要过去了,回头一望,本月最令人激动的事情就是去了美女如云的 ChinaJoy。
附照片一张。
[20100323:美女图片不幸丢失。。]

本文的主题是:函数与公式、运行时总计
本文还是以基础讲解为主,后面的一些实际场景中会有具体的使用

1:公式
公式可以说是水晶报表里精髓,其重要性有点像Excel的宏一样。
公式基本上可以分为两类,一是格式化类。一是运算类。当然,格式化的公式也是需要运算的。
水晶报表的一些内置的功能,本身也是依赖于公式的,只是做了封装。
公式有两种语法:crystal语法和Basic语法,没有根本性差异。
如果你之前用过Basic类的语言,那么这个就非常容易了。
可以从此处下载一个独立版本的水晶报表帮助文档,方便查阅。
《CR XI水晶报表开发官方中文帮助文档》


格式化类主要出现在如下位置:
比如,我们要把某个列中值等于12的值设置为蓝色,等于15的设置为红色,其余的设置为黑色。
在字段上点右键,格式化该字段,

这个图上的(x+2)后面就是一个公式,如果里面没有内容,这个图标就是这种默认的颜色。
如果里面有内容,则图标会变成红色。

本文的示例数据延续前文中的例子

实例1,如果用户分数等于12,则显示为蓝色,如果等于15分则显示为蓝色,其他显示为黑色。
点击上图中的(x+2),进入公式编辑界面。

我抓了个大图,里面做了一些标记。
公式本身就比较简单了,不必再进行说明。
注意前面的图上左上角的两个指向,x+2是指检查该公式是否正确,检查完毕后停留在当前界面
保存并关闭,则是先检查后保存公式并且关闭本界面,回到前一界面上。

好了,我们再运行一下程序,效果就出来了。


实例2,控制每3条记录换页

进入节专家


点中“详细资料节”,勾选后面的“在后面新建页”,然后编辑后面的公式为

如果公式有错误,则会有类似下面的提示,当然,根据错误的不同,提示也不一样


再预览一下,之前我们显示1页的数据,已经分页了。注意上面的 1+,说明页数多于一页。


但是并没有显示实际页数,这是水晶报表的一个优化机制。如果是多页的数据,它只显示第一页
有点类似于我们的一些数据库分页操作一样。但是这个也带来很多批评。
而实际上,解决方法也是有的。
就是这样
CrystalReportViewer1.ReportSource = myReport;
CrystalReportViewer1.ShowLastPage();
CrystalReportViewer1.ShowFirstPage();
实际上也是模拟了我们的一个手工动作,就是先点击跳到最后一页,然后再切到第一页。
这个动作用户是感觉不到的,尚可以接受。


前面的是两个格式化类的公式,下面说一下运算类公式。

实例3,如果分数<15则显示不合格,等于15则为合格,大于15则为优秀
这个就是对数据的再加工了。

新建一个公式字段x1



然后把x1拖到界面上,放到原来数据的后面,预览后就显示



实例4,代码中修改公式
新建一个公式字段x2,里面就放一个现有字段即可


显示效果如下


恩,没什么感觉吧。
另外做一个公式字段x2title,作为x2这一列的题头


然后代码里控制一下:

myReport.DataDefinition.FormulaFields["x2"].Text = "{RPT_CR_TEST1.Scores}";
myReport.DataDefinition.FormulaFields["x2title"].Text = "'得分情况'";

特别注意的是,原公式中返回的是字符串的话,要把引号带进去。
myReport.DataDefinition.FormulaFields["x2title"].Text = "'得分情况'";

再看效果


这个可以实时变化的字段,有很多用处的。
用过的朋友应该记得,在分组、图表、交叉表的时候,都可以使用公式字段作为运算字段的
如果我们在代码中控制公式里的字段变化,那么自然也达到了动态分组、动态图表等效果了
类似的应用可以参考: