【问题标题】:SSRS 2016 "Function doesn't return a value on all code paths"SSRS 2016“函数不会在所有代码路径上返回值”
【发布时间】:2017-10-05 19:21:56
【问题描述】:

我正在恢复一些报告。为此,我必须使用以下方法获取并重新创建 RDL 文件:Where does a published RDL file sit

我正在从另一个线程中获取查询的输出,将结果另存为(正如一位评论者指出的那样,否则您可能无法获得所有数据),然后在文本编辑器中打开它以去除一些垃圾字符开头,并用一个双引号替换一行中的两个双引号,然后将 RDL 文件上传到报表服务器。

到目前为止,这一直适用于没有任何自定义函数的报告 - 但是,一旦我得到一个带有 SumLookup 和 AvgLookup 函数的报告,我就会收到以下错误:

发生错误。

编译表达式时发生意外错误。本机编译器返回值:'[BC42353] 函数 'AvgLookup' 不会在所有代码路径上返回值。您是否缺少“退货”声明?

我之前用谷歌搜索过的原始 AvgLookup 函数到目前为止一直运行良好:

Function AvgLookup(ByVal items As Object()) As Decimal
If items Is Nothing Then
    Return Nothing
End If
Dim suma As Decimal = 0
Dim avga As Decimal = 0
Dim counta As Integer = 0
For Each item As Object In items
    If Not item Is Nothing Then

    counta += 1

    suma += Convert.ToDecimal(item)
    End If
Next
If counta > 0 Then
    avga = suma / counta
Else
    avga = 0
End If
Return avga
End Function

我尝试用一​​个简单的函数替换它,它只返回 1:

Function AvgLookup(ByVal items As Object()) As Decimal
Return 1
End Function

但这给了我同样的错误。

到目前为止,我搜索的所有内容似乎都涉及一个实际上并不总是有返回值的函数,所以我有点茫然,简单的“返回 1”函数给出了相同的错误。

我能想到的就是从 RDL 文件中删除所有自定义代码以及对这些函数的任何引用,然后在上传后替换它们。是否有其他解决方案?

【问题讨论】:

  • 这行得通吗?函数 AvgLookup() 作为十进制返回 1 结束函数
  • 我很欣赏您的回复 - 刚刚尝试过并得到了同样的错误。我最终做了什么:从 .rdl 中删除函数,搜索并将“Code.AvgLookup”替换为“AVg”(注意大写),上传此文件,在 Report Builder 中添加 AvgLookup 函数,下载 .rdl,搜索并将“AVg”(区分大小写)替换为“Code.AvgLookup”,重新上传。我没有太多使用此功能的报告,因此没什么大不了的。但我很想知道为什么会发生这种情况,这似乎很奇怪。
  • 嗯,我会尝试的最后一件事。看看你的 ui 逻辑中是否有一些奇怪的边缘情况转换。尝试使用 As String 作为结果并返回“1”。如果这没有产生任何更实质性的结果,那么是的,我会从 ssrs 中删除现有的 .rdl 并重新部署。
  • 略有不同的错误与字符串并返回“1”,但基本相同:An unexpected error occurred while compiling expressions. Native compiler return value: ‘[BC42105] Function 'AvgLookup' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.’.
  • 也许使用了 Public 修饰符?公共函数 AvgLookup(...)

标签: reporting-services ssrs-2016


【解决方案1】:

所以我最终找到了问题所在。

基本上,从报表服务器检索报表文件的实际代码的查询将代码全部放在一行中。函数需要将每个命令放在一个新行上。当我编辑 RDL 文件时,我将函数全部保留在同一行。

所以我吸取了教训,在寻求帮助时粘贴准确的代码,而不是创建新行以提高可读性,因为这可能已经解决了问题要早得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多