求助修正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
相关产品推荐
相关产品推荐

