2014-03-05 34 views
1

我有2個子程序在下面。2部分AfterUpdate()子例程不工作

我有一個由最終用戶更新的表單。在更新表格中的Me.ID字段後,它會觸發子ID_AfterUpdate。這部分是成功的。

然後我想要觸發一個SQL更新查詢updateReportFlag,它用特定的值標記該記錄。這部分不起作用。有人能告訴我爲什麼嗎?我在初始更新後檢查Input_Table.[ReportFlag]字段,它是NULL,所以理論上第二個子應該工作。

這裏是我的代碼:

Private Sub ID_AfterUpdate() 
Dim db As Database 
Set db = CurrentDb 
Dim rs As Recordset 

Set rs = db.OpenRecordset("SELECT Customer.[Customer Name] " _ 
         & "FROM Customer " _ 
         & "WHERE Customer.[ID] = '" & Me.ID & "'") 

If (rs.RecordCount <> 0) Then 
    Me.txtCustomerName = rs![Customer Name] 
    updateReportFlag ' TRIGGERS THE UPDATE IN THE NEXT SUBROUTINE 
Else 
    MsgBox ("Invalid ID") 
End If 

End Sub 


Private Sub updateReportFlag() 

    DoCmd.RunSQL "UPDATE Input_Table " _ 
       & "SET Input_Table.[ReportFlag] = ""Report1"" " _ 
       & "WHERE Input_Table.[ReportFlag] IS NULL " 
End Sub 

編輯 - 在這裏是作爲窗體的記錄源代碼。注意它不是選擇Input_Table。[ReportFlag])字段,但表中包含它。這就是爲什麼我的sub updateReportFlag中的UPDATE查詢不更新表單,而是更新提供表單的表。不確定這是否相關。

SELECT Input_Table.[ID], Input_Table.[Customer Name] FROM Input_Table 
WHERE (((Input_Table.[ReportFlag])="Report1")); 

編輯2 - 我是玩這個四周,發現如果你輸入多個Me.ID值的查詢工作。第一次進入後,沒有任何更新。第二次輸入後,第一個輸入被更新。看起來在UPDATE查詢被觸發之前,記錄實際上並沒有被提交到表中。在運行UPDATE查詢之前是否有某種方法可以讓記錄提交?

+0

任何錯誤?你是否瀏覽了代碼?順便說一句,從命令中分離sql字符串並使用.Execute針對數據庫的實例幾乎總是更好一些http://stackoverflow.com/questions/11213892/whats-the-difference-between-docmd-setwarnings-and -currentdb-execute/11213943#11213943 – Fionnuala

+0

沒有錯誤。我將'updateReportFlag'更改爲'Set db = CurrentDB db.Execute sSQL,dbFailOnError'就像您所建議的那樣,但它仍未執行更新。我瀏覽了代碼,它正在處理所有必需的代碼塊。我昨天沒有提到的一件事是,表單使用查詢來顯示其數據 - 請參閱主文章中的編輯。雖然我不明白爲什麼這將是相關的,因爲它是擊中表我運行查詢對子'updateReportFlag' –

+0

請參閱編輯2 - 我發現了一些奇怪的行爲 –

回答

1

我想通了。在CDL_AfterUpdate子執行完成之後,目標表中創建的記錄才被提交。由於從CDL_AfterUpdate子集調用updateReportFlag,它在UPDATE中定位的記錄尚未提交,因此無法找到要更新的記錄。

添加以下代碼塊,這迫使該記錄被稱爲updateReportFlag子之前承諾:

If Me.Dirty Then 
    Me.Dirty = False 
End If 
+0

+1很好的工作和有用的下一個人,我相信 – Fionnuala

+0

謝謝,我感謝你花時間回顧。 –