我在Report Builder 3.0中构建了一个报告,它有几百个单元在我的数据集中执行查找功能。显然,随着单元格的数量,我希望能够动态创建表达式。我已经能够利用文本框名称来执行以下功能:
Public Function TextBoxName(ByVal meString As String) As String
Dim s As Integer = 19
Dim e As Integer = meString.IndexOf(“_TextBoxExprHost”) – 19
TextBoxName = meString.Substring(s,e)
End Function
Expression:
=Code.TextBoxName(Me.ToString)
除非我想在Lookup函数的源表达式中使用它,否则上述表达式在报表中的所有位置都可以正常工作。这是一个例子:
Iif(IsNothing(Lookup((Code.TextBoxName(Me.ToString) & "R"),Fields!SECTION_STATUS.Value,Fields!LCTN_COUNT.Value, "Loads")),"0",Lookup((Code.TextBoxName(Me.ToString) & "R"),Fields!SECTION_STATUS.Value,Fields!LCTN_COUNT.Value, "Loads"))
上面的例子将编译但在我运行报告时在单元格中产生#Error。但是,如果我对每个源表达式的文本框名称进行硬编码,则报告将按需运行。
"AP1010R" instead of Code.TextBoxName(Me.ToString) & "R"
我没有找到使用自定义代码生成此源表达式的任何人的示例。任何人都有什么想法可以在这里发生什么?提前谢谢。
答案 0 :(得分:0)
实际上问题不在于源表达式中的自定义代码(尝试一个只返回字符串并且工作正常的简单自定义函数),但特别是Me.ToString
部分。我的猜测是Me
试图在查找内部引用错误的对象。
我还没有找到Me
的详细用法,但可能的解决方法是编写自己的自定义查找功能,这在this MSDN forum post中很详细。它的要点(使用Lookup function术语):
添加自定义代码:
Function CustomLookup(id AS String) AS String
Dim i As Integer
i = 0
For i = 1 to Report.Parameters!YourParameter.Count()
If Report.Parameters!YourParameter.Value(i) = id Then
CustomLookup = Report.Parameters!YourParameter.Label(i)
Exit For
End If
Next i
End Function
称之为:=Code.CustomLookup(Code.TextBoxName(Me.ToString) & "R")
这可能不够可行/不足(特别是如果您的查找数据集很大和/或目标和结果表达式列在各种查找中发生了很大变化),但它在某些情况下可以很好地工作。