reporting-services - 此代码对字段中没有值的记录给出错误,但对在字段中具有值的记录给出良好的结果
问题描述
我想从 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)
解决方案
有两种解决方案,我们可以使用自定义代码或纯 SSRS 语言来完成。
第一个解决方案(自定义代码)
受这个问题的启发,我找到了一种方法来做到这一点。我们将使用 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
可能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 上运行!
推荐阅读
- node.js - 使用 KMS、Node 从 S3 解密 SES 消息
- ios - 在启动屏幕中禁用智能反转
- tkinter - 在谷歌云平台中使用 tkinter 时出现错误消息
- python - CUDA/pycuda - 在带有参数向量的经典函数上实现 GPU“映射”函数
- python-2.7 - 如何在python中忽略异常并继续循环?
- django - Django - 名称“标题”未定义
- wordpress - 设置 the_query 后将 wp_query 限制为 post_status 发布
- ios - Fastlane 扫描显示零单元测试
- vb.net - 在空白处单击时取消选择列表框中的项目
- java - 如何通过 Spark 2.1 在 Java 中使用 lambda flatMap()