我正在使用Access数据库中的两个表缓解和新控件ID . “缓解”表格有一个表格 . 作为该表单的一部分,可以将控件ID添加到“新建控件ID”表中 . 我的代码工作得很好 . 我试图通过Mitigations表单添加从新控件ID表中删除记录的功能 .
用户将在Text55中输入一个字符串,在更新该字段后,应删除New Control IDs表中的相应记录 .
这是我的代码:
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表中的所有记录并删除它们 . 谢谢!
2 回答
考虑使用Database.Execute方法运行
DELETE
操作查询,而不需要DAO记录集:绝对考虑Parfait的答案,但首先要了解问题是什么总是好的 . 对我而言,循环中的逻辑看起来可能不正确 .
除非您提供更多详细信息,否则我将首先假设[新控件ID] . [ID]是该表上的唯一键 . 如果是这种情况,那么您将该唯一ID存储在变量strID中,然后在实际尝试删除记录之前移动到下一条记录 . 在这种情况下,循环中的If语句将从当前记录's [ID] would not equal the previous record' [ID]值开始 always be false .
如果[ID]值不唯一,那么您的代码将仅删除与一系列相同[ID]值中的第一个匹配的后续行 . 它会使每个唯一[ID]值的第一行保持不变(即未删除) . 如果只有一个特定的[ID]值,则永远不会删除该行 . 那是你要的吗?
请注意,Parfait的操作查询将删除SELECT查询返回的所有相同记录 . 只是为了记录,要使用记录集完成此操作,只需将其简化即可