在Access VBA中,如何在删除父记录之前验证它是否有子记录?

在Access VBA中,如何在删除父记录之前验证它是否有子记录?,vba,ms-access,Vba,Ms Access,我有Access数据库,其中每个表都有许多表和表单。我已经设置了一对多的表关系,并强制父子记录的引用完整性。“我的表单”有一个删除按钮来删除单个记录,该按钮不执行DoCmd.RunCommand accmddeletecord命令。现在,当我试图删除一个有子项的记录时,我得到一个错误3200。在Form_Delete事件中,我当前正在使用一个按摩盒进行验证,以确保用户想要删除记录,如果没有,我将取消删除。我想知道是否有办法检查当前正在尝试删除的记录用户是否有子项,因此将无法删除,并将向我提供错误

我有Access数据库,其中每个表都有许多表和表单。我已经设置了一对多的表关系,并强制父子记录的引用完整性。“我的表单”有一个删除按钮来删除单个记录,该按钮不执行DoCmd.RunCommand accmddeletecord命令。现在,当我试图删除一个有子项的记录时,我得到一个错误3200。在Form_Delete事件中,我当前正在使用一个按摩盒进行验证,以确保用户想要删除记录,如果没有,我将取消删除。我想知道是否有办法检查当前正在尝试删除的记录用户是否有子项,因此将无法删除,并将向我提供错误信息。显然,当父记录被删除时,access会检查相关的子记录,并抛出此错误,而该记录不会被删除。我希望能够检查记录的属性或类似的内容,以查看是否有子项,并且在实际删除它并出现错误之前无法删除,在这种情况下,我希望取消删除。 需要注意的是,我知道我可以在错误发生时处理它,但是我想在实际删除和获取错误之前在Delete事件中执行此检查


感谢您的帮助,Arthur。

最好的方法是迭代关系集合并阅读有关表/外部表的信息 检查EE的这个问题,然后回答:

我也有同样的问题。 我写了这个函数

TableName是引用表中的表 MasterFieldName此表的键域。 KeyFieldValue要检查的值

很抱歉我用意大利语说的

Function F_AsChild(TableName As String, MasterFieldName As String, KeyFieldValue As String)

    Dim nx As Integer
    Dim ny As Integer


    Dim Rst As Recordset
    Dim Errore As Boolean
    Dim Trovato As Boolean
    Dim XX As Long
    ' La routine funziona esclusivamente a patto che la relazione sia di "one-to-many"

    XX = 0
    Trovato = False
    Errore = False
    ' Conto il mumero di relazioni che ho a disposizione.


    ' Ciclo sulle Releazioni
    For nx = 0 To CurrentDb.Relations.Count - 1

        ' Nel caso ho trovato il dato esco
        If Trovato Then Exit For


        ' Se mi trovo sulla tabella
        If CurrentDb.Relations(nx).Table = TableName Then



            For ny = 0 To CurrentDb.Relations(nx).Fields.Count - 1

                If MasterFieldName <> CurrentDb.Relations(nx).Fields(ny).Name Then
                    Errore = True
                    Trovato = True
                Else

                    XX = XX + DCount(CurrentDb.Relations(nx).Fields(ny).ForeignName, CurrentDb.Relations(nx).ForeignTable, CurrentDb.Relations(nx).Fields(ny).ForeignName + "='" + Trim(KeyFieldValue) + "'")

                End If

                If Trovato Then Exit For

            Next ny
        End If



    Next

    If Errore Then
        F_AsChild = -1
    Else
        F_AsChild = XX
    End If


End Function

使用DCount函数Patrick,我认为DCount在我的应用程序中不起作用,因为我需要提前知道所有的表关系以及这些表的名称,以便在每个DCount中使用它,并且在创建新的表关系时,我必须编辑代码来说明这些关系。谢谢。谢谢约翰,这看起来很有希望,我将探索这一点,看看它将如何为我工作。@John有趣的回答。因此,如果你发布了这样一个链接,它会被要求复制或重新骚扰至少内容的重要部分,因此如果链接失效,信息仍然存在。@Patrick不是我的解决方案…我已经指出了关系集合的迭代,但我不能为提供的解决方案负责…如果链接坏了,那么尝试使用它的未来用户将有一个出发点…毕竟EE从90年代起就稳定了,所以很难说链接会坏容易地当SO中的一个问题由于类似的问题/答案而被删除/保留/标记为重复时,情况几乎相同……因为EE很容易变坏,这也适用于SO。