在IIF(IsError())错误条件下将更新字段访问为NULL值

时间:2019-09-27 20:33:25

标签: sql ms-access

我正在尝试使用以下查询更新MS Access中的表:

UPDATE [Stock Detail Item] 
SET [Stock Detail Item].Total_Payments =
IIF(
  IsError(DSum("Payment_Amount", "Principal Payments", "Stock_No='" & [Stock Detail Item].Stock_No & "'")),
  CCur(0),
  DSum("Payment_Amount", "Principal Payments", "Stock_No='" & [Stock Detail Item].Stock_No & "'")
);

Stock_No表中有Principal Payments的付款时,查询将正确地将总付款金额插入表中。

但是,当Principal Payments表中没有付款时,IsError函数应返回True,这意味着IIF应返回0货币。

问题是,在这些实例中查询正在插入NULL。这会在稍后尝试对NULL值进行数学运算时导致错误。

我已经尝试过将00.00强制转换为货币数据类型,但是没有运气。

有什么主意,为什么没有错误时返回正确的值,为什么有错误时返回NULL的值?

1 个答案:

答案 0 :(得分:3)

您声明:

  

但是,当“本金付款”表中没有付款时,IsError函数应返回True

但是,根据documentation,如果没有记录符合给定条件,或者域(表/查询)不包含记录,则DSum函数将返回 Null ,不是错误:

  

如果没有记录满足条件参数或域不包含任何记录,则DSum函数将返回 Null

因此,我建议将您的代码更改为以下内容:

update [Stock Detail Item] 
set [Stock Detail Item].Total_Payments = 
Nz(DSum("Payment_Amount", "Principal Payments", "Stock_No='" & [Stock Detail Item].Stock_No & "'"),0)

此语句利用Nz函数,如果第一个为0,则该函数将返回提供的第二个参数(在上面的代码中为Null),否则返回第一个参数(DSum的结果)。

或者,您可以使用IsNull函数代替IsError