MS Access 验证规则未在子表单中触发

Posted

技术标签:

【中文标题】MS Access 验证规则未在子表单中触发【英文标题】:MS Access validation rules not firing in subform 【发布时间】:2015-06-09 18:13:38 【问题描述】:

我有一个数据网格,它是另一个表单中的子表单。我需要验证输入到这个 datagrid 子表单中的项目,但我很难弄清楚如何做。

每当我在论坛和 Microsoft 的帮助网站上阅读到此内容时,他们都建议您在表格级别使用必需和验证规则。但是因为这些都是链接表,Access 告诉我这些无法保存/不适用于我的情况。当我保存这些设置时,当我重新打开表格设计视图时,它们会重置为默认值。

另一个似乎最重要的建议是在实际数据网格上放置验证规则。看起来很简单,但我无法让它们开火。

在我的 FromDate 列中,我输入了验证规则 Is Not Null 和验证文本 Can't be blank。我也尝试过Not IsNull([FromDate])IsNull([FromDate])=0,但所有这些都有相同的结果,没有发生任何事情。 MS Access 让我跳过字段,不输入任何内容,然后继续。

简单地说,验证规则似乎没有被触发。

1- 我应该通过数据网格属性表验证规则来验证数据网格吗?

2- 如果是这样,我如何获得验证以实际触发并进行验证?

3- 如果我应该以编程方式进行所有验证,我该如何获取数据网格的内容/迭代每个新行?

下图:左:子窗体/ 右:数据表中我的列的属性

以下图片:左:链接表消息说我无法编辑表属性

【问题讨论】:

您不能打开包含链接指向的源表的数据库并为 FromDate 字段设置Required=Yes 吗? @HansUp 我可以,但我继承了这个与其他项目挂钩的项目,这将是一场灾难。 你的第二段让我很困惑。因此,这笔交易并不是您无法更改源字段的必填项;你实际上不想。我现在有吗? @HansUp 我无法这样做,因为该表是链接表 - 它链接到 MSSQL 数据库。我可以用这个 Access 项目做任何我想做的事,但我不能用 MSSQL 数据库,因为它会影响其他项目。 我认为你需要明确你想要什么。您的文本框验证规则应防止用户从现有记录中删除存储的 FromDate 值。它是这样工作的吗(是或否,拜托)?如果是,你还想要什么?如果没有...除非您共享数据库副本,否则我无法帮助您。 【参考方案1】:

使用表单的 Before Update 事件检查 FromDate 是否为 Null。

当为 Null 时,通知用户并取消更新 (Cancel = True)。

为文本框保留现有的验证规则。如果用户尝试从文本框中删除一个值,这将为用户提供即时反馈(而不是将通知推迟到 Access 尝试保存整个记录)。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim strPrompt As String
    If IsNull(Me!FromDate.Value) Then
        strPrompt = "FromDate can't be blank"
        MsgBox strPrompt, vbInformation + vbOKOnly, "Missing Value"
        Me!FromDate.SetFocus
        Cancel = True
    End If
End Sub

在表单的 Before Insert 事件中测试您是否也需要相同的策略。如果你这样做了,将该代码移到一个单独的过程中,并从 Before InsertBefore Update 中调用它。

【讨论】:

也感谢您取消,这为我节省了很多困惑。

以上是关于MS Access 验证规则未在子表单中触发的主要内容,如果未能解决你的问题,请参考以下文章

MS ACCESS 日期验证规则(大于数据库中的任何其他数据)

avalon的表单验证

使用 ASP.net 表单身份验证保护 MS Access 前端应用程序

复制 MS Access 主表单记录,同时将父子链接保留在子表单中

基于查询的子表单中的字段的 Access 2007 验证帮助

vue 使用element表单不触发验证