首页 文章

从Access中的表中删除记录

提问于
浏览
2

我正在使用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 回答

  • 0

    考虑使用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
    
  • 2

    绝对考虑Parfait的答案,但首先要了解问题是什么总是好的 . 对我而言,循环中的逻辑看起来可能不正确 .

    除非您提供更多详细信息,否则我将首先假设[新控件ID] . [ID]是该表上的唯一键 . 如果是这种情况,那么您将该唯一ID存储在变量strID中,然后在实际尝试删除记录之前移动到下一条记录 . 在这种情况下,循环中的If语句将从当前记录's [ID] would not equal the previous record' [ID]值开始 always be false .

    ...
    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
    ....
    

相关问题