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 Button
和subform
的父表单。子表单的Source Object
链接到Datasheet
,其Record Source
链接到与子表单相同的表。
在Datasheet
的OtherNumber
字段中,我创建了一个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.OpenForm
的OpenArgs
参数在表单之间传递参数,并且您可以在表单加载时处理这些参数)。
【讨论】:
感谢您的解释,关于第一个建议,省略DoCmd.Close
显然可以解决问题,但是单击保存按钮后如何自动关闭表单?...这是我更喜欢的
道歉......我读得太快了......正如你提到的那样,但是如果单击关闭(X)按钮而不是保存按钮,我将如何阻止 Access 自动保存?
在很多事件中访问自动保存。我可以向您展示如何禁止所有保存,但如果您只在关闭时禁止它,它可能已经被自动保存了以上是关于Access VBA:关闭表单会导致表中的重复条目的主要内容,如果未能解决你的问题,请参考以下文章
将 VBA 用于 MS Access 2000 文本框的控制源
使用 VBA 在 Access 2010 中的表单上显示记录集