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

求助修正MS Access After Update事件代码:仅更新已保存记录忽略当前

解决Access中AfterUpdate代码无法更新当前编辑记录的问题

我明白你遇到的糟心问题了——之前代码能正常更新包括当前记录在内的所有条目,崩溃重写后却只能处理已保存的记录,当前正在编辑的那条死活不生效,试了SetFocus也没用。这其实是因为当前编辑的记录还在Access的缓冲区里,没有提交到表中,你的UPDATE语句是直接操作表的,自然抓不到它。

给你两种实用的解决思路,按需选择:

思路1:先保存当前记录再执行全表更新

这种方式在原代码基础上增加关键一步,强制把当前未保存的记录写入表,这样UPDATE就能覆盖它了:

Private Sub RawMaterial_AfterUpdate()
    ' 先保存当前正在编辑的记录,确保能被后续SQL捕获
    If Me.Dirty Then
        Me.Dirty = False
    End If
    
    Dim sSQL As String
    sSQL = "UPDATE tmp_Formula INNER JOIN tbl_RawMaterial ON tmp_Formula.RawMaterial = tbl_RawMaterial.RawMaterial " _
         & "SET tmp_Formula.MiscInfo = [tbl_RawMaterial].[MiscInfo], tmp_Formula.Potency = [tbl_RawMaterial].[Potency], " _
         & "tmp_Formula.PUoM = [tbl_RawMaterial].[PUoM], tmp_Formula.CUoM = [tbl_RawMaterial].[ClaimUoM], " _
         & "tmp_Formula.Cost = [tbl_RawMaterial].[Cost], tmp_Formula.CostUoM = [Tbl_RawMaterial].[CostUoM];"
    
    CurrentDb.Execute sSQL, dbFailOnError
    CurrentDb.TableDefs.Refresh
    Me.Refresh
End Sub

Me.Dirty = False是核心操作,它会触发Access保存当前的修改,把缓冲区的记录写入表中,之后你的UPDATE语句就能正常找到这条记录了。

思路2:直接更新当前表单控件(更高效)

如果你的需求只是更新当前正在编辑的这条记录,没必要全表更新,直接从原料表拉数据填充当前控件就行,速度更快也不会影响其他记录:

Private Sub RawMaterial_AfterUpdate()
    Dim rs As DAO.Recordset
    Dim rawMatValue As Variant
    
    ' 获取当前选择的原料值
    rawMatValue = Me.RawMaterial.Value
    
    ' 确保原料值不为空
    If Not IsNull(rawMatValue) Then
        ' 从原料表查询对应的数据
        Set rs = CurrentDb.OpenRecordset( _
            "SELECT MiscInfo, Potency, PUoM, ClaimUoM, Cost, CostUoM " & _
            "FROM tbl_RawMaterial " & _
            "WHERE RawMaterial = '" & rawMatValue & "'", _
            dbOpenDynaset _
        )
        
        ' 如果查到数据,直接更新当前表单的控件
        If Not rs.EOF Then
            Me.MiscInfo = rs!MiscInfo
            Me.Potency = rs!Potency
            Me.PUoM = rs!PUoM
            Me.CUoM = rs!ClaimUoM
            Me.Cost = rs!Cost
            Me.CostUoM = rs!CostUoM
        End If
        
        rs.Close
        Set rs = Nothing
    End If
    
    ' 可选:如果需要自动保存当前记录,取消下面的注释
    ' If Me.Dirty Then Me.Dirty = False
End Sub

至于你试的Me.CurrentRecord.SetFocus和Me.RawMaterial.SetFocus没用,是因为这两个方法只是改变焦点位置,并不会触发记录的保存操作,当前记录还是留在缓冲区里,自然不会被UPDATE语句处理到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:39:11