Crystal Report返回空白,当“预期收益”应为日期时

时间:2020-06-17 13:10:32

标签: crystal-reports

我正在尝试利用数据库中的一些自定义字段来使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) ))))))

请参阅以下预期收益-

Expected Return -

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

问题-

Issue

我曾希望PromiseDate逻辑将用于那些空值,并且C1逻辑将仍然存在。但是,它似乎在这里崩溃了。

2 个答案:

答案 0 :(得分:0)

我不确定这是否是最佳答案。但是,有时在使用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)

答案 1 :(得分: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的需要。当使用此CASE语句评估SpecialInstructions字段中的数据时,如果它不等于您的五个C#值之一,则它仅默认为PromisedDate加45。但是,如果您需要逻辑处理默认值的逻辑将为NULL值,那么我建议使用公式字段来测试NULL值并返回唯一的非NULL值,然后在此CASE语句内的Select语句中使用该公式字段。 Crystal Report中的CASE语句执行直接比较,因此NULL值由于数据类型不匹配而不能很好地工作。

相关问题