我想从 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 代码来完成此操作。
- 点击“构想”(如果您已经这样做了,请转到下一步)
- 转到顶部的工具栏
- 转至报告 ► 报告属性 ► 代码(位于左侧工具栏上)
然后粘贴此代码:
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/