由于各种原因,我想在表单上设置一个自定义按钮来保存当前记录。我使用导航表单并希望在保存条目时触发相同的过程(完整性检查,用户输入等),因此每当用户按下“保存”按钮或切换到另一个表单时。将有条件地要求用户确认该过程,因此也可以取消该过程。
一切都运行顺利,有一个非常奇怪和烦人的例外:每当我点击新记录上的保存按钮并在“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
有什么想法吗?我根本无法解决这个错误。
答案 0 :(得分: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()事件重复此过程。如果您想更轻松,请将此代码作为模块并在表单上的两个事件触发器中调用。
如果这不起作用,请告诉我,我将很乐意为您提供进一步帮助。
答案 1 :(得分: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