此代码为在该字段中没有值的记录提供错误,但为那些在该字段中有价值的记录提供良好的结果

This code give an error for record which doesn't have value in the field but give a good result for those which have value in the field

我想从 Microsoft Dynamics CRM 365 for SSRS 检索数据。所以我在visual studio和CRM之间做了一个link准备一个RDL文件导入到CRM中。 RDL 文件将允许直接在 CRM 上生成报告。

所以,我处理 rdl 文件并从某个字段中检索值,然后我将值传递给许多函数,当字段为空时它给我一个错误,我不知道为什么。这是我的代码:

= IIf(
    IsNothing(Fields!aric_getpartylist.Value) or Fields!aric_getpartylist.Value = "" or Fields!aric_getpartylist.Value = "@" or Fields!aric_getpartylist.Value = " " or Fields!aric_getpartylist.Value = "@@",
    nothing,
    IIf(
        Split(Fields!aric_getpartylist.Value,"@").GetValue(1) = "",
        "Reçu par : " & Join(Split(Split(Fields!aric_getpartylist.Value,"@").GetValue(0),"|")," et "),
        "Reçu par : " & Join(Split(Split(Fields!aric_getpartylist.Value,"@").GetValue(0),"|")," et ") & " accompagné de " & Join(Split(Split(Fields!aric_getpartylist.Value,"@").GetValue(1),"|")," et ")
        )
    )

在具有像这样的空字符串的字段上 "" 它给出 #ERROR 而具有非空字符串的字段它给出了好的结果 !

编辑: 我尝试在 calculate 字段的 multiple function 中切割 big function,所以我成功地隔离了问题: 我认为这种语言会预先计算条件 IIF 的所有路径。因为如果我这样做:

=IIf(
    IsNothing(Fields!something.Value),
    nothing,
    Split(Fields!something.Value,"@").GetValue(1)
)

如果 Fields!something.Value 什么都不是,它将抛出一个错误,如果不是,它将抛出正确的值。

因为实际上在这种语言中如果我这样做:Split(nothing,"@").GetValue(1) 它会抛出一个错误,所以通过这个测试它可能证明这种语言可能预先计算了允许这个错误的路径然后无论如何抛出错误即使 IIF 没有进入带有 Split(nothing,"@").GetValue(1)

的路径

EDIT2: 我忘了说 Split(nothing,"@").GetValue(0) 此代码不会因 nothing 值而崩溃。但是这段代码可以:Split(nothing,"@").GetValue(1)

我看到了问题,尽管解决方案会有点奇怪...您遇到的问题是在 SSRS 中,整个 IIF 表达式在计算时被计算被执行。这意味着无论表达式的结果如何,它仍然试图至少计算等式的 Join(Split(Split(... 部分,但它只会显示与条件匹配的部分。

我建议——可能还有更好的方法——是在该字段的查询中使用 ISNULL()ISNULL(aric_getpartylist, 'Nothing') 之类的东西将采用任何 NULL 值并简单地将它们替换为字符串 Nothing。然后,您可以简单地检查 SSRS 中的字段中的字符串 "Nothing"(假设该字段通常不会包含该字符串)。

IIf(
Fields!aric_getpartylist.Value = "Nothing",
Nothing,
IIf(
    Fields!aric_getpartylist.Value = "Nothing",
    Nothing,
    IIf(
        Split(Fields!aric_getpartylist.Value,"@").GetValue(1) = "",
        "Reçu par : " & Join(Split(Split(Fields!aric_getpartylist.Value,"@").GetValue(0),"|")," et "),
        "Reçu par : " & Join(Split(Split(Fields!aric_getpartylist.Value,"@").GetValue(0),"|")," et ") & " accompagné de " & Join(Split(Split(Fields!aric_getpartylist.Value,"@").GetValue(1),"|")," et ")
        )
    )
)

有 2 种解决方案,我们可以使用自定义代码或纯 SSRS 语言来实现。

第一个解决方案(自定义代码)

受到这个问题的启发我找到了一种方法。我们将使用 Visual Basic 代码来完成它。

  1. 点击构思(如果您已经这样做,请转到下一步)
  2. 转到顶部的工具栏
  3. 转到报表 ► 报表属性 ► 代码(在左侧工具栏上)

然后粘贴此代码:

Public Function Valid(ByVal str As String) As String
    If (str = Nothing or str = "" or str = "@") Then
        Return Nothing
    Else
        If (str.Split("@").GetValue(1) = "" or str.Split("@").GetValue(1) = Nothing) Then
            Return "Reçu par : " + Join((str.Split("@").GetValue(0)).Split("|"), " et ")
        Else
            Return "Reçu par : " + Join((str.Split("@").GetValue(0)).Split("|"), " et ") + " accompagné de " + "Reçu par : " + Join((str.Split("@").GetValue(1)).Split("|"), " et ")
        End If
    End If
End Function

然后在计算字段中更改函数并输入:

    = Code.Valid(Fields!aric_getpartylist.Value)

建议: 计算字段的控制台可能会报错,但不要担心,只需对其进行测试就可以了!如果您使用 MS CRM DYNAMICS 365,它可能无法工作,因为您需要从配置文件中禁用 rdl 沙箱。 (查看文档以了解如何操作)

第二种解决方案(纯 ssrs 代码)

我们可以隔离问题,它在这一行中断:Split(Fields!aric_getpartylist.Value,"@").GetValue(1) 因为该字段是 null 所以 Split(nothing,"@") 可能等于一个只有一个元素的数组:null 所以没有第二个元素所以这是有效的: Split(Fields!aric_getpartylist.Value,"@").GetValue(0) 但这不起作用: Split(Fields!aric_getpartylist.Value,"@").GetValue(1) 所以你需要确保这个由 Split 生成的数组至少有 2 个元素。因此,为了解决这个问题,我只需使用以下代码添加一个计算字段:

= Fields!aric_getpartylist.Value & "@"

然后使用此代码在主字段中使用计算字段:

= IIf(
    IsNothing(Fields!prerecu.Value) or Fields!prerecu.Value = "" or Fields!prerecu.Value = "@" or Fields!prerecu.Value = " " or Fields!prerecu.Value = "@@",
    nothing,
    IIf(
        Split(Fields!prerecu.Value,"@").GetValue(1) = "",
        "Reçu par : " & Join(Split(Split(Fields!prerecu.Value,"@").GetValue(0),"|")," et "),
        "Reçu par : " & Join(Split(Split(Fields!prerecu.Value,"@").GetValue(0),"|")," et ") & " accompagné de " & Join(Split(Split(Fields!prerecu.Value,"@").GetValue(1),"|")," et ")
        )
    )

它甚至应该可以在 Microsoft CRM Dynamics 365 上运行!