RDLC报表求和组行中排除0获取最小值的实现方法
RDLC报表组行排除0取最小值的解决方案
你的问题出在嵌套IIf的逻辑错误(比如最后分支笔误返回了错误字段),且这种写法维护性极差,同时直接用ReportItems可能导致组聚合时取值不准确。以下是更可靠的解决方法:
方法一:使用内置Min函数结合条件过滤
直接用Min函数对非0值取最小,优先改用数据源字段而非ReportItems(ReportItems是渲染后的控件值,组聚合场景下原始字段更可靠):
=Min( IIF(Fields!x7.Value <> 0, Fields!x7.Value, Nothing), IIF(Fields!x8.Value <> 0, Fields!x8.Value, Nothing), IIF(Fields!x9.Value <> 0, Fields!x9.Value, Nothing), IIF(Fields!x10.Value <> 0, Fields!x10.Value, Nothing), IIF(Fields!x11.Value <> 0, Fields!x11.Value, Nothing), IIF(Fields!x12.Value <> 0, Fields!x12.Value, Nothing) )
Nothing会被Min函数自动忽略,实现排除0值后取剩余值的最小值。
方法二:自定义代码(更灵活,适合复杂场景)
- 打开报表的报表属性 → 代码标签,添加以下VB代码:
Function GetMinExcludingZero(ByVal ParamArray values() As Object) As Object Dim minVal As Object = Nothing For Each val As Object In values If val IsNot Nothing AndAlso val <> 0 Then If minVal Is Nothing OrElse val < minVal Then minVal = val End If End If Next Return minVal End Function
- 在组行的表达式中调用该函数:
=Code.GetMinExcludingZero(Fields!x7.Value, Fields!x8.Value, Fields!x9.Value, Fields!x10.Value, Fields!x11.Value, Fields!x12.Value)
原表达式的问题说明
- 最后一层
IIf存在笔误:判断的是x10s.Value,但返回的是ReportItems!x9s.Value,直接导致逻辑错误 - 嵌套
IIf的逻辑是逐个判断当前值是否为全局最小,一旦有多个非0值,很容易因条件不满足走到最后分支返回x11s,若x11s为0则返回0 - 使用
ReportItems而非数据源字段,组聚合时可能无法正确获取原始数据的聚合值
内容的提问来源于stack exchange,提问作者Hussein Mokhtar
相关产品推荐
相关产品推荐

