我正在尝试利用数据库中的一些自定义字段来使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逻辑将仍然存在。但是,它似乎在这里崩溃了。
答案 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值由于数据类型不匹配而不能很好地工作。