Ms access 更新事件之前的难题访问VBA

Ms access 更新事件之前的难题访问VBA,ms-access,vba,Ms Access,Vba,好吧,我有一些有趣的互动正在进行,我想从我的经验丰富的VBA猫那里得到一些建议,帮助我看看是否有一种更优雅的方式来处理我的情况 详情: 在表单上有一个复选框。此复选框已绑定到表 在原始窗体的子窗体上有一个组合框 在主窗体上的beforeupdate事件上,有一个数据验证,用于检查Checkbox=True时combobox不能为null。这是为了防止用户在不执行所需更新的情况下切换记录 所以问题是,我需要能够强制执行数据完整性,同时尽可能不妨碍UI流。值得注意的是,在beforeupdate事件

好吧,我有一些有趣的互动正在进行,我想从我的经验丰富的VBA猫那里得到一些建议,帮助我看看是否有一种更优雅的方式来处理我的情况

详情:

  • 在表单上有一个复选框。此复选框已绑定到表
  • 在原始窗体的子窗体上有一个组合框
  • 在主窗体上的beforeupdate事件上,有一个数据验证,用于检查Checkbox=True时combobox不能为null。这是为了防止用户在不执行所需更新的情况下切换记录 所以问题是,我需要能够强制执行数据完整性,同时尽可能不妨碍UI流。值得注意的是,在beforeupdate事件中,我不能使用Cancel=True,因为当您尝试将焦点切换到子窗体时,beforeupdate事件会触发,这显然会在UI流中创建INF锁。另一个问题是,一旦触发更新事件,复选框值就会写入表中。取消选中该复选框将创建另一个排序循环

    到目前为止,我的解决方案是:

    在“更新前”事件中

    If Checkbox = True and IsNull(Me!ComboBox) = True Then
        lastRecord = Me.CurrentRecord
        chkBool = True
    end if
    
    以当前事件的形式

    currRecord = Me.CurrentRecord
    
    If currRecord <> lastRecord And chkBool = True Then
        DoCmd.GoToRecord acDataForm, "form", acGoTo, lastRecord
        GoTo Exit_Form_Current
    ElseIf currRecord = lastRecord And chkBool = True Then
        'do stuff
        vbSql = "Update Statement"
        DoCmd.RunSQL vbSql
        chkBool = False
        Me.Refresh
    End If
    
    currRecord=Me.CurrentRecord
    如果currRecord lastRecord和chkBool=True,则
    DoCmd.GoToRecord acDataForm,“form”,acGoTo,lastRecord
    转到当前退出窗体
    ElseIf currecord=lastRecord,chkBool=True,则
    “做事
    vbSql=“更新语句”
    DoCmd.runsqlvbsql
    chkBool=False
    我,刷新一下
    如果结束
    

    有没有更好的办法?或者说,我必须以这种方式来处理那些不可靠的工作?遗憾的是,我无法重新设计来规避它,因为子表单需要是一个连续的子表单

    首先,您需要正确检查Null:

    If Me!Checkbox = True And IsNull(Me!ComboBox) Then
        lastRecord = Me.CurrentRecord
        chkBool = True
    End If
    

    然后与第二段代码一起评估它是如何工作的。

    您说“在主窗体上的beforeupdate事件上,有一个数据验证,检查Checkbox=True,则combobox不能为null。”一种方法是不要等到主窗体上的beforeupdate事件;选中复选框后立即进行检查。如果组合框为空,则不允许进行检查;首先强制用户进入子窗体。这可能会带来其他问题,但是

    是的,我只是发布了psuedo代码供参考。