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

时间:2019-09-07 16:41:18

标签: vba access-vba

我有一个Access数据库,其中包含许多表和每个表的表单。我已经建立了表关系(一对多)并为父子记录强制执行了引用完整性。我的表单有一个删除按钮以删除单个记录,该按钮执行DoCmd.RunCommand acCmdDeleteRecord命令。现在,当我尝试删除有孩子的记录时,出现错误3200。在Form_Delete事件中,我当前正在使用按摩框进行验证,以确保用户希望删除该记录,如果否,则取消删除。我想知道是否有一种方法可以检查当前记录用户是否尝试删除有孩子,因此将无法删除,并且会给我错误。显然,当删除父级并抛出此错误且未删除该记录时,访问检查相关子记录。我希望能够检查记录的属性或类似的属性,以查看是否有子项并且在实际删除它并得到错误之前无法删除,在这种情况下,我想取消该删除。 请注意,我知道我可以在发生错误时进行处理,但是我想在实际删除并获取错误之前在Delete事件中进行此检查。

谢谢您的帮助,亚瑟。

2 个答案:

答案 0 :(得分:1)

最好的方法是迭代Relations集合并读取有关表/外部表的信息 请从EE中查看此问题以及答案:https://www.experts-exchange.com/questions/27266600/Access-VBA-getting-table-relationships.html

答案 1 :(得分:0)

我有同样的问题。 我写了这个功能.....

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