首页 > 解决方案 > 此代码对字段中没有值的记录给出错误,但对在字段中具有值的记录给出良好的结果

问题描述

我想从 Microsoft Dynamics CRM 365 for SSRS 中检索数据。因此,我在 Visual Studio 和 CRM 之间建立了一个链接,以准备一个 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了一个非空字符串的字段,它给出了很好的结果!

编辑:我尝试在计算字段中的多个函数中剪切大函数,所以我成功地隔离了问题:我认为这种语言预先计算了条件的所有路径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)

标签: reporting-servicesdynamics-crmssrs-2012rdl

解决方案


有两种解决方案,我们可以使用自定义代码或纯 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 上运行!


推荐阅读