2017-04-05 185 views
1

我正在使用兩個表緩解措施Access數據庫中的新控制ID緩解表具有表格。作爲該表格的一部分,可以將控制ID添加到新控件ID表中。我的代碼工作正常。我試圖通過緩解表格添加從新控件ID表刪除記錄的能力。從Access中的表中刪除記錄

用戶將在Text55和更新後場輸入一個字符串,在新控件ID表中相應的記錄應予以刪除。

這裏是我對這些代碼:

Private Sub Text55_AfterUpdate() 

'removing record with Archer Control ID from New Control IDs table 
Dim dbNewInitiatives As DAO.Database 
Dim rstMitigations As DAO.Recordset 
Dim strSQL As String 

    Set dbNewInitiatives = CurrentDb 
    strSQL = "SELECT * FROM [New Control IDs] WHERE ([Mitigation ID] = " & Me.[Mitigation ID].Value & ") AND ([Archer Control ID] = '" & Me.[Text55].Value & "') ORDER BY [ID]" 
    Set rstMitigations = dbNewInitiatives.OpenRecordset(strSQL, dbOpenDynaset) 

    Do While Not rstMitigations.EOF 
     rstMitigations.Delete 
     rstMitigations.MoveNext 
    Loop 

rstMitigations.Close 

Set rstMitigations = Nothing 
Set dbNewInitiatives = Nothing 

End Sub 

上面的代碼成功找到所有的新控件ID表中符合標準,並刪除他們的記錄。謝謝!

+0

*某種根本性錯誤* ... *我有困難的時候搞清楚這是什麼* ...你能發佈任何錯誤以準確找出問題? – Parfait

+0

也許這與你的問題沒有任何關係,但代碼在Sub中有_End Function_,看起來MsgBox總是會顯示是否有錯誤。正如Parfait已經說過的,你需要發佈實際問題......錯誤代碼和描述,意外行爲等。 –

回答

1

考慮使用Database.Execute方法,而不需要一個DAO記錄的運行DELETE動作查詢:

Set dbNewInitiatives = CurrentDb 
strSQL = "DELETE FROM [New Control IDs]" _ 
      & " WHERE ([Mitigation ID] = " & Me.[Mitigation ID].Value & ")" _ 
      & " AND ([Control ID] = '" & Me.[Text55].Value & "')" 

dbNewInitiatives.Execute strSQL, dbFailOnError 
+0

我給了這個鏡頭並收到運行時錯誤'3061':參數太少。預期2.突出顯示了以下代碼行:dbNewInitiatives.Execute strSQL,dbFailOnError – William

+0

這兩個字段*新控件ID *表中的控制ID *是否具有這些確切名稱?如果它們不存在於表格中,您將收到這樣的錯誤。我假設你寫的是正確的。 – Parfait

+0

你是對的,控制ID有一個語法錯誤,但修復後,我仍然得到相同的運行時錯誤,但參數太少。預計1.我已經三重檢查了其餘的名字。 Text55作爲一個未綁定的文本框與它有什麼關係? – William

0

肯定會考慮芭菲的答案,但它始終是很好的理解這個問題是擺在首位的。對我來說,看起來你的循環中的邏輯可能不正確。除非您提供更多詳細信息,否則我會首先假定[新控件ID]。[ID]是該表上的唯一密鑰。如果是這種情況,那麼您將該唯一ID存儲在變量strID中,但在實際嘗試刪除記錄之前移動到下一個記錄。在這種情況下,由於當前記錄的[ID]不等於先前記錄的[ID]值,因此循環中的If語句將始終爲假爲假

... 
Do While Not rstMitigations.EOF 
    '* This compares the previous row's [ID] with the current row's [ID] ' 
    If rstMitigations![ID] = strID Then 
     rstMitigations.Delete 
... 

如果[ID]值是不是唯一,那麼您的代碼將只刪除匹配在一系列相同的[ID]的值的第一個後續行。這將使每個唯一[ID]值的第一行保持不變(即不被刪除)。如果只有一個特定的[ID]值,該行永遠不會被刪除。那是你要的嗎?

請注意,Parfait的動作查詢將刪除您的SELECT查詢返回的所有相同記錄。只是爲了記錄在案,與記錄做到這一點,只是把它簡化爲

.... 
Set dbNewInitiatives = CurrentDb 
strSQL = "SELECT * FROM [New Control IDs] WHERE ([Mitigation ID] = " _ 
     & Me.[Mitigation ID].Value & ") AND ([Control ID] = " _ 
     & Me.[Text55].Value & ") ORDER BY [ID]" 
Set rstMitigations = dbNewInitiatives.OpenRecordset(strSQL, dbOpenDynaset) 

Do While Not rstMitigations.EOF 
    rstMitigations.Delete 
    rstMitigations.MoveNext 
Loop 
.... 
+0

[新的控制ID] [ID]是該表上的唯一密鑰。我正在尋找從[新的控制ID],[緩解ID]和[新的控制ID] [控制ID]匹配[緩解] [緩解ID]和[緩解] [[緩解ID]]的[新的控制ID] Text55]。嘗試上面的建議產生了與Parfait的建議相同的運行時錯誤。 「參數太少,預期2」。 – William