在更新事件难题之前访问VBA

时间:2017-05-06 19:31:30

标签: vba ms-access access-vba

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

详细说明:

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

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

    在更新前事件

    If Checkbox = True and IsNull(Me!ComboBox) = True Then
        lastRecord = Me.CurrentRecord
        chkBool = True
    end if
    
    Form_Current事件中的

    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
    

    有没有更好的方法来解决这个问题?或者是那种不可思议的工作,我必须如何接近它?可悲的是,由于子窗体需要是连续的子窗体,我无法重新设计以避开它。

2 个答案:

答案 0 :(得分:0)

首先,您需要正确检查 Null

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

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

答案 1 :(得分:0)

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