码迷,mamicode.com
首页 > 其他好文 > 详细

2019-1-17水晶报表技巧总结【2】

时间:2019-01-17 12:05:55      阅读:375      评论:0      收藏:0      [点我收藏+]

标签:设计   false   xxx   要求   bsp   mod   拆分   重置   一个   

第一条:水晶报表分组分页且每页最多显示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 

  

2019-1-17水晶报表技巧总结【2】

标签:设计   false   xxx   要求   bsp   mod   拆分   重置   一个   

原文地址:https://www.cnblogs.com/liuqifeng/p/10281408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!