Validation Access VB中的多字段验证?

Validation Access VB中的多字段验证?,validation,ms-access,vba,Validation,Ms Access,Vba,我正在寻找对访问表单执行多字段验证的最佳方法。它与字段是否为null一样简单,但条件很复杂。条件不起作用,这意味着它总是移动到else,同时将所需字段留空。我是access的初学者,当然也是VB编码的初学者,但到目前为止,我通过谷歌搜索获得了以下信息: Private Sub EventSummaryPreview_Click() If _ ( _ Me.FRAUD_TYP = "Account Takeover" And _ Len([Form]![db

我正在寻找对访问表单执行多字段验证的最佳方法。它与字段是否为null一样简单,但条件很复杂。条件不起作用,这意味着它总是移动到else,同时将所需字段留空。我是access的初学者,当然也是VB编码的初学者,但到目前为止,我通过谷歌搜索获得了以下信息:

Private Sub EventSummaryPreview_Click()
If _
    ( _
        Me.FRAUD_TYP = "Account Takeover" And _
        Len([Form]![dbo_FPI_CASE_CEO Subform]![CEO_COMPANY_ID] & vbNullString) = 0 And _
        Nz([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_DT], 0 & vbNullString) = 0 And _
        Len([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_CEO_USER_ID] & vbNullString) = 0 And _
        Nz([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_AMT], 0 & vbNullString) = 0 And _
        Len([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_DEBIT_ACCT_NBR] & vbNullString) = 0 And _
        Len(Me.NOTES & vbNullString) = 0 _
    ) Or _
    ( _
        Me.FRAUD_TYP = "Account Takeover" And _
        Len([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_DT] & vbNullString) = 0 And _
        Nz([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_AMT], 0 & vbNullString) = 0 And _
        Len([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_KEY] & vbNullString) = 0 And _
        Len(Me.NOTES & vbNullString) = 0 _
    ) _
Then
    MsgBox "Required enrichment data elements are not populated, please correct your data."
    OK = True
Else
    CurrentDb.Execute "INSERT INTO dbo_FPI_CASE_ENRICHMENT (DC_NO, ENRICH_FLG, ENRICH_FLG_TS, ENRICH_STATUS) " _
    & "VALUES (" & DC_NO & ", 1, Now(), 'OPEN')"
End If
End Sub

非常感谢您的帮助。

就我个人而言,我觉得花时间让这样的内容更具可读性是非常值得的。可以通过声明多个布尔变量并为其赋值来实现这一点

Dim cond1 as boolean, cond2 as boolean
Dim cond1A as boolean, cond1B as boolean, cond1C as boolean ' etc.,
Dim cond2A as boolean, cond2B as boolean, cond2C as boolean ' etc.,

' Breaking it down 1 by 1 helps you confirm that you have all of the proper criteria
' Putting these conditions in parenthesis will allow it to evaluate as true or false
cond1A = (Me.FRAUD_TYP = "Account Takeover")
cond1B = ((Len([Form]![dbo_FPI_CASE_CEO Subform]![CEO_COMPANY_ID] & vbNullString) = 0)
cond1C = (Nz([Form]![dbo_FPI_CASE_TRANS Subform]![TRANS_DT], 0 & vbNullString) = 0)
等等,


这可能是实现我的目标的最好方法,也可能不是,但下面是我最终得到的代码。多亏了所有提供意见的人,当我有另一个版本时,我将改为Archias的建议

如果_ 那么IsNullMe.FRAUD_.TYP.Value 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS_KEY]。然后是值 如果Me.FRAUD\u TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS_DT]。然后是值 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS\u CEO\u USER\u ID]。然后选择值 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u案例\u CEO子表单]![CEO\u COMPANY\u ID]。那么价值呢 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS_AMT]。然后是值 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS\u DEBIT\u act\u NBR]。然后计算值 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管和IsNullMe.NOTES 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 如果结束 ElseIf Me.FRAUD\u TYP=账户接管且不为空[表单]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS_KEY]。然后是值 如果Me.FRAUD\u TYP=账户接管且为空[表格]![dbo\u FPI\u案例\u CEO子表单]![CEO\u COMPANY\u ID]。那么价值呢 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS_DT]。然后是值 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管且为空[表格]![dbo\u FPI\u CASE\u TRANS子表单]![TRANS_AMT]。然后是值 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 ElseIf Me.FRAUD_TYP=账户接管和IsNullMe.NOTES 未填充MsgBox必需的浓缩数据元素,请更正数据。 OK=正确 如果结束 其他的 当前数据库。执行插入到dbo\u FPI\u案例\u浓缩DC\u编号、浓缩FLG、浓缩FLG、浓缩状态_ &值和DC_NO&,1,现在“打开”
如果难以阅读,则结束。为什么不使用嵌套的If语句呢?你能给我举个例子吗?我一直在测试代码,似乎IF语句中有超过2个条件没有读入到条件中。我认为您不需要vbnullstring。如果您正在检查空字符串或null。try is nothingobject.value或object.value=如果Me.Fraud\u Typ=账户接管,则。。如果公司ID为空,则。。但是如果字段是必需的,那么您可能希望在表中这样做。如果只有在某些情况下才需要它们,那么我想您可以通过VBA执行验证。正确,当满足前2个变量之后的任何元素时,消息框都不会显示。
cond1 = (cond1A AND cond1B AND cond1C)
cond2 = (cond2A AND cond2B AND cond2C)

If cond1 or cond2 then
    ' If either are true then do this Action
else
    ' neither are true Action
endif