【问题标题】:Access SQL - Error handling at run-timeAccess SQL - 运行时的错误处理
【发布时间】:2017-06-21 07:08:25
【问题描述】:

我编写了一个 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 函数的两个部分,如果真或假部分评估为错误,则返回错误。

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

【问题讨论】:

    标签: sql ms-access vba jet


    【解决方案1】:

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

    【讨论】:

    • 您好 Kostas,感谢您的回答。我遇到的问题是,尽管我在问题中给出的示例公式非常简单,但许多其他公式要复杂得多,并且包含多个除数。我确实尝试创建一个 UDF 来计算任何给定函数的除数,但无法这样做。这就是为什么我希望在运行时捕获错误但我不确定这是否可能
    • 好的,我明白了。我相信每次 orelse 除法都会抛出错误时,您需要检查零。
    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2016-03-31
    • 1970-01-01
    • 2017-09-05
    • 2014-12-20
    • 2020-09-19
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多