2013-11-15 39 views
1

我正在使用RunCommand acCmdSaveRecord保存一條記錄,並且我試圖使用表單的BeforeUpdate事件來驗證某些不想留空的字段記錄保存之前。當BeforeUpdate被取消時,acCmdSaveRecord上的「No Current Record」錯誤

我有點新使用BeforeUpdate所以我不確定是否正確使用它;這裏是我的BeforeUpdate代碼:

Private Sub Form_BeforeUpdate(Cancel As Integer) 

    If IsNull(Me.[First Name]) Or IsNull(Me.LastName) Or IsNull(Me.DateOfBirth) Or IsNull(Me.CourseStartDate) Then 

     MsgBox "Before the enrolment can be saved, you must provide:" & vbCrLf & vbCrLf _ 
      & "- First Name" & vbCrLf _ 
      & "- Last Name" & vbCrLf _ 
      & "- Date of Birth" & vbCrLf _ 
      & "- Start Date" & vbCrLf & vbCrLf _ 
      & "You must also attach a course. This can be done by selecting " _ 
      & "the appropriate course in the Prospectus Search and clicking " _ 
      & "the Use Prospectus Code button." & vbCrLf & vbCrLf _ 
      & "If your course is not currently in the prospectus, you can " _ 
      & "add it first by clicking the Add Course button.", vbOKOnly Or vbInformation 

     Cancel = True 

    Else 

     Me!EnrolmentID = "Enr" & Format(Me!ID, String(12 - Len("Enr"), "0")) 

    End If 

End Sub 

所以這基本上是測試以查看是否某些領域已經留空,如果他們被留爲空白,則顯示一個消息框,顯示哪些領域需要的數據,然後更新被取消。否則,它會分配一個自定義主鍵並允許更新記錄。

它通過聲明「無當前記錄」並突出顯示RunCommand acCmdSaveRecord代碼行取消更新時拋出錯誤。

我需要做些什麼來避免錯誤?我也試過Me.Dirty = False,但仍然得到相同的錯誤。

@Johnny骨骼:

這裏有一個簡單的測試,我對你給我的答案嘗試:

Public ShouldRun As Boolean 
Private Sub Command7_Click() 

    If ShouldRun = True Then 

     MsgBox ShouldRun 

     RunCommand acCmdSaveRecord 

    End If 

End Sub 
Private Sub Form_BeforeUpdate(Cancel As Integer) 

    If IsNull(Me.Field1) Or IsNull(Me.Field2) Then 

     MsgBox "This is the true" 

     ShouldRun = False 

    Else 

     MsgBox "This is the false" 

     ShouldRun = True 

    End If 

End Sub 

基本上沒有任何的MsgBox功能被解僱並且記錄正在保存,無論字段是否留空。我試過這個作爲測試,因爲我的真實代碼中的MsgBox也沒有在BeforeUpdate事件中觸發。雖然..不明白爲什麼..如果用戶離開其中一個領域空白這應該觸發BeforeUpdate事件中的if語句的真正部分,對吧?

我能想到的唯一的事情是,前事件沒有被RunCommand acCmdSaveRecord觸發,儘管MSDN saying

「如果你再移動到另一條記錄或保存記錄,窗體的BeforeUpdate事件不發生。」

不知道這裏的訂單是什麼...... VBA運行RunCommand acCmdSaveRecord,然後BeforeUpdate事件?如果是這種情況,那麼ShouldRun變量在第一步(RunCommand acCmdSaveRecord)將不會有任何分配,因爲它只在第二步(BeforeUpdate)得到。

+0

您在什麼情況下調用RunCommand acCmdSaveRecord? – pteranodon

+0

命令按鈕的OnClick事件。 –

+1

如果看起來'Before Update'事件未觸發,請在設計視圖中打開表單,並檢查表單的屬性頁面以確保它在'Before Update'事件中表示'[Event Procedure]'。 (有時VBA代碼存在,但從表單到代碼的鏈接不存在。) –

回答

0

我會設置一個全局變量是這樣的:

Global ShouldRun as Bool 

你把它在代碼頁面的最頂端,那裏向上聲明明確選項。然後,在IF /然後/ Else語句你上面提供,更換線路:

Cancel = True 

ShouldRun = False 

和else部分添加行

ShouldRun = True 

最後,您的命令按鈕的OnClick事件應該看起來更像這樣:

If ShouldRun = True then 
    RunCommand acCmdSaveRecord 
End If 

通過這樣做,它永遠不會嘗試保存記錄,如果它不應該。

+0

謝謝,雖然我不認爲這是行得通的。我已將簡化版代碼添加到我的問題中。此外,我已將'Global ShouldRun as Bool'改爲'Public ShouldRun as Boolean',因爲前者未被vb識別。 –

0

我知道這是晚了,但您是否嘗試過使用DoCmd.RunCommand acCmdSaveRecord 代替?

因爲對我而言,它很好地觸發了Before Update事件,當時RunCommand acCmdSaveRecord不是!

但取消事件後,您可能會收到執行錯誤「2759」,因爲該記錄不能再保存。如果您正在使用Me.Dirty = False代替

Private Sub Command7_Click() 
On Error GoTo Command7_Click_Error 

    DoCmd.RunCommand acCmdSaveRecord 

Command7_Click_Exit: 
    Exit Sub 

Command7_Click_Error: 
    If Err.Number=2759 Then 
     'ignore the error 
    Else 
     MsgBox Err.Description 
    End If  
    Resume Exit_Here 
End Sub 

,你可以處理錯誤「2101」: 所以,你可以這樣處理。

希望它有幫助

相關問題