按Area Manager分组计算含共享numbervar的两公式商的问题
问题描述
我正在制作自定义报表,需按Area Manager分组展示除法计算结果,预期效果如下:
| Area Manager | A/30=B | Total Age | Total DD |
|---|---|---|---|
| Peter | 654.000 | 123.000 | 5.31 |
| Peter | 653.000 | 122.000 | 5.35 |
| Peter | 652.000 | 121.000 | 5.38 |
其中:
- Total DD = 按Area Manager分组的
sum(A/30=B)÷sum(age) - Age列通过子报表实现,其余内容在主报表中
遇到的问题:
- 曾出现"division by zero"错误
- 当前
amt_ar(Total Age的共享变量)分组求和结果正确,但Total DD始终显示为0,00
现有公式:
- 主报表中
A/30=B的公式:{@Rev+Ppn}/30 - 子报表内累加Age的公式:
Whileprintingrecords; shared numbervar amt_ar:= amt_ar + Sum ({@amtagetotal}, {pmproj_seed.PROJECT})
- 主报表中计算Total DD的公式:
whileprintingrecords; numbervar amtdd; // variable to display dd numbervar a30; // variable to display a/30=b shared numbervar amt_ar; // variable to display Age amtdd:=a30/amt_ar;
- 组页脚展示
amt_ar的公式gf_amt_ar:
Whileprintingrecords; Shared numbervar amt_ar;
解决方案
1. 补全a30变量的分组求和赋值
当前计算公式仅声明了a30但未赋值为当前分组的sum(A/30=B),这是Total DD为0的核心原因,修改计算公式:
Whileprintingrecords; numbervar amtdd; // 赋值为当前Area Manager分组的sum(A/30=B) numbervar a30 := Sum({@Rev+Ppn}/30, {你的Area Manager字段}); shared numbervar amt_ar; // 添加除零判断,避免报错 if amt_ar <> 0 then amtdd := a30 / amt_ar else amtdd := 0; // 也可赋值为null,按需调整
2. 重置跨组的共享变量
子报表的amt_ar是累加逻辑,会导致跨组时数值叠加,在Area Manager的组页眉添加重置公式:
Whileprintingrecords; shared numbervar amt_ar := 0;
3. 确认子报表放置与关联
子报表必须放在Area Manager的组页眉或组页脚,且需设置主报表与子报表的关联字段(Area Manager),确保仅计算当前分组内的Age总和。
4. 调整公式执行顺序
Crystal Reports的公式执行顺序影响结果,需保证:
- 组页眉的
amt_ar重置公式先执行 - 子报表的累加公式在组内数据处理完成后执行
- Total DD计算公式放在组页脚的子报表下方
内容的提问来源于stack exchange,提问作者Muhammad Hidayat
相关产品推荐
相关产品推荐

