2019-1-16水晶报表技巧总结【一】

 

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

 第一条:合计问题,包括汇总或者是简单数量合计或者是页面行数的统计或者是页面数的统计等...

第二条:关于抑制显示,在【详细资料】中,有些字段不想在一些页面显示出来,可抑制显示这些字段,在后面的公式中添加:

第三条:分页问题,有按组分页或者按行分页或者分组后按行分页

 第四条:公式显示页码

第五条:各个计数参数函数 

 第六条:行列的公式统计汇总方式:

第七条:有数据记录条数显示记录条数,没有记录时显示“0”:

第八条:运行总计字段的创建--有关组,没有组的就不要重置

 第九条:简单的公式

 

第一条:合计问题,包括汇总或者是简单数量合计或者是页面行数的统计或者是页面数的统计等...

使用了运行时总计的形式来实现每页的汇总 
使用该方式其实是实现了当前页之前所有页面数据的汇总 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
说简单点,就是3个公式
AmountReset 用于清空页合计
RunningTotal 用于累加页合计
AmountDisplay 用于显示页合计.
 
在“字段资源管理器”对话框中选择“公式字段”,然后单击“新建”。
将公式命名为“RunningTotal”,然后单击“使用编辑器”。
出现公式工作室,公式编辑器处于活动状态。
将以下内容输入“公式”框:
WhilePrintingRecords;
CurrencyVar Amount;
Amount := Amount + {订单.订单金额};
 
在公式工作室中创建“AmountReset”:
WhilePrintingRecords;
CurrencyVar Amount := 0;
 
在公式工作室中创建“AmountDisplay”:
WhilePrintingRecords;
CurrencyVar Amount;
该公式可用于随时显示 Amount 变量的当前值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
水晶报表分页汇总小计
公式:FootRet
whileprintingrecords;
global numbervar rtotal;
 
公式:Header
whileprintingrecords;
numbervar rtotal:=0;
 
公式:Detail
whileprintingrecords;
numbervar rtotal := rtotal +({命令.DrugNum}*{命令.RetailPrice});
  
公式:PrintRetailTotalPrice
WhilePrintingRecords;
Global numbervar rtotal;

  

第二条:关于抑制显示,在【详细资料】中,有些字段不想在一些页面显示出来,可抑制显示这些字段,在后面的公式中添加:

1
2
3
pagenumber=1
 
后面的数字,可以是一个范围,填写什么数据,就抑制在那页的显示或者是那些页的显示。

 

第三条:分页问题,有按组分页或者按行分页或者分组后按行分页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
按组分页:
直接在【节专家】中选择,组尾,在选择【在后面页新建页】即可。
 
按行分页:
 
在以下内容之前新建页:
 
IF Remainder (RecordNumber, PageNumber*5+1 )=0 then
True
Else
False
这是5行一页
在后面页新建页:
if onlastrecord then
false
else
if RecordNumber mod 10 =0 then
true
else
false
这是10行一页
后面一种方法好一点,前面可以因为总行数不同分的不整齐。
 
按组按行分:
【在后面页新建页】【在以下内容之前新建页】这两个地方填写公式是不一样的
报表使用了分组,一个组的数据会跨好几页,要单独显示某组显示到【第几页/共几页】
效果类似于:
 
 
这是一个综合工程,我们要逐步来拆解一下。
 
本文使用水晶报表2008操作,其余版本类似。
 
1:首先,是按照某个字段来分组
这个就不多说了,我用的是水晶报表自带示例库的产品表,用颜色字段进行分组。
 
2:每页显示5行数据,且每页的上都要显示组页眉,不同的组不能显示在同一页上。也就是组和组之间是的分离
 
(1)每页显示5行设置
我们知道每页最多显示N条的控制方法,打开节专家,在详细资料节,【后面新建页】公式编辑:
RecordNumber mod N = 0
如果是CR2008之前的版本,使用公式 RecordNumber Mod 5=0 
(2)每组上都要显示组页眉
 
(3)每个组单独占一页,不混合显示。
也就是1页显示5行,如果组a有1行,组b有2行,他们要分别占据1页,而不是合在1页上显示。
 
如果是CR2008之前的版本,使用公式 GroupNumber Mod 1=0 
 
