2

在我正在修改的 Microsoft Access 应用程序中,某些 vba 函数会返回以下消息:

"Record is Deleted"  

这将出现在一个没有错误号和黄色警告图标的消息框中。

这不是可以被传统错误处理捕获的错误(“on error...”。它也不受 DoCmd.setwarnings=false 的影响

我正在寻找有关如何捕获或处理此项目的一些建议。

4

2 回答 2

2

“记录已删除”是运行时错误 3167,可以使用正常On Error处理将其捕获。这可以通过 VBA 代码进行验证,如下所示:

Sub foo()
Dim cdb As DAO.Database, rst As DAO.Recordset
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset("SELECT * FROM Table1 WHERE ID=26", dbOpenDynaset)
MsgBox "Waiting..."
On Error GoTo foo_Error
Debug.Print rst!ID
On Error GoTo 0
rst.Close
Set rst = Nothing
Set cdb = Nothing
Exit Sub
foo_Error:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly, "Trapped Error"
End Sub

MsgBox如果您运行该代码,然后在显示时“从其下删除记录”,则在 中的rst!引用Debug.Print会触发运行时错误 3167 并On Error捕获它。

检查您的代码以查看是否有一个活动的On Error(可能在较早的调用过程中声明)仅显示MsgBox带有Err.Description. 这可以解释你描述的行为。

于 2013-08-07T01:26:48.767 回答
1

也许您从多个表中提取要删除的记录...例如

sql = "SELECT columnA FROM tableA WHERE criteria"
set rec = currentdb.openrecordset(sql)

DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM tableA WHERE columnA = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableB WHERE columnB = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableC WHERE columnC = " & rec(0)
    DoCmd.RunSQL "UPDATE tableD SET status WHERE columnD = " & rec(0)
DoCmd.SetWarnings True

这将在第二个 Delete 行失败,因为 rec(0) 在第二行不再存在,您只是从 tableA 中删除了它,这是您的记录集的来源。

然而,

DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM tableB WHERE columnB = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableC WHERE columnC = " & rec(0)
    DoCmd.RunSQL "UPDATE tableD SET status WHERE columnD = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableA WHERE columnA = " & rec(0)
DoCmd.SetWarnings True

将工作。这可能不是最佳实践方法,但如果您遇到此错误,请尝试此操作以查看被删除的记录集是否是原因。

更好的方法可能是声明一个变量并将 rec(0).value 分配给该变量。然后在代码中使用该变量代替 rec(0)。

于 2014-07-15T20:02:28.270 回答