reporting-services - 此代码对于字段中没有值的记录给出错误,但对于字段中具有值的记录给出良好的结果

标签 reporting-services dynamics-crm ssrs-2012 rdl

我想从 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)

进入路径,仍会抛出错误

编辑2: 我忘了说 Split(nothing,"@").GetValue(0) 此代码不会因 nothing 值而崩溃。但此代码执行以下操作: Split(nothing,"@").GetValue(1)

最佳答案

有两种解决方案可以做到这一点,我们可以使用自定义代码或使用 PURE SSRS 语言来实现。

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

受到这个问题的启发here我找到了一种方法来做到这一点。我们将使用 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 code> 所以 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 上运行!

关于reporting-services - 此代码对于字段中没有值的记录给出错误,但对于字段中具有值的记录给出良好的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57394500/

相关文章:

c# - 使用 DefaultIfEmpty 时出现 LINQ 错误

vb.net - 是否可以仅部署使用 RS.exe 更改的报告?

reporting-services - Visual Studio 报告设计器 2015 未正确构建到目标服务器版本

reporting-services - 基于列值的渐变填充

c# - 从 Windows 窗体应用程序以横向模式打印 SSRS 报告

javascript - SSRS : Action "Go to URL" not working after applied to data cell in matrix

reporting-services - 饼图中的重叠标签

javascript - 使用动态过滤器在新窗口中打开 View

reporting-services - 用户 '%' 没有所需的权限,Windows 7 上的 SSRS 2012

dynamics-crm - 在同一台机器上运行 2 个 Microsoft 统一服务台实例