2017-12-18 334 views
1

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

一切都与一个非常奇怪和愤怒异常顺利运行:每当我点击“更新前”事件中节省一个记录按钮和提示信息,我收到

RTE 3021( “没有当前记录”)

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

这里是一个简约例子(与DoCmd.Save,重新查询或acCmdSaveRecord相似的结果):

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

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

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

+0

什么是*简约的例子*应该显示?可能的错误来自'BeforeUpdate'触发器中调用的* other *代码(即完整性检查,用户输入),无法在新记录上运行。请发布这样的更完整的代码。 – Parfait

+0

我从来没有使用BeforeUpdate事件的形式。我在按钮Click事件中进行数据验证。 – June7

+0

@Parfait这个简约的例子显示了你所描述的内容。创建一个新的数据库,一个表格,一个表格。创建一个记录,输入数据并按下按钮。等voilá - 你会得到错误。 –

回答

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 
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()事件重复此过程。如果您想使它更容易,请将此代码作为模块并在窗体上的两个事件触发器中调用。

如果这不起作用,请让我知道,我会很乐意进一步协助。