SSRS聚合求和时自定义Shared变量翻页重置与重复累加问题求助
解决方案
核心问题原因
Shared修饰的变量是类级静态变量,服务进程内所有报表请求、所有用户共享该值,因此会出现跨访问累加的问题;而非Shared的实例级变量默认会在报表分页重新渲染时重置,所以需要配合报表生命周期事件和逻辑调整解决。
方案1:推荐方案(无并发风险,满足所有需求)
1. 替换自定义代码
' 存储当前分组累计值 Dim CurrentGroupTotal As Decimal ' 存储所有分组的全局总计 Dim GlobalTotal As Decimal ' 报表初始化时清空所有累计值 Public Function Initialize() CurrentGroupTotal = 0 GlobalTotal = 0 End Function ' 行级计算调用:传入当前行数值、当前分组唯一标识 Public Function GetValue(ByVal value As Decimal, ByVal groupKey As String) As Decimal CurrentGroupTotal += value GlobalTotal += value Return CurrentGroupTotal End Function ' 分组尾调用:返回当前分组合计,同时重置分组累计值 Public Function ResetGroupTotal() As Decimal Dim groupTotal = CurrentGroupTotal CurrentGroupTotal = 0 Return groupTotal End Function ' 全局总计行调用:返回全部分组总和 Public Function GetGlobalTotal() As Decimal Return GlobalTotal End Function
2. 配置报表初始化事件
打开报表属性→「事件」面板,在OnInit事件中填入表达式:=Code.Initialize()
该配置会保证每次报表加载、刷新、翻页时自动重置所有累计值,解决非Shared变量翻页重置的问题。
3. 替换单元格表达式
- 分组内行的累计值:
=Code.GetValue(Fields!你要统计的字段名.Value, Fields!分组字段名.Value) - 分组尾的分组合计值:
=Code.ResetGroupTotal() - 所有分组后的全局总计值:
=Code.GetGlobalTotal()
方案2:兼容原有代码的简易方案
如果不想大幅修改原有逻辑,可保留Shared修饰,只需新增两处初始化调用即可解决重复累加问题:
- 在报表最顶部添加一个隐藏的文本框,表达式设为
=Code.Initialize(),保证每次打开页面、刷新、翻页时先重置Total初始值 - 在每个分组的分组尾添加一个隐藏的文本框,表达式设为
=Code.Initialize(),实现每个分组结束后自动重置Total值
注意:该方案存在多用户并发访问时数据串扰的风险,仅适合单用户使用的小型报表场景。
内容的提问来源于stack exchange,提问作者Surya Prakash
相关产品推荐
相关产品推荐

