2017-04-05 269 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