Access SQL - 运行时的错误处理

时间:2017-06-21 07:08:26

标签: sql vba ms-access access-vba jet

我编写了一个VBA函数,可以动态构建INSERT INTO查询。此查询基于从另一个表

中选择的公式计算得分

例如公式"[Cash]/[Sales]"会产生如下查询:

INSERT INTO tblKPIScores
SELECT Employee, [Cash]/[Sales] as Score
FROM tblBasedata

为了避免div / 0错误,我尝试编写另一个函数,该函数能够计算公式的哪一部分(如果有的话)包含除数,然后单独在SQL查询中测试它,例如。

INSERT INTO tblKPIScores
SELECT Employee, IIF([Sales] = 0,0,[Cash]/[Sales]) as Score
FROM tblBasedata

然而,有些公式非常复杂,有很多括号,可能包含几个除数,所以我无法编写一个可以可靠地返回任何给定公式的除数的UDF。

我现在正在尝试这样的事情:

INSERT INTO tblKPIScores
SELECT Employee, IIF(ISERROR(tScore),0,tScore) AS Score
FROM 
    (SELECT Employee, [Cash]/[Sales] as tScore
    FROM tblBasedata)

但不是输入零,这仍然是#Num!错误,因为我认为它正在评估IIF函数的两个部分,如果true或false部分评估为错误,则返回错误。

所以我的问题是,有没有办法处理#Num! SQL在运行时出错还是有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

为什么不定义一个Function来处理除法并在SQL中调用它?通过使用Variant数据类型,您还可以检查Null值。根据需要更改它们。

Public Function SqlCalculation(ByVal value1 As Variant, ByVal value2 As Variant) As Double
    If value2 = 0 Then SqlCalculation = 0 Else SqlCalculation = value1 / value2
End Function

在SQL中调用它:

INSERT INTO tblKPIScores (...)
SELECT Employee, SqlCalculation([Cash],[Sales]) as Score
FROM tblBasedata