MS Access vba保存按钮错误3021

问题描述 投票:1回答:2

由于各种原因,我想在表单上设置一个自定义按钮来保存当前记录。我使用导航表单并希望在保存条目时触发相同的过程(完整性检查,用户输入等),因此每当用户按下“保存”按钮或切换到另一个表单时。将有条件地要求用户确认该过程,因此也能够取消它。

一切都运行顺利,有一个非常奇怪和烦人的例外:每当我点击新记录上的保存按钮并在“BeforeUpdate”事件中提示消息时,我收到

RTE 3021(“暂无记录”)

没有MsgBox,一切都很好。更奇怪的是:当我通过使用导航表单切换到另一个表单来触发保存过程时(或者只是按下用于数据输入的表单的“外部”),一切都很好。

这是一个简约的例子(与DoCmd.Save,Requery或acCmdSaveRecord类似的结果):

Private Sub vt_save_Click()
Me.Dirty = False
End Sub

Private Form_BeforeUpdate(Cancel As Integer)
Cancel = True
MsgBox "Test"
End Sub

有任何想法吗?我根本无法绕过那个错误。

vba ms-access
2个回答
0
投票

您可以尝试使用表单中的值运行查询,同时检查记录是否存在。

桌子上有主键吗?如果是这样,主键将成为您的焦点。

Private Sub vt_Save_Click()
dim rst        as DAO>Recordset
Dim strSQL     as String
Dim strID      as string

strID = me.YourPrimaryKeyField

strSQL = "SELECT * " & _
         "FROM YourTableName " & _
         "WHERE (((YourTableName.YourFieldName) =" & me.PrimaryKeyField & "));"

set rst = currentdb.openrecordset(strsql)
if rst.recordcount = 0 then
    currentdb.execute "INSERT INTO YourTableName ( List All Fields to Add ) " & _
                      "SELECT List All Field controls with values to add;"
End IF

'Anything else you want the code to do from here

EndCode:
If not rst is nothing then
    rst.close
    set rst = nothing
End IF
End Sub

对Form_LostFocus()事件重复此过程。如果您想更轻松,请将此代码作为模块并在表单上的两个事件触发器中调用。

如果这不起作用,请告诉我,我将很乐意进一步协助。


0
投票

最直接和合理的解决方案是使用一个错误处理程序 - 我迄今为止顽强地忽略了它。

Private Sub save_Click()
On Error GoTo Err_Handler

Me.Dirty = False
Exit_Here:
    Exit Sub

Err_Handler:
    If Err.Number = 2101 Then
    'ignore or message
Else
    MsgBox Err.Description
End If

Resume Exit_Here

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.