SSRS嵌入式代码调用Lookup函数报错及相关开发文档查询问询
问题原因
- SSRS表达式编辑器里的Text、Math、Miscellaneous等分类只是UI层对内置函数的逻辑分组,不是实际存在的VB.NET类或命名空间。你之前测试能调用
Math.Floor是因为Math是VB.NET的原生标准类,刚好和UI分组的Math分类重名了,不代表其他分类的函数都能通过分类名调用。 - Lookup属于SSRS专属的报表上下文函数,仅支持直接写在RDL报表的控件/属性表达式中,不支持在嵌入式VB代码块内直接调用。
解决方法
方法1:直接在表达式中调用Lookup(最简便)
不需要封装进自定义代码,直接在需要用到该逻辑的报表属性处写表达式即可:=Lookup(1,1,"holaInLookup","DataSet1")
方法2:把Lookup结果作为参数传入自定义函数
如果你需要对Lookup的返回结果做额外的自定义逻辑处理,可以把Lookup的调用放在参数位,传入你写的自定义函数:
自定义代码示例:
Public Function ProcessLookupValue(ByVal x As Integer, ByVal lookupResult As Object) As String If x = 1 Then Return Math.Floor(1) & lookupResult.ToString() Else Return "2" & lookupResult.ToString() End If End Function
报表表达式调用示例:=Code.ProcessLookupValue(1, Lookup(1,1,"holaInLookup","DataSet1"))
方法3:自定义代码内实现查找逻辑
如果确实需要完全在嵌入式代码内完成查找,可以预先把数据集的对应字段存入全局字典,后续直接查询字典:
' 全局存储查找映射 Dim lookupMap As New System.Collections.Hashtable ' 初始化映射,需要在报表加载时先调用一次该函数传入数据集的对应字段 Public Sub InitLookupMap(ByVal keyList As Object(), ByVal valueList As Object()) For i As Integer = 0 To keyList.Length - 1 If Not lookupMap.ContainsKey(keyList(i)) Then lookupMap.Add(keyList(i), valueList(i)) End If Next End Sub ' 自定义查找函数 Public Function CustomLookup(ByVal key As Object) As Object If lookupMap.ContainsKey(key) Then Return lookupMap(key) End If Return Nothing End Function
文档说明
SSRS嵌入式代码的可用API仅包含标准VB.NET运行时库、以及SSRS暴露的Report、Fields等报表上下文对象,报表专属内置函数仅可在表达式中直接使用,该规则在SSRS官方开发文档的「自定义代码和表达式参考」章节有明确说明。
内容的提问来源于stack exchange,提问作者Oscar Copado
相关产品推荐
相关产品推荐

