You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access表单记录锁定异常:需操作后方生效的问题排查

Access表单锁定失效问题解决方案

问题现象

当[AllEntered]字段为True时,表单及子表单应在打开/切换记录时立即锁定,但实际需编辑字段并离开后才会触发锁定,与预期不符。当前代码部署在表单On Current事件及AllEntered复选框On Click事件中。

原代码问题分析

  1. 子表单属性设置错误:Job_Details子表单代码中重复设置AllowEdits,遗漏了AllowAdditions属性,导致子表单添加权限未被正确控制
  2. 表单Dirty状态干扰:打开记录时若表单处于已编辑未保存的Dirty状态,AllowEdits等属性修改不会立即生效,需先完成保存或取消编辑操作
  3. 子表单加载时机问题:Form_Current触发时子表单可能未完全加载,导致属性设置指令未被执行

修正方案

1. 修复核心逻辑代码

先修正原代码的错误项,封装锁定/解锁逻辑以避免冗余,同时处理表单状态确保设置立即生效:

Private Sub Form_Current()
    LockUnlockForms Me.AllEntered = True
End Sub

Private Sub AllEntered_Click()
    LockUnlockForms Me.AllEntered = True
End Sub

Private Sub Form_Load()
    LockUnlockForms Me.AllEntered = True
End Sub

' 封装锁定/解锁逻辑,统一控制主表单与子表单
Private Sub LockUnlockForms(isLocked As Boolean)
    ' 主表单权限设置
    Me.AllowAdditions = Not isLocked
    Me.AllowDeletions = Not isLocked
    Me.AllowEdits = Not isLocked
    
    ' Job_Details子表单权限设置(修正重复项,补充遗漏的AllowAdditions)
    If Not IsNull(Me.Job_Details.Form) Then
        Me.Job_Details.Form.AllowAdditions = Not isLocked
        Me.Job_Details.Form.AllowDeletions = Not isLocked
        Me.Job_Details.Form.AllowEdits = Not isLocked
    End If
    
    ' subVendors子表单权限设置
    If Not IsNull(Me.subVendors.Form) Then
        Me.subVendors.Form.AllowAdditions = Not isLocked
        Me.subVendors.Form.AllowDeletions = Not isLocked
        Me.subVendors.Form.AllowEdits = Not isLocked
    End If
    
    ' 强制刷新表单,确保设置立即生效
    Me.Refresh
    
    ' 若表单处于Dirty状态,自动保存修改(或用Me.Undo取消修改)
    If isLocked And Me.Dirty Then
        Me.Dirty = False
    End If
End Sub

2. 控件级锁定补充(可选)

如果表单级锁定仍不生效,可直接设置所有编辑控件的Locked属性,实现更严格的即时锁定:

' 在LockUnlockForms过程中添加控件锁定逻辑
Private Sub LockUnlockForms(isLocked As Boolean)
    ' ... 保留原表单/子表单权限设置代码 ...
    
    ' 主表单控件锁定
    Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
            ctl.Locked = isLocked
            ctl.Enabled = Not isLocked ' 可选:禁用控件并灰显
        End If
    Next ctl
    
    ' Job_Details子表单控件锁定
    If Not IsNull(Me.Job_Details.Form) Then
        For Each ctl In Me.Job_Details.Form.Controls
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
                ctl.Locked = isLocked
                ctl.Enabled = Not isLocked
            End If
        Next ctl
    End If
    
    ' subVendors子表单控件锁定
    If Not IsNull(Me.subVendors.Form) Then
        For Each ctl In Me.subVendors.Form.Controls
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
                ctl.Locked = isLocked
                ctl.Enabled = Not isLocked
            End If
        Next ctl
    End If
End Sub

关键说明

  • 用IsNull判断子表单是否加载,避免触发运行时错误
  • 在Form_Load事件中也调用锁定逻辑,确保表单初始状态正确
  • 处理Dirty状态是让权限设置立即生效的关键步骤

内容的提问来源于stack exchange,提问作者Angel Stanhope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:07:37