3:使用运行时总和为每组数据单独编号
 
 
把这个运行总和字段做到模板上看看效果。分别拖到详细资料节和组页眉
 
 
可以看到,放在组页眉上的序号,其实就是在该页上第一条记录在组内的序号。
 
4:组内分页基本原理
 
现在我们能拿到单独的组内序号了,那么,怎么去用来分页呢。
想一下,假设我们每组记录数目为N(当然,N是变化的),如果存在多页的话,因为是5行一分页
那么对一个组来说,每页第一条的序号分别为1、6、11.。
也就是【5的倍数+1】。
 
那么我们的公式其实就出来了,
我们以每页组页眉上的那条为基准,也就是每页的第一条为基准,序号 除以 5,取整再 +1 即可。
 
公式如下
 
 
针对以的代码,找不到Roundup,重写:
numbervar x1;
numbervar x2;
numbervar p1;
numbervar p2;
//x1是每个组的数据条数
x1:=  Count ({ DataTable3 .Job_No},{ DataTable3 .Job_No});
//得到总页码
p1:=round(x1/16+0.4);
//得到当前行组内序号,其实就是换后第一条的序号
x2:={#RTotal0};
//用序号外以每页的条数16,得到当前页码
p2:=round(x2/16+0.4);
 
if p2=0 then p2:=1;
 
 
totext(p2,0) +' / ' +totext(p1,0)
 
效果如下
 
 
公式中的几个点特别说明一下
Count(字段,分组字段) 表示组小计计数
RoundUp(x)是向上取整,比如x=5则为5,5.1则为6.

 第四条:公式显示页码

1
2
3
'第'+ToText(PageNumber,0)+'页,共'+ToText(TotalPageCount,0)+'页'
 
这是可以显示总有几页,现在是第几页

第五条:各个计数参数函数 

1
2
3
4
5
6
7
8
9
recordnumber  记录号
groupnumber 组号
DistinctCount(分组字段) 这里可以计算总组数
按组分页,在组尾【在后面页新建页】--防止最后一页是空白页
groupnumber<DistinctCount({OUT_1_DATASET.Warehouse_position})
 
pagenumber 当前页数
 
TotalPageCount 总页数

 第六条:行列的公式统计汇总方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
行计算比较容易理解:
 
新建一个公式:
 
下面是计算每个条记录的物体体积公司;
 
WhilePrintingRecords;
CurrencyVar mySum_m;
mySum_m:={Crystal_data.pack_Qty_c}*{Crystal_data.CarTon_length_c}*{Crystal_data.Carton_width_c}*{Crystal_data.Carton_height_c}/1000000;
 
把公式拖放到显示位置就行了
 
  
 
列计算有点儿容易让人误会,下面是求每条记录体积的和
 
WhilePrintingRecords;
CurrencyVar mySum_su;
mySum_su:=mySum_su+{Crystal_data.pack_Qty_c}*{Crystal_data.CarTon_length_c}*{Crystal_data.Carton_width_c}*{Crystal_data.Carton_height_c}/1000000;
 
公式需要放在详细资料里,和这些字段一起,把它属性
 
  
 
 其实没什么,每页统计与最后统计在于,有没有在第页的表头上进第这些变量的初始化,如下:
 
WhilePrintingRecords;
CurrencyVar mySum_su:= 0;
 
在报表页头做了初始化数据就是当前的统计了

第七条:数据记录条数显示记录条数,没有记录时显示“0”:

1
2
3
4
5
If IsNull ({TABLE_A.ID}) And IsNull ({TABLE_A.NAME}) And IsNull ({TABLE_A.SEX}) AND
   RecordNumber = 1 Then
 '0' 
Else
 ToText(Count ({DataTable3.ID}), 0)

第八条:运行总计字段的创建--有关组,没有组的就不要重置

1
2
3
4
5
6
7
8
字段资源管理器——运行总计字段——新建
 
汇总字段:XXX
汇总类型:计数
求值:对于每个记录
重置:组更改时
 
完了拖到组页脚处。

 第九条:简单的公式

1
cstr(count(某字段,分组公式x1)/count(某字段) *100 ,2)+'%'  百分比公式
1
2
勾选抑制显示
设置 组名 <>'21~30岁'  这是范围抑制

  

  

  

 

posted @   IT苦行僧-QF  阅读(2245)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示