在SSRS/RDLC中添加LookupSet表达式导致结果出现重复行问题
问题描述
现有RDLC报表初始数据(如图所示),需求是按B列分组对D列值求和。
使用表达式 Code.SumLookup(LookupSet(Fields!B.Value,Fields!B.Value,Fields!D.Value,"dsData")) 搭配自定义SumLookup函数后,出现行重复、行丢失的异常;用Join函数调试时也存在相同问题,期望得到正确分组求和结果。
自定义函数代码如下:
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
问题原因
核心问题在于未结合正确的报表分组结构使用LookupSet:
- 若直接在明细行调用
LookupSet,每一行都会重复执行分组匹配逻辑,导致同一分组的求和结果在多行重复显示,表现为行重复; - 若报表未按
B列配置行组,或数据集排序与分组逻辑冲突,会导致LookupSet无法正确匹配全部分组数据,进而出现行丢失的异常。
解决方案
方案1:利用RDLC内置分组功能(推荐)
- 选中报表的数据区域(如Tablix),右键选择添加组 > 行组 > 父组;
- 分组字段选择
Fields!B.Value,勾选「添加组头」或「添加组尾」(推荐在组尾放置求和值); - 在组尾的单元格中,直接使用内置求和表达式:
Sum(Fields!D.Value),RDLC会自动按分组计算求和,无需自定义函数。
方案2:修复自定义函数+正确使用LookupSet
若必须使用LookupSet,需先配置正确分组,再优化函数:
- 简化并优化
SumLookup函数:
Function SumLookup(ByVal items As Object()) As Decimal If items Is Nothing OrElse items.Length = 0 Then Return 0D End If Dim suma As Decimal = 0D For Each item As Object In items suma += Convert.ToDecimal(item) Next Return suma End Function
- 确保Tablix已按
B列设置行组,仅在组头/组尾单元格中使用表达式:Code.SumLookup(LookupSet(Fields!B.Value, Fields!B.Value, Fields!D.Value, "dsData")),禁止在明细行中调用该表达式。
内容的提问来源于stack exchange,提问作者CuriousCoder
相关产品推荐
相关产品推荐

