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

【水晶报表实战指南】使用分组实现超多列分段同页及分页显示
经常会遇到这样的情况,比如一个报表字段很多,有几十个。
虽然我们可以设置一个大纸型,但是限于一些客观条件(如打印机不支持)
还是无法实现。
所以有人就提出了,能不能把字段折一下,放到一个页面里
而不是像常规的那样非要显示在一个横行上呢。


这就是本文的命题。
如何将同一个表(记录集)中的字段,拆成上下两部分,每页各显示10条
也就是这个样子。


看到这个图,有人可能一下子想到的就是两个子报表。
如果数据比较少,不用分页,用子报表是没问题的
但是如果要分页,子报表是做不到的(至少目前的水晶报表还不支持这个机制)。
因为显然两个子报表都要分页(或者有人是用一个主报表,一个子报表)
但是这样一个页面上就出现了两个分页需求,然目前水晶报表的解析,是用后面的规则去覆盖掉前面的规则
也就是说,虽然确实都分页了,但是因为常规分页都是在详细资料节处新起一页的。
那么第2个子报表和第1个子报表的内容会重叠起来。
而如果把子报表放在不同的节上,又会出现这样的情况。
就是第一个子报表全部分页结束,才会显示第2个子报表的内容。
这样就造成了数据不连贯(当然,也有的需求直接就这样,那就直接这么用就可以了)。

下面我开始示例操作

1:样例数据
本文以独立版本水晶报表自带的样例数据库xtreme.mdb中的Orders订单表为例。


2:数据的整理
数据必须有一个连续的ID(或者有一个分组的标志位),这是本文实现的重点。
所以特别说明一下。
我们的方案中,将以这个ID(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22...)为准进行处理。
如每10个分一页,那么我们要构造一个分组字段:(ID-1) \ 10 
注意这个符号,是取整的。
这样,就把每10个归为一个组了。这个字段会出来一个0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3...
当然,如果有条件,可以之前就准备好,比如说这个ID直接就是1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3...
这里我先不讲为什么要这样做,只是你务必要注意这一点。
不要依赖于数据库本身里的ID,因为你可以有不同的过滤条件及排序条件,会导致你的本身的数据ID是不联系的
所以这个ID字段,是你自己构造的,与是原先数据并无实际的逻辑关系,只是为报表准备的。

比如,以Access语法为例子,为现有记录集主动加一个ID列。
SQL code
SELECT (
SELECT count(*) +1
FROM [Orders ] as a  where a.[order id]<b.[order id]) AS  myIndex, b.*
FROM Orders AS b;


其显示的结果如下


当然,我们也可以直接进去到前面说的第2种情况
SQL code
SELECT (
SELECT count(*)]\10
FROM [Orders ] as a  where a.[order id]<b.[order id]) AS  myIndex, b.*
FROM Orders AS b


其显示的结果如下


本文采用第一种方法来实现。

3:数据与模板怎么进行连接
我们已经知道制作模板有PULL和PUSH两种方法。
使用PUSH的话,就不用关心这个操作了。因为这个SQL是在代码中实现并传给记录集的再传给报表。
而使用PULL的时候,就这样,直接把SQL代码拷贝到“命令”就行了。
当然,你也可以使用存储过程,或者一个中间的实体结果表等。


4:制作主模板
我们先用主报表来显示前半部分字段,然后用子报表挂接后半部分字段。
两个报表可以使用同一个记录集
不过如果数据量比较大,建议还是按照实际需要拆开,这样减小数据的传输
如主报表的记录集只放前5个字段,子报表的记录集放后5个字段等。

我这里为了方便操作,用了同一个记录集。


<1>首先构造主表,做一个基础的明细表






<2>构造分组字段myGroup1,进行分组
如果是【2:数据的整理】中的第2种实现方法,则可以直接用ID作为分组字段了

myGroup1公式如下:

并进行分组,如果需要,把页眉放到组页眉上。


最后出来的模板是这样的


出来的数据是这样的


好了,主报表操作完毕。

5:制作子报表模板

在模板上点右键,插入子报表。
把这个子报表,拖到主报表的组页脚上。
子报表的做法跟【4:制作主模板。】一模一样。
(包括分组公式及操作)
唯一的不同就是在模板上显示的字段不同,此处省略了。
为了便于识别,把子报表上的字体全部设置为红色。
把不需要显示的节,全部抑制显示掉



6:设置主报表和子报表的关系

这个时候报表大致就是这个样子的,在子报表上点右键,选“更改子报表连接”


在出来的界面上,把两个分组字段关联起来。
(我这里两个分组字段取的名称不一样,这个不影响操作)

好了,再预览一下数据。这样数据就组合在一起了


7:分页设置

进入主报表的“节专家”,设置组页脚,勾选“在后面页新建页”就可以实现了。


如下图我们切换到第3页。




特别说明!
使用子报表的方法,在数据量较大的时候,效率非常低。所以要慎重选择使用。


PS:
本文的核心就是SQL语句的构造,和模板的操作。
实际的代码并没有多大的变化,其中涉及的代码
使用PULL模式的同学走这边
使用PUSH模式的同学走这边

需要设置水晶报表纸型,请看这里
http://www.cnblogs.com/babyt/archive/2009/02/09/1386542.html

------解决方案--------------------
学习了!sf!
------解决方案--------------------
学习
------解决方案--------------------
向阿泰学习
------解决方案--------------------
泰哥用过Developer工具吗!?
------解决方案--------------------