【水晶报表实战指南】使用分组实现超多列分段同页及分页显示

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


这就是本文的命题。
如何将同一个表(记录集)中的字段,拆成上下两部分,每页各显示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列。
SELECT (
SELECT count(*) +1
FROM [Orders ] as a where a.[order id]<b.[order id]) AS myIndex, b.*
FROM Orders AS b;


其显示的结果如下


当然,我们也可以直接进去到前面说的第2种情况
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
...全文
5643 118 打赏 收藏 转发到动态 举报
写回复
用AI写文章
118 条回复
切换为时间正序
请发表友善的回复…
发表回复
wf727251593 2011-11-24
  • 打赏
  • 举报
回复
不錯。。。。
  • 打赏
  • 举报
回复
你的方法我以前就用过,小数据这样还行,大数据时会给拖死,才几千行,就给白屏了
pumpkintoto 2011-10-12
  • 打赏
  • 举报
回复
阿泰,如果该例子中的一页要分成两页来显示,该怎么做
naclyhc22 2011-08-03
  • 打赏
  • 举报
回复
不知道如果不用子报表有没有什么办法
fengylm 2010-09-19
  • 打赏
  • 举报
回复
每次看泰哥的文章我都忍不住要顶下。每次都能从泰哥的文章里学到不少东西
DengXingJie 2010-08-18
  • 打赏
  • 举报
回复
收藏先
lizhenmingdede 2010-06-02
  • 打赏
  • 举报
回复
泰哥 ,我的代码是这么写的:
子报表的空白节---勾抑制显示--这是第二个空白节里写的
if (RecordNumber mod 10 <2 and onlastrecord) then
FALSE
else
true
lizhenmingdede 2010-06-02
  • 打赏
  • 举报
回复
不好意思,上面就个错别字:

泰哥,您有没有试过在此基础上,再让最后一页上下部分不足10行补空行??

我试过了,但是有些问题,再请教一下泰哥:
如果数据不足10行,上下部分补空行没有问题,但如果,数据行数大于10行,最后一页没有问题,其他页中子报表显示的部分就会出现问题-------所有的空白节都会显示。

麻烦泰哥再试试!
lizhenmingdede 2010-06-02
  • 打赏
  • 举报
回复
泰哥,您有没有试过在此基础上,再让最后一页上下部分不足10行补空行??

我试过了,但是有些问题,再请教一下泰哥:
如果数据不足10行,上下部分补空行没有问题,但如果,数据行数大于10行,除最后一页的前几天中,子报表显示的部分就会出现问题--所有的空白节都会显示。

麻烦泰哥再试试!
冰糖_adam 2010-03-01
  • 打赏
  • 举报
回复
学习
回复内容太短了!回复内容太短了!回复内容太短了!回复内容太短了!
xzq12345 2010-02-27
  • 打赏
  • 举报
回复
阿泰大哥能够修复一下 图片吗
jpxyy 2010-02-16
  • 打赏
  • 举报
回复
我得好好学学,感谢啊
j2meme 2010-02-16
  • 打赏
  • 举报
回复
不要依赖于数据库本身里的ID,因为你可以有不同的过滤条件及排序条件,会导致你的本身的数据ID是不联系的
jianguohh 2010-02-14
  • 打赏
  • 举报
回复
学习了 我刚加入 祝大家新年快乐
sffgghjjjj 2010-02-13
  • 打赏
  • 举报
回复
路 过 看 看
学习一下
zhf263 2010-02-13
  • 打赏
  • 举报
回复
bu不错 谢谢
pz 2010-02-13
  • 打赏
  • 举报
回复
学习了。。。。。。。。。
mlhy20060406 2010-02-11
  • 打赏
  • 举报
回复
study, mark
linlovewo 2010-02-10
  • 打赏
  • 举报
回复
这是什么?。。。。不懂。。。。。。。。。。。
a207988 2010-02-10
  • 打赏
  • 举报
回复
哇塞~~~,真是非常感谢
加载更多回复(96)
Crystal Reports 9.2 中文版(水晶报表) 下载,,软件版本:9.2.0.448不过现已出了Crystal Reports Professional v9.2.2.634 (c) Crystal Decisions,有足够的空间就提供.这是一个很不错的报表控件,我相信很多朋友都听说过吧!Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。 创建所能想象的任何报表 Crystal Reports几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。 不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。感谢 revenant 上传!

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