Ms access MS Access 2007邻接列表树根据循环引用进行验证

Ms access MS Access 2007邻接列表树根据循环引用进行验证,ms-access,ms-access-2007,vba,Ms Access,Ms Access 2007,Vba,我已经在MS Access 2007中实现了邻接列表树。在插入或更新时,我希望根据循环引用进行验证(如a->b->c->a)。我编写了一个简单的函数,给定表名和树节点id,如果引用路径是有限的,则返回true;如果存在循环,则返回false 不幸的是,根据: 对于字段和记录验证规则,表达式不能包含 用户定义函数、域聚合或聚合函数 Eval函数或CurrentUser方法,或对窗体、查询的引用, 或者桌子。此外,字段验证规则不能包含 对其他字段的引用。对于记录,表达式可以包括 对该表中字段的引用

我已经在MS Access 2007中实现了邻接列表树。在插入或更新时,我希望根据循环引用进行验证(如
a->b->c->a
)。我编写了一个简单的函数,给定表名和树节点id,如果引用路径是有限的,则返回true;如果存在循环,则返回false

不幸的是,根据:

对于字段和记录验证规则,表达式不能包含 用户定义函数、域聚合或聚合函数 Eval函数或CurrentUser方法,或对窗体、查询的引用, 或者桌子。此外,字段验证规则不能包含 对其他字段的引用。对于记录,表达式可以包括 对该表中字段的引用

我仅限于使用Access数据库引擎作为后端的MS Access。我知道邻接列表树模型的局限性,但我还是喜欢它


验证这些引用的最佳方法是什么

您不需要将其放入验证规则中。您试图做的是在插入/更新时捕获内容,但您可能应该在插入或更新之前捕获它们

为此,请让您自己的验证在输入控件的BeforeUpdate事件中运行您的函数,并在函数显示将出现问题时运行Me.Undo和Msgbox(或以其他方式通知用户错误)

例如:

Private Sub Input_BeforeUpdate(Cancel As Integer)
    If Not inputIsValid() Then
        'input is not valid
        Me.Undo
        MsgBox "Input is not valid", vbOKOnly + vbCritical, "Invalid Input"
    End If
End Sub

您不需要将其放入验证规则中。您试图做的是在插入/更新时捕获内容,但您可能应该在插入或更新之前捕获它们

为此,请让您自己的验证在输入控件的BeforeUpdate事件中运行您的函数,并在函数显示将出现问题时运行Me.Undo和Msgbox(或以其他方式通知用户错误)

例如:

Private Sub Input_BeforeUpdate(Cancel As Integer)
    If Not inputIsValid() Then
        'input is not valid
        Me.Undo
        MsgBox "Input is not valid", vbOKOnly + vbCritical, "Invalid Input"
    End If
End Sub

谢谢我不能在atm机上试用,因为我没有使用Access。我知道你必须在表格中进行这种验证。所以它不能防止通过查询引入循环,只能防止用户输入错误的数据?是的,如果您想要前者,您必须使用支持触发器的数据库,并将验证代码设置为在插入前触发器上运行。至于使用访问后端进行访问,对于任何类似这样的复杂验证,您只能防止用户在运行查询之前输入错误数据。谢谢。我给你+1的答案和+1的评论,但显然不能标记这个anwser是正确的。不幸的是,你的评论看起来更像是一个正确的答案:)谢谢。我不能在atm机上试用,因为我没有使用Access。我知道你必须在表格中进行这种验证。所以它不能防止通过查询引入循环,只能防止用户输入错误的数据?是的,如果您想要前者,您必须使用支持触发器的数据库,并将验证代码设置为在插入前触发器上运行。至于使用访问后端进行访问,对于任何类似这样的复杂验证,您只能防止用户在运行查询之前输入错误数据。谢谢。我给你+1的答案和+1的评论,但显然不能标记这个anwser是正确的。不幸的是,你的评论看起来更像是一个正确的答案:)