Crystal reports Crystal Report返回空白,此时预期返回应为日期

Crystal reports Crystal Report返回空白,此时预期返回应为日期,crystal-reports,Crystal Reports,我正试图利用数据库中的一些自定义字段让Crystal返回一些相关的日期。当每条记录都包含数据时,逻辑就工作了。但是,一旦我将一个记录的自定义字段留空,它就会中断 IIF( {PODetail.SpecialInstructions} = "" , {PO.PromisedDate} + 45 , IIF( {PODetail.SpecialInstructions} = "C1" , {PO._C1ETAPort} +10 , I

我正试图利用数据库中的一些自定义字段让Crystal返回一些相关的日期。当每条记录都包含数据时,逻辑就工作了。但是,一旦我将一个记录的自定义字段留空,它就会中断

IIF(    {PODetail.SpecialInstructions} = ""   , {PO.PromisedDate} + 45    , 
IIF(    {PODetail.SpecialInstructions} = "C1" , {PO._C1ETAPort} +10 , 
IIF(    {PODetail.SpecialInstructions} = "C2" , {PO._C2ETAPort} +10 ,
IIF(    {PODetail.SpecialInstructions} = "C3" , {PO._C3ETAPort} +10 ,
IIF(    {PODetail.SpecialInstructions} = "C4" , {PO._C4ETAPort} +10 ,
IIF(    {PODetail.SpecialInstructions} = "C5" , {PO._C5ETAPort} +10 ,
DATE(0,0,0) ))))))
见下文预期回报-

但是,如果我删除单个记录“C”值,则会出现以下情况。当“特殊指令”或_C*ETAPort字段留空时,也会出现同样的问题

发行-


我原以为这些空值会出现PromiseDate逻辑,而C1逻辑仍然存在。然而,它似乎在这里崩溃了。

我不确定这是否是最好的答案。然而,有时在使用IIF函数时,我没有收到预期的回报。而是使用IF-THEN-ELSE语句

IF ISNULL ( {PODetail.SpecialInstructions} ) 
THEN {PO.PromisedDate} + 45 
ELSE

IF {PODetail.SpecialInstructions} = "C1"
THEN {PO._C1ETAPort} + 10
ELSE

IF {PODetail.SpecialInstructions} = "C2"
THEN {PO._C2ETAPort} + 10
ELSE

IF {PODetail.SpecialInstructions} = "C3"
THEN {PO._C3ETAPort} + 10
ELSE

IF {PODetail.SpecialInstructions} = "C4"
THEN {PO._C4ETAPort} + 10
ELSE

IF {PODetail.SpecialInstructions} = "C5"
THEN {PO._C5ETAPort} + 10
ELSE

DATE (0,0,0)

我会考虑把这个公式改成一个case语句。它将更容易阅读和排除故障,同时简化您的逻辑

Select {PODetail.SpecialInstructions}
   Case "C1" : {PO._C1ETAPort} + 10
   Case "C2" : {PO._C2ETAPort} + 10
   Case "C3" : {PO._C3ETAPort} + 10
   Case "C4" : {PO._C4ETAPort} + 10
   Case "C5" : {PO._C5ETAPort} + 10
   Default   : {PO.PromisedDate} + 45 

这样就不需要检查NULL。如果SpecialInstructions字段中的数据不等于您的五个C#值中的一个,那么它将默认为PromisedDate加45。但是,如果您需要处理默认值的逻辑与处理空值的逻辑不同,那么我建议使用公式字段来测试空值并返回唯一的非空值,然后在此CASE语句中的Select语句中使用该公式字段。Crystal Report中的CASE语句执行直接比较,因此空值由于数据类型不匹配而无法正常工作。

您不应该回答自己的问题:)IIF()预先计算表达式的所有部分,如果遇到任何空值,则整个结果可能是空值。或者使用一些变量来去除空值,或者始终使用IsNull()检查,或者在报告选项中选中
将空值转换为默认值(如果您实际上不需要空值)。您是对的。我认为我应该最后检查一个空值,因此所有其他表达式都是事先检查的。我以前从未使用过大小写表达式。但是,这看起来更干净,我必须尽快使用这种语法。另外,当我决定使用整个IF语句而不是IIF语法时,我能够获得所需的预期返回。谢谢你的详细解释。我将开始在其他场景中使用CASE,以便更好地熟悉自己。再次感谢!