2017-12-18 336 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()事件重複此過程。如果您想使它更容易,請將此代碼作爲模塊並在窗體上的兩個事件觸發器中調用。

如果這不起作用,請讓我知道,我會很樂意進一步協助。