Crystal Reports XI预览时平均时间公式异常问题咨询
Crystal Reports XI分组平均时长公式异常问题排查与解决
问题背景
使用Crystal Reports XI创建分组平均时长计算逻辑,前两页预览正常,到第3页时,秒数转HH:MM格式的公式出现异常,且@Average公式被高亮提示错误。
当前使用的公式
- 平均时长(HH:MM格式)公式
CStr(int({@Average} / 86400), "0") + ":" + CStr(CTime({@Average} / 86400), "mm:ss")
(注:原公式末尾存在多余的-符号,属于输入错误)
- Average公式
{@total in seconds}/{@@display}
- total in seconds公式
hour({@Total time Time}) * 3600 + minute({@Total time Time}) * 60 + second({@Total time Time})
- Total Time Time公式
Time({@sum by group})
- sum by group公式
SUM(({@Time}),{RP_CON_JOB.JOB})
核心原因
- 除以0错误:第3页的目标分组中,
@@display(分组内记录数)的值为0或空,导致@Average公式计算时触发除以0的错误,引发公式高亮,进而导致后续格式转换逻辑失效。 - 时间函数范围限制:
CTime函数仅接受0-1之间的数值(代表一天内的时间比例),当@Average对应的总秒数超过86400(1天),或因前面的错误产生无效值时,CTime无法正常处理,导致格式转换异常。 - 总时长计算精度丢失:
Time()函数会自动将超过24小时的时长取模到0-24小时区间,导致total in seconds计算的是取模后的时间秒数,而非分组内实际累计的总时长,错误积累到第3页分组时触发异常。
解决方法
1. 修复除以0问题
修改@Average公式,增加对除数为0的判断:
If {@@display} = 0 Or IsNull({@@display}) Then 0 Else {@total in seconds}/{@@display}
2. 修正时长格式转换逻辑
替换原格式转换公式,避免依赖CTime处理超24小时的时长,直接计算小时、分钟:
Local NumberVar totalSec := {@Average}; Local NumberVar hours := Int(totalSec / 3600); Local NumberVar minutes := Int((totalSec Mod 3600) / 60); CStr(hours, "00") + ":" + CStr(minutes, "00")
(如果需要保留秒数,可追加+ ":" + CStr(totalSec Mod 60, "00"))
3. 修复总时长计算精度问题
跳过Time()函数的中间转换,直接累计分组内的时间秒数:
- 创建新的
sum total seconds公式(替代原sum by group+Total Time Time+total in seconds):
SUM( hour({@Time})*3600 + minute({@Time})*60 + second({@Time}), {RP_CON_JOB.JOB} )
- 同步更新
@Average公式:
If {@@display} = 0 Or IsNull({@@display}) Then 0 Else {@sum total seconds}/{@@display}
内容的提问来源于stack exchange,提问作者Darren Murtagh
相关产品推荐
相关产品推荐

