2017-06-21 21 views
1

我写了一个VBA函数,它在运行中生成INSERT INTO查询。这个查询计算基于公式的得分是从另一个表访问SQL - 在运行时处理错误

例如公式"[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,可以可靠地为任何给定的公式返回除数(S)。

我现在想是这样的:

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

但不是进入了一个零,这是仍然给一个#NUM!错误,因为我相信它正在评估IIF函数的两个部分,并且如果真或假部分评估为错误,则返回错误。

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

回答

0

为什么不定义一个函数来处理除法并在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 
+0

嗨科斯塔斯,寻找答案感谢。我的问题是,虽然我在问题中给出的示例公式非常简单,但其他许多公式要复杂得多,并且包含多个除数。我确实试图创建一个UDF来找出任何给定函数的除数,但无法这样做。这就是为什么我希望只是在运行时发现错误,但我不确定这是否可能。 – Leroy

+1

好吧,我明白了。我相信每当orelse部门会发出错误时,您都需要检查零。 –