Crystal Reports:基于RepCt值切换交叉表与普通报表的问题
解决Crystal Reports中过滤取消记录后报表显示异常的问题
核心问题分析
你当前的统计逻辑包含了STATUS='X'的取消记录,导致Count({repCt})和Maximum({repCt})无法准确反映每组(按Name分组)内有效记录的实际情况,进而让交叉表/普通报表的抑制规则失效。
方案一:使用Running Total(推荐)
通过Crystal Reports自带的Running Total功能,精准统计每组内的有效记录数据:
创建统计有效记录数的Running Total
- 名称:
RT_Valid_Record_Count - 字段选择:
{repCt} - 类型:计数
- 评估条件:
{table.STATUS} <> 'X' - 重置条件:组更改(Name分组)
- 名称:
创建统计有效记录最大RepCt的Running Total
- 名称:
RT_Valid_Max_RepCt - 字段选择:
{repCt} - 类型:最大值
- 评估条件:
{table.STATUS} <> 'X' - 重置条件:组更改(Name分组)
- 名称:
设置报表抑制规则
- 交叉表的抑制公式:
RT_Valid_Max_RepCt <= 1 - 普通报表的抑制公式:
RT_Valid_Max_RepCt > 1 OR RT_Valid_Record_Count = 0
- 交叉表的抑制公式:
方案二:使用自定义变量统计
如果更习惯用自定义变量控制,按以下步骤设置:
- 组页眉初始化变量(添加到Name组的页眉区域)
WhilePrintingRecords; NumberVar valid_count := 0; NumberVar max_repct := 0; ""
- 组明细统计有效记录(添加到明细区域)
WhilePrintingRecords; NumberVar valid_count; NumberVar max_repct; If {table.STATUS} <> 'X' Then ( valid_count := valid_count + 1; If {repCt} > max_repct Then max_repct := {repCt}; ); ""
- 设置抑制公式
- 交叉表抑制:
WhilePrintingRecords; NumberVar max_repct; max_repct <= 1 - 普通报表抑制:
WhilePrintingRecords; NumberVar max_repct; NumberVar valid_count; max_repct > 1 OR valid_count = 0
- 交叉表抑制:
关键说明
两种方案都是先严格过滤取消记录,再基于Name分组统计有效数据,确保抑制规则能准确判断当前组应该显示交叉表还是普通报表,同时处理了无有效记录时的隐藏逻辑。
内容的提问来源于stack exchange,提问作者hg05
相关产品推荐
相关产品推荐

