我正在尝试使用以下查询更新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
值进行数学运算时导致错误。
我已经尝试过将0
或0.00
强制转换为货币数据类型,但是没有运气。
有什么主意,为什么没有错误时返回正确的值,为什么有错误时返回NULL
的值?
答案 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
的结果)。