如何区分SSRS报表可见性变更与重载/过滤,避免自定义变量异常重置?
问题描述
我用自定义代码实现组总计的累加汇总,在报表页眉调用ResetTotal函数保证每次报表加载时变量从头累加。原本功能正常,但切换分组可见性时,总计会被重置为0;报表过滤后总计恢复正常,可再次展开分组时总计又会被重置为0。
组变量表达式:
= Code.Lookup_Sum(Code.SumLookup(LookupSet(Fields!BUTS_Name.Value, Fields!Attendee.Value, Fields!VisitsCount.Value, "Visits")))
自定义代码:
Function SumLookup(ByVal items As Object()) As Decimal If items Is Nothing Then Return Nothing End If Dim suma As Decimal = New Decimal() Dim ct as Integer = New Integer() suma = 0 ct = 0 For Each item As Object In items suma += Convert.ToDecimal(item) ct += 1 Next If (ct = 0) Then return 0 else return suma End Function Public Shared Total_Sum As Integer = 0 Public Function Lookup_Sum(ByVal value As Integer) As Integer Total_Sum = Total_Sum + value Return Total_Sum End Function Public Function ResetTotal() Total_Sum = 0 End Function
请问能否在函数或字段公式中区分分组可见性变更与报表重载/过滤操作,避免变量异常重置?
解决方案
核心问题原因
分组展开/折叠属于报表的局部渲染操作,此时报表会重新执行表达式和自定义代码,但不会触发报表页眉的ResetTotal执行。而你的Total_Sum是共享变量,局部渲染时所有组行的表达式会重新计算,导致累加逻辑重复执行,最终表现为总计异常重置。
可行解决方法
方法1:改用报表内置聚合函数替代自定义累加
放弃共享变量的自定义累加,直接用报表的RunningValue函数实现组级累加,它会自动处理可见性变更场景:
= RunningValue(Code.SumLookup(LookupSet(Fields!BUTS_Name.Value, Fields!Attendee.Value, Fields!VisitsCount.Value, "Visits")), Sum, "报表数据集名称")
将"报表数据集名称"替换为你实际的数据集名称即可,RunningValue会自动跟踪报表渲染上下文,不受分组可见性切换影响。
方法2:给共享变量增加渲染上下文标记
如果必须保留自定义代码,可通过标记区分首次加载/过滤(需要重置)和分组可见性变更(无需重置):
- 新增共享变量记录首次渲染状态:
Public Shared IsFirstRender As Boolean = True Public Shared Total_Sum As Integer = 0
- 修改
ResetTotal函数,仅在首次渲染或报表重载时重置:
Public Function ResetTotal() As Integer If IsFirstRender Then Total_Sum = 0 IsFirstRender = False End If Return Total_Sum End Function
- 在报表参数变更事件(过滤操作会触发)中,将
IsFirstRender重置为True,确保过滤后重新正确累加。
方法3:使用组级变量替代共享变量
把全局共享的Total_Sum改成组级变量:
- 在组属性中添加组变量
GroupTotal,初始值设为0。 - 修改组内累加表达式:
= Variables!GroupTotal.Value + Code.SumLookup(LookupSet(Fields!BUTS_Name.Value, Fields!Attendee.Value, Fields!VisitsCount.Value, "Visits"))
- 将该表达式结果赋值给组变量
GroupTotal(在组属性的变量设置中更新)。
这种方式的累加基于组的渲染上下文,切换可见性时报表会重新计算组内变量,但不会破坏全局累加逻辑,避免重置问题。
内容的提问来源于stack exchange,提问作者KimEberle
相关产品推荐
相关产品推荐

