Access VBA:关闭表单会导致表中的重复条目

Posted

技术标签:

【中文标题】Access VBA:关闭表单会导致表中的重复条目【英文标题】:Access VBA: Closing form causes duplicate entry in table 【发布时间】:2018-03-10 09:35:40 【问题描述】:

让我解释一下我为轻松描述我的问题而设置的内容。我创建了一个基于表格的子表单,为了说明,它看起来像这个示例:

每个Text Box 都是有界的,即它的Control Source 指向表中相应的字段名称。

在底部有一个保存Command Button,我在其中添加了一些 vba 代码以将 4 个字段值插入到表中。

单击保存按钮后,我执行以下操作以插入表格,然后关闭表单:

db.Execute "INSERT INTO testTable (Number, Name, OtherNumber, OtherName) " _
        & "VALUES (" & Me.Number & ", '" & Me.Name _ 
        & Me.OtherNumber & "', '" & Me.OtherName & "')"
DoCmd.Close acForm, "frmTest", acSaveNo

问题是一旦表单被关闭,它会在表格中创建一个重复的条目。

由于我目前不熟悉 vba 编程,我知道这与表格的有界文本框有关,因为如果我从文本框中删除 Control Source 字段,将其留空,然后手动获取值而是在文本框中,即Me.textBox_OtherNumber,然后在单击保存按钮时将这些值插入表中,当表单关闭时,我不会在表中得到重复的条目。

然而,我更喜欢将文本框绑定到表格,因为这样可以更轻松地在字段值为空并等待添加为的 acFormAdd 模式下打开表单new 记录,或在acFormEdit 模式下打开表单,其中字段值已使用@中的WHERE 条件子句参数填充表中选定行的值987654332@.

例如,我有一个包含Command Buttonsubform 的父表单。子表单的Source Object 链接到Datasheet,其Record Source 链接到与子表单相同的表。

DatasheetOtherNumber 字段中,我创建了一个hyperlink 并将其On Click 命令编程为如下所示:

Dim uniqID As Integer
Dim criteria As String

uniqID = Me.ID
criteria = "ID = " & uniqID 

DoCmd.OpenForm "frmTest", acNormal, , criteria, acFormEdit

当点击特定行的特定hyperlink 时,frmTest 中的字段将填充基于criteria 的数据,这些数据将用于更新当前记录.

但是,如果在父表单中单击Command Button,我会执行以下操作:

DoCmd.OpenForm "frmTest", acNormal, , , acFormAdd

表单已打开,但字段值为空白,表示即将根据字段值添加新记录。

对我来说,这感觉比没有将 frmTest 中的文本框绑定到任何东西要容易得多,如果它没有边界,我将不得不想办法引用 @987654349 中的字段值@ 并传递给子表单frmTest

你看到我的困境了吗?解决这个问题的最佳方法是什么?

谢谢

【问题讨论】:

听起来你在做一些很奇怪的事情。保存按钮背后的代码是什么?它是一个插入语句吗?因为如果您使用的是绑定表单,则任何数据操作都应通过表单记录集完成 @ErikvonAsmuth 更新问题 【参考方案1】:

有很多很多方法可以解决这个问题:

使用绑定表单,在您的保存按钮上,只需省略保存记录的行(因为 Access 会自动保存它):

DoCmd.Close acForm, Me.Name, acSaveNo

或者,如果您不信任 Access 来保存它:

Me.Recordset.Update
'Or: DoCmd.RunCommand acCmdSaveRecord
'Or: If Me.Dirty Then Me.Dirty = False
DoCmd.Close acForm, Me.Name, acSaveNo

注意acSaveNo是指不保存对表单的设计所做的任何更改,与以任何方式保存记录无关。

如果你想从另一个表单设置未绑定表单的值:

If Not Application.SysCmd(acSysCmdGetObjectState, acForm, "frmTest") Then 
    'You probably don't want to run this if the form is already opened
    DoCmd.OpenForm "frmTest"
    frmTest!ID.Value = uniqID
End If

(当然,也有很多替代方案。最相关的一个是您可以使用DoCmd.OpenFormOpenArgs 参数在表单之间传递参数,并且您可以在表单加载时处理这些参数)。

【讨论】:

感谢您的解释,关于第一个建议,省略DoCmd.Close 显然可以解决问题,但是单击保存按钮后如何自动关闭表单?...这是我更喜欢的 道歉......我读得太快了......正如你提到的那样,但是如果单击关闭(X)按钮而不是保存按钮,我将如何阻止 Access 自动保存? 在很多事件中访问自动保存。我可以向您展示如何禁止所有保存,但如果您只在关闭时禁止它,它可能已经被自动保存了

以上是关于Access VBA:关闭表单会导致表中的重复条目的主要内容,如果未能解决你的问题,请参考以下文章

将 VBA 用于 MS Access 2000 文本框的控制源

访问 VBA 弹出子表单以提交条目

使用 VBA 在 Access 2010 中的表单上显示记录集

Access 2010 VBA:为啥这个表单打开和关闭序列不起作用?

Access 2010 中的组合框重复选项

什么可以阻止 MS Access 2000 表单关闭?