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

[分享]Crystal Reports 2008 (设计篇)------- 参数字段设置及子报表开发
 
  列位看官,上期节目(安装及简单报表设计),我们已经成功的用CrystalReport 2008 开发了一张具有汇总功能的初级水晶报表。本期节目我们将在现有报表基础上研究更深层次水晶报表功能。
参数字段的设置:
上图!

前面的介绍中,我们已经对报表进行分组统计,现在我们队这些经过分组后的条目进行汇总统计,我们需要用到运行汇总字段:
比如本报表中,我们需要进行每一分组条目的所有产品的总平方、总重箱、总片数进行统计,我们需要新建三个汇总字段,总平方、总重箱、总片数。
上图!

请看左侧的下拉框,我们可以利用其中的某一字段作为基础数据进行会求和汇总,求积汇总以及求平均值等多种汇总。但是对于我们的总重箱和总平方来说,是由单件重箱和单件平方来进行求和统计的,且我们的报表字段以及数据库原始字段中都找到关于这两个量的记录,我们就需要对上述两个记录进行预先处理,即建立两个名为“平方”和“重箱”的公式字段,按照各自的计算公式得出值。
上图!

公式字段中新添加了两个字段,我们在公示编辑区域,编写他们各自的公式,实际上就是利用已有字段进行加减乘除等数学运算。
建好字段后我们可以进行汇总统计了,上图!

右键单击运行汇总字段---新建三个汇总字段!汇总类型选择“和”,求值选择对于每条记录,重置选择组更改时,选择任何一个组都可以,因为我们的分组形成后,将汇总字段放置于组名字段平行的行内,他们会按每条汇总记录进行计算的,所以上面的求值和重置选择是很重要的,一定要选择正确。注意在总重箱和总平方设置汇总时,“要汇总的字段”应选择前面建好的两个公式字段。
建好以后,将三个汇总字段拖入报表页面,添加三个标题,预览一下,一张带有汇总统计功能的报表就做好了。上图!

这里的数据可能格式不太符和我们的要求,那么我们可以右键—设置格式进行修正,具体修正方法,不多说了。
效果图如下:

小数点保留位数,起始零的设置,都可以进行设计。

汇总做完,我们要进行数据的筛选设置,这是就要用到我们的参数字段了,我们想要根据我们当时分组时的6个字段的值,进行条件查询操作,那么我们就需要建立6个参数字段分别传递我们选择的参数值,然后交给报表进行筛选查询,上图!以产品品种为例:
右键—参数字段-新建:如图

名称填写产品品种,值列表选择动态之后,下方的选择表格会发生相应变化,因为我们希望报表提供给我们数据库中已经有的字段值进行筛选,所以我们选择动态值列表,对应的值为代表产品品种的编码字段,如果你的数据库结构设计中将产品品种的描述也放在其中,那么你可以选择该描述字段放入“说明”一栏,这一步是可选的,后面的参数我们单击后会变成当前字段,下方的值选项,提供给了我们若干选择条件用来控制该参数的作用类型和作用范围,比如我可以定义该参数是否是你报表中的必选参数,它是否可编辑,它一个参数代表一个离散值还是一个范围值,它是否允许多选,等等。你可以根据实际情况定制你的参数。
确定后参数字段设置完成,上图!

这里需要提醒列位的是,不要觉得参数字段中提供了允许范围值这一选项,我们就可以把日期范围的选择寄托在一个参数身上,让这个参数允许范围值,这样做的结果往往是找不到我们想要的正确数据,建议将日期分为开始和结束两个参数分别设置,这样的数据会比较准确。
参数设置完了,还需要进行参数与数据的关联,即要让查询结果根据参数的不同发生改变。上图!
现将各个参数拖入报表的某个区域,建议放在报表头。

然后,右键单击某个与参数值对应的分组字段,选择专家组

找到当前字段单击确定,

选择等于或者介于(针对范围值需要前后两个参数确定范围的需要进行“介于”,比如时间)对应参数字段。

第二个参数可以直接新建。

确定完成。这样就完成了参数的关联动作了。预览一下!上图!

筛选效果为

左侧出现了 输入筛选条件的工具栏。这样我们一张带有选择条件的报表就开发完成了。
不过不足之处是,我们如果前期选择了JDBC(即非水晶报表默认连接),必须手动再输入一次登录数据库信息,比较头疼,有待高手指点。

