现在的位置: 首页 > 综合 > 正文

水晶报表分组分页且每页最多显示N条记录

2013年10月20日 ⁄ 综合 ⁄ 共 1688字 ⁄ 字号 评论关闭

本文为解http://topic.csdn.net/u/20111128/10/041ccade-1fa9-4bb2-b1ad-72430b233a97.html?50470所作
先确认下原帖需求:
1、详细节最多5条记录(不能超过5条);
2、无论前一组是否满5条记录,每个新组都要另起一页
主要就这两点。

我们知道每页最多显示N条的控制方法,打开节专家,在详细节后面新建页公式编辑:
RecordNumber mod N = 0

RecordNumber即记录数,无论分组与否,是自动随记录递增的,所以在这里,我们不能用RecordNumber,而应该是在每个新组前要重置这个RecordNumber,用这个重置的RecordNumber来取模控制每页最多显示5条记录,于是我们很自然就想到了运行总计字段,由它来帮我们重置RecordNumber,这样我们应该就很明朗了,接下来让我们一起去设计模板:

报表按ID分组就不用再提及了吧?(右击报表空白处->插入->组)
首先新建一运行总计字段,如图示


该运行总计字段就是为了重置RecordNumber,模板设计好后应该是这样的,如图示


就这样是达不到我们需求的,我们还要为它处理下:)
针对需求1,我们的处理方案是


针对需求2,与需求1同理,只不过此时我们是在#组尾(组页脚)节后面新建页的公式编辑:
Not OnLastRecord


OnLastRecord意指最后一条记录,Not OnLastRecord自然是非最后一条记录,在这里就是指非最后一条记录时就在后面页新建页,最后一条记录时就不用再新建页了。若不用该公式控制的话,报表的最后一页总是空白页(没有详细节数据)
原帖还有一个小需求:在第一页的ID后自动加-(1),第二页ID后自动加-(2)
其实应该是在每个#组头(组页眉)处显示 "ID:" + ID值   而已:)
这样我们只需把分组后的组名自定义一下即可,如图示:

由于这边的ID是数字型,所以用ToText函数把它转成字符型,后面的参数0表示保留0位小数(即不保留小数)

 

本文的重点是在模板的设计,代码就不晾出来了

=========================================================================================================================

Modified @2011-11-29 21:45

前文提及的小需求:在第一页的ID后自动加-(1),第二页ID后自动加-(2)

本人理解错了,应该是组内页码重置,抱歉~  

其实泰哥这篇【分享】水晶报表组内分页已经做到这个效果了,但不知道为什么我这竟然没有找到RoundUp函数,所以修改下泰哥原文公式x1的内容如下:

//每个组的总记录数
NumberVar groupRecordCount := Count ({DataTable3.Type}, {DataTable3.ID});

//每个组的总页数 
NumberVar groupPageCount := groupRecordCount / 5;
If Int(groupPageCount) <> groupPageCount Then
(
  groupPageCount := Int(groupPageCount) + 1
);

//重置后的RecordNumber
NumberVar groupRecordNumber := {#RTotal0};

//组内当前页
NumberVar groupPageNumber := groupRecordNumber / 5;
If Int(groupPageNumber) <> groupPageNumber Then
(
  groupPageNumber := Int(groupPageNumber) + 1
);

//最终报表界面显示
'第' + ToText(groupPageNumber, 0) + '页 / 共' + ToText(groupPageCount, 0) + '页'
 
//说明:Int函数是取整函数,如Int(1.2)=1; Int(1.9)=1
//写好后将该公式字段拖放到#组头(组页眉)节即可

抱歉!评论已关闭.