SSRS Report Builder 3.0 - 为什么我不能使用代码函数作为查找函数的源表达式?

时间:2015-03-27 15:43:07

标签: sql-server-2008 reporting-services reportbuilder3.0

我在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"

我没有找到使用自定义代码生成此源表达式的任何人的示例。任何人都有什么想法可以在这里发生什么?提前谢谢。

1 个答案:

答案 0 :(得分:0)

实际上问题不在于源表达式中的自定义代码(尝试一个只返回字符串并且工作正常的简单自定义函数),但特别是Me.ToString部分。我的猜测是Me试图在查找内部引用错误的对象。

我还没有找到Me的详细用法,但可能的解决方法是编写自己的自定义查找功能,这在this MSDN forum post中很详细。它的要点(使用Lookup function术语):

  1. 创建隐藏的多值参数
  2. 将可用值和默认值设置为destination_expression列;将标签设置为result_expression列
  3. 添加自定义代码:

    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
    
  4. 称之为:=Code.CustomLookup(Code.TextBoxName(Me.ToString) & "R")

  5. 这可能不够可行/不足(特别是如果您的查找数据集很大和/或目标和结果表达式列在各种查找中发生了很大变化),但它在某些情况下可以很好地工作。