Reporting services 此代码为记录提供了一个错误,该记录不';t在该领域没有价值,但对那些在该领域有价值的人给出了一个好的结果
我想从Microsoft Dynamics CRM 365 for SSRS检索数据。因此,我在VisualStudio和CRM之间建立了一个链接,以准备一个RDL文件,将其导入CRM。RDL文件将允许直接在CRM上生成报告 所以,我处理rdl文件,从某个字段中检索值,然后在许多函数中传递值,当字段为空时,它会给我一个错误,我不知道为什么。这是我的密码:Reporting services 此代码为记录提供了一个错误,该记录不';t在该领域没有价值,但对那些在该领域有价值的人给出了一个好的结果,reporting-services,dynamics-crm,ssrs-2012,rdl,Reporting Services,Dynamics Crm,Ssrs 2012,Rdl,我想从Microsoft Dynamics CRM 365 for SSRS检索数据。因此,我在VisualStudio和CRM之间建立了一个链接,以准备一个RDL文件,将其导入CRM。RDL文件将允许直接在CRM上生成报告 所以,我处理rdl文件,从某个字段中检索值,然后在许多函数中传递值,当字段为空时,它会给我一个错误,我不知道为什么。这是我的密码: = IIf( IsNothing(Fields!aric_getpartylist.Value) or Fields!aric_get
= 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)
)
如果字段,它将抛出一个错误!something.Value
为空,如果不是,它将抛出正确的值
因为事实上,在这种语言中,如果我这样做:Split(nothing,“@”).GetValue(1)
它会抛出一个错误,所以通过这个测试,它可能会证明这种语言可能预先计算了允许这个错误的路径,然后无论如何都会抛出错误,即使IIF没有进入带有Split(nothing,“@”)的路径。GetValue(1)
EDIT2:
我忘了说
Split(nothing,“@”).GetValue(0)
此代码不会与nothing
值崩溃。但是这段代码有:Split(nothing,“@”).GetValue(1)
我看到了问题,尽管解决方案将是一种奇怪的解决方法。。。您遇到的问题是,在SSRS中,整个IIF
表达式在执行时进行计算。这意味着,不管表达式的结果如何,它仍在尝试至少计算表达式的连接(拆分(…
部分),但它将只显示与条件匹配的部分
我建议——可能还有更好的方法——在这个字段的查询中使用ISNULL()
。类似ISNULL(aric_getpartylist,'Nothing')
的东西将接受任何空值,并简单地用字符串Nothing
替换它们。然后,您只需在SSRS中检查字段中的字符串“Nothing”(假设该字段通常不包含该字符串)
有两种解决方案,我们可以用自定义代码或纯SSRS语言来实现 第一个解决方案(自定义代码) 受这个问题的启发,我找到了一种方法,我们将使用Visual Basic代码来实现它
= 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 ")
)
)
公共函数有效(ByVal str作为字符串)作为字符串
如果(str=Nothing或str=“”或str=“@”),则
一无所获
其他的
如果(str.Split(“@”).GetValue(1)=”或str.Split(“@”).GetValue(1)=无),则
返回“ReaUu Par:”+联接((GetValue)(0))(Split)
其他的
返回“ReaUu Par:”+联接((GetValue)(S.S.分裂(“@”))(Split(“y”),“et”)+“AcCONGAN EDE”+“ReaCuüPar:”+ +((S.Seple S分裂(“@”). GetValue(1)). Split(“y”),“et”)
如果结束
如果结束
端函数
然后在计算字段中更改函数并将其放入:
= Code.Valid(Fields!aric_getpartylist.Value)
建议:
计算字段的控制台可能会给出一个错误,但不用担心,只要测试一下就可以了!如果您使用MS CRM DYNAMICS 365,它可能不会工作,因为您需要从配置文件中禁用rdl沙箱。(查看文档以了解如何做)
第二种解决方案(纯ssrs代码)
我们可以隔离这个问题,它在这一行中断:Split(Fields!aric_getpartylist.Value,“@”).GetValue(1)
,因为这个字段是null
soSplit(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 ")
)
)
然后将主体字段中的计算字段与以下代码一起使用:
= 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上运行!我只使用SSRS RDL语言,所以不能使用ISNULL,因为我无法处理CRM记录后面的表……也许SSRS中有某种东西允许这样做,但现在我不知道如何在这里面使用SQL命令interface@bosskay972也许是一个计算过的场w如果值为
=IIF(IsNothing(Fields!aric_getpartylist.value),“Nothing”,Fields!aric_getpartylist.value)
?它会给我相同的结果:/也许我也需要计算此行:拆分(Fields!notnull.value,“@”).GetValue(1)=“
@bosskay972您的问题中的表达式中没有包含这一行,但是是的,这可能会有所帮助。如果我可以添加我的2美分,实际上您的表达式看起来很好。您是否可以检查字段的值是否为null或空!aric_getpartylist.value字段是否属于您的上一个语句。我的意思是,与您的上一个IIF语句不同,请尝试sho如果它显示值,即前两个IIF不起作用,那么我们可以继续前进。类似这样的表达式也有助于=IIF(Len(Fields!aric_getpartylist.value)我只是测试了它,但它也不起作用。我认为这种语言预先计算了任何路径的结果,如果是,它会给出一个错误…是否有一个语句作为return
从IIF j中转义