下面介绍子报表的开发:
前面的主报表,仅仅是对数据库内详细记录的汇总分组,我们根本的目的还是要有效的查看数据库中的详细记录,也就是要查看明细,这样我们就不能再在这张主报表操作详细信息了,需要再另起一张子报表。上图!

你可以添加你已经开发好的报表作为子报表,也可以添加一张新的报表,说白了,子报表也是报表,他在本质上和主报表没有任何区别,只是他在记录显示方面需要依赖于主报表的某些字段。怎么依赖?我们填写好“新建报表名称”(这里最好起用英文名字因为在某些低版本的水晶报表中是不支持中文名称的),选择下方“按需显示子报表”。确定以后,点击报表向导,答案揭晓!!!上图!

首先,要拖拽新的数据表进入设计界面,和前面的报表向导步骤是一样的。

设置完成后,会回到上面的界面。

切换至“链接”选项卡,开始对主报表和子报表进行连接,上图!

从左边选择需要与子报表进行关联的主报表的字段点击向右箭头,选中。
我们此处需要对前面分组的6个字段组进行全部关联,才能查看每个分组上的明细信息,所以我们把之前6个分组全部加进去,上图!

再添加完后几乎同时,系统会自动在子报表中新建参数字段用来连接,我们刚才需要关联的主报表字段,这些信息会在下方字段连接中有所体现,你也可以更改这些链接。一般选择默认。确定,完成!上图!

因为我们之前选择了 ,按需显示所以子报表在主报表中是以超链接形式体现,这样显得思路比较清晰。预览一下!上图!


而且,参数设置完成后,打开预览,出现以下问题。上图!

确定后,焦点停在了这里!上图!

回到报表,重新设定条件,点击确定后,报表查询正常,但单击子报表连接,我的机器死掉了,重启以后,我发现原来做的子报表都没保存,以前同事也遇到过这种情况,我分析可能是连接问题,子报表跟主报表一样需要输入登录信息后才能连接,但是子报表没有提示输入登录信息,子报表连接没有打开,报表强行读取数据,导致长时间占用CPU导致死机。不知这种解释成立不成立。查找原因,我们回到原来的参数字段设计,查看系统为我们建的参数查询条件是什么,从这里找一下原因。
看一下上一幅图,文本框中的查询条件是:
(not HasValue({?产品品种}) OR {数据库字段} = {?产品品种})
 and
(not HasValue({?产品长度}) OR {数据库字段} = {?产品长度})
 and
(not HasValue({?产品宽度}) OR {数据库字段} = {?产品宽度})
 and
{数据库字段} in {?开始日期} to {?结束日期}

系统在添加“介于”条件时,没有添加类似于“not HasValue({?产品宽度}”的允许空条件。所以我们需要人工修改筛选条件,在 最后一个“and”后添加如下代码:
not HasValue({?开始日期}) OR not HasValue({?结束日期}) OR  

并将最后关于时间的筛选条件用括号包裹,表示整体成立即合理。返回报表预览,显示正常!但是经过时间筛选后的结果比正式结果少了很多条,所以in…to….条件不太适合。

经过试验我们决定将条件设定进行一定的改造。
将条件中{数据库字段} in {?开始日期} to {?结束日期}
改为
{数据库字段} >= {?开始日期} 
and 
{数据库字段} <= {?结束日期}


在子报表中也设定两个相应的参数:开始日期和结束日期。在子报表连接中将主报表中的两个参数与子报表中的两个参数相对应,试验后结果正确操作步骤,上图!
注意:分组统计时,如果要显示正确的汇总结果,应把组名字段放在某个组的尾部,统计数据才会正确。



设定子报表连接时,对于特殊的报表字段在选择连接的时候要进行人为选择,才能保证连接正确!


预览一下子报表的效果吧!
主报表效果:

详细的明细信息:

截止本章,我们已经完成主报表和子报表的关联,加前面讲到的分组汇总和条件筛选,我们已经能够用水晶报表完成一些基本的数据统计操作了,后面的文章将对设计格式进行简单讲解,还有就是将介绍如何将水晶报表嵌入.NET 环境和JAVA环境进行集成应用。敬请关注!


------解决方案--------------------