MS Access 2016 - 如果语句返回不正确的值

问题描述

这适用于 MS Access 2016 桌面应用程序。我有一个带有未绑定文本框的表单来接受用户输入。我正在使用 BeforeUpdate 事件来验证用户条目,因为规则可能非常复杂。这是 BeforeUpdate 事件代码

Private Sub CarbonCountTBX_BeforeUpdate(Cancel As Integer)

Cancel = Not IsValidFormulaSubscript(Me!CarbonCountTBX)

End Sub

在最简单的形式中,用户输入 Null 或空字符串是可以接受的。测试函数如下:

Public Function IsValidFormulaSubscript(subscript As Variant) As Boolean

If IsNull(subscript) Or IsEmpty(subscript) Then
    IsValidFormulaSubcript = True
    Exit Function
End If

End Function

最终结果应该是,如果函数 IsValidFormulaSubscript 返回 true,则不会取消 Beforeupdate 事件。无论出于何种原因,IsValidFormulaSubscript 总是返回与它应该返回的内容完全相反的内容。我也在调试器中对此进行了测试,但仍然出现错误。我很困惑!对出了什么问题有任何想法吗?

编辑:添加:如果我将代码反转为 Cancel = IsValidFormulaSubscript(Me!CarbonCountTBX) 它有效,但这违背了自我记录代码的全部目的,而且也不合逻辑。另请注意,使用 IsEmpty 进行测试没有任何影响,因为它处于 OR 条件内。 IsNull 或 IsEmpty 应该产生相同的结果。

解决方法

我想 subscript 应该是正确的。并且您传递一个永远不会为空的字段/控件,因此应该这样做:

Public Function IsValidFormulaSubscript(subscript As Variant) As Boolean

    IsValidFormulaSubcript = Not IsNull(subscript)

End Function
,

问题在于数据类型。将布尔值返回给 BeforeUpdate 事件代码作为取消的设置,整数不起作用。使用 CInt(boolean) 转换布尔值不起作用。在 Access 中,True = -1 和 Cancel 期望为 1 或 0。这里是修改后的代码,它确实有效,注意到我更改了函数的名称以保持一定程度的自文档化。

Private Sub CarbonCountTBX_BeforeUpdate(Cancel As Integer)

Cancel = IsNotValidFormulaSubscript(Me!CarbonCountTBX)

End Sub

Public Function IsNotValidFormulaSubscript(subscript As Variant) As Integer

If IsNull(subscript) Or IsEmpty(subscript) Then
    IsNotValidFormulaSubscript = 0
    Exit Function
End If

'additional tests and fall through

IsNotValidFormulaSubscript = 1

End Function