第一条:水晶报表分组分页且每页最多显示N条记录
要求:1、详细节最多5条记录(不能超过5条);
2、无论前一组是否满5条记录,每个新组都要另起一页
3、可以显示组内分页的情况,即:显示一个组被分为几页并且当前是第几页
我们知道每页最多显示N条的控制方法,打开节专家,在详细节后面新建页公式编辑:
RecordNumber mod N = 0
RecordNumber即记录数,无论分组与否,是自动随记录递增的,所以在这里,我们不能用RecordNumber,而应该是在每个新组前要重置这个RecordNumber,用这个重置的RecordNumber来取模控制每页最多显示5条记录,于是我们很自然就想到了运行总计字段,由它来帮我们重置RecordNumber,
这样我们应该就很明朗了,接下来让我们一起去设计模板:
报表按ID分组就不用再提及了吧?(右击报表空白处->插入->组)
首先新建一>运行总计字段汇总字段:XXX(最好选择的字段和分组字段不同)
汇总类型:计数
求值:对于每个记录
重置:组更改时
字段是刚刚建立的【运行总计字段】 {#RTotal0} mod 10=0
针对需求2,与需求1同理,只不过此时我们是在#组尾(组页脚)节在后面页新建页的公式编辑:
Not OnLastRecord
OnLastRecord意指最后一条记录,Not OnLastRecord自然是非最后一条记录,在这里就是指非最后一条记录时就在后面页新建页,最后一条记录时就不用再新建页了。若不用该公式控制的话,报表的最后一页总是空白页(没有详细节数据)
需求3:组内分页及显示页码
新建一个【公式字段】公式设置如下:
记录的组记录总数:count(一个报表参数,分组参数);前者最好是运行总计的字段。如果有汇总,请在count最后+1,因为多一行数据。!!!
方式一:注意组内数据条数和当前组内序号
//每个组的总记录数 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 //写好后将该公式字段拖放到#组头(组页眉)节即可
方式二:注意组内数据条数和当前组内序号
numbervar x1; numbervar x2; numbervar p1; numbervar p2; //x1是每个组的数据条数 x1:=count({OUT_1_DATASET.code1},{OUT_1_DATASET.Warehouse_position}); //得到总页码 if(x1%10=0)then p1:=x1/10 else p1:=INT(x1/10)+1; //得到当前行组内序号。其实就是换页第一条的序号 x2:={#RTotal0}; //用序号除以每页的条数5,得到当前页码 if(x2%10=0)then p2:=x2/10 else p2:=INT(x2/10)+1; //组合 '第'+totext(p2,0)+'页/共'+totext(p1,0)+'页'
第二条:一个获取记录的标记和页脚的显示
在IDE左侧的“字段资源管理器”里的“公式字段”点击右键“新建”,新 建一个字段“Group”,编辑赋值: whilereadingrecords; true; 这里是TRUE,获取的就是“真”,否则获取的就是“假”
控制子报表每页显示数目,假设为10行每页,只是做一下说明,不要设置公式 注意设置的行数最好基本上能打印到页面的底部 拆分一个详细资料节出来,把页脚内容写上,抑制显示,设置公式为 recordnumber mod 10<>0 在这个节上进行分页控制,“在后面页先建页面”勾上,设置公式为 recordnumber mod 10=0 这样的话每页最下面会显示该节模拟页脚 最后一页如果不满10行的话,因为你设置了报表页脚,也可以模拟成一个页脚了 为了防止最后有一页刚好显示10行导致出现双重页脚 还需要进一步改进一下抑制显示的公式 If onlastrecord then true else if recordnumber mod 10<>0 then true else false 最后页不足,用空行填充: (Basic语法) 新增一个空白详细资料行,格式化此节,在抑制显示(无深化)打勾 公式中输入: if not onlastrecord then FORMULA = TRUE else if (RecordNumber mod 5 <= 1) then '第一个 FORMULA = TRUE else FORMULA = FALSE end if end if