我正在使用Access数据库中的两个表 Mitigations 和新控件ID 。 Mitigations 表有一个表单。作为该表单的一部分,可以将控件 ID 添加到新控件ID 表中。我的代码工作得很好。我正在尝试通过 Mitigations 表单添加从新控件ID 表中删除记录的功能。
用户将在 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 :(得分:2)
考虑使用Database.Execute方法运行DELETE
操作查询,而无需DAO记录集:
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
答案 1 :(得分:0)
绝对考虑Parfait的答案,但首先要了解问题是什么总是好的。对我而言,循环中的逻辑看起来可能不正确。
除非您提供更多详细信息,否则我将首先假设[新控制ID]。[ID]是该表上的唯一键。如果是这种情况,那么您将该唯一ID存储在变量strID中,然后在实际尝试删除记录之前移动到下一条记录。在这种情况下,循环中的If语句将始终为false ,因为当前记录的[ID]不等于先前记录的[ID]值。
...
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
....