水晶报表(转!)

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


这就是本文的命题。
如何将同一个表(记录集)中的字段,拆成上下两部分,每页各显示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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值