Crystal Reports:如何将子组汇总值移至父组页脚并无缝适配表格
嘿,我完全懂你这个需求——把各房间类型的汇总从每组末尾挪到整个表格最后,还要保持表格的连贯样式对吧?Crystal Reports确实能做到,之前你遇到的只显示第一行汇总的问题,是因为直接移组页脚的话,父组页脚只会渲染一次,没法遍历所有类型的汇总。给你一套实操方案:
核心思路
用全局数组变量收集每个房间类型的汇总数据,然后在父组(房间号/楼层组)的页脚,通过子报表遍历数组输出汇总行,完美和主表格衔接。
具体步骤
1. 初始化全局数组(存所有类型的汇总)
在报表的报表页眉里新建一个公式(命名为InitGlobalArrays),用来初始化存储汇总的数组:
WhilePrintingRecords; // 声明全局数组,分别存类型名称和三个面积的汇总 Global StringVar Array type_names; Global NumberVar Array sum_area1; Global NumberVar Array sum_area2; Global NumberVar Array sum_area3; // 初始化空数组,避免旧数据干扰 type_names := []; sum_area1 := []; sum_area2 := []; sum_area3 := [];
把这个公式拖到报表页眉里,位置随便,只要能执行就行(可以把字体设成白色隐藏它)。
2. 收集每个房间类型的汇总值
在房间类型组的页脚里新建一个公式(命名为CollectTypeSummary),把当前类型的汇总数据添加到数组里:
WhilePrintingRecords; Global StringVar Array type_names; Global NumberVar Array sum_area1; Global NumberVar Array sum_area2; Global NumberVar Array sum_area3; // 把当前类型的名称和汇总值追加到数组末尾 type_names := type_names + {你的房间类型字段}; sum_area1 := sum_area1 + Sum({面积1字段}, {房间类型字段}); sum_area2 := sum_area2 + Sum({面积2字段}, {房间类型字段}); sum_area3 := sum_area3 + Sum({面积3字段}, {房间类型字段});
然后把这个公式拖到房间类型组的页脚,同时隐藏这个组页脚(在节专家里勾选“Suppress (No Drill-Down)”),因为我们不需要在这里显示汇总了。
3. 在父组页脚用子报表输出汇总行
这一步是关键,让汇总和主表格无缝衔接:
- 新建一个空白子报表(不要绑定数据源),命名为
TypeSummaryFooter。 - 在子报表的报表页眉里新建一个公式,用来读取主报表的全局数组:
WhilePrintingRecords; Global StringVar Array type_names; Global NumberVar Array sum_area1; Global NumberVar Array sum_area2; Global NumberVar Array sum_area3; - 在子报表的详细节里,创建4个公式分别显示类型名称和三个汇总值:
- 类型名称公式:
WhilePrintingRecords; Global StringVar Array type_names; type_names[CurrentRowIndex]; - 面积1汇总公式:
WhilePrintingRecords; Global NumberVar Array sum_area1; sum_area1[CurrentRowIndex]; - 同理创建面积2、面积3的汇总公式。
- 类型名称公式:
- 让子报表的详细节重复对应次数:打开子报表的节专家,选中详细节,点击“Repeat Section”旁边的公式按钮,输入:
WhilePrintingRecords; Global StringVar Array type_names; UBound(type_names); // 返回数组的长度,也就是要显示的汇总行数 - 调整子报表的格式:把四个公式和主表格的列对齐,设置和主表格完全一致的边框线条(比如主表格每列有下边框,子报表的列也加相同的下边框),这样看起来就像主表格的一部分。
- 把这个子报表拖到父组(房间号/楼层组)的页脚里,放在主表格的下方,和列对齐。
注意事项
- 一定要用
Global变量,不能用Local,这样主报表和子报表才能共享数组数据。 - 确保房间类型的分组是正确的,否则汇总值会出错。
- 如果数组为空(比如没有数据),可以在子报表里加个条件判断,显示“无汇总数据”之类的提示。
这样操作后,就能实现你想要的效果:先显示所有房间的数据,最后在表格末尾统一列出各类型的汇总,而且完全是表格的一部分,线条连贯。
内容的提问来源于stack exchange,提问作者Apache




