Ms access Access VBA:关闭表单会导致表中出现重复条目
让我解释一下我是如何设置的,以便轻松描述我的问题。我基于一个表创建了一个子表单,如下图所示: 每个Ms access Access VBA:关闭表单会导致表中出现重复条目,ms-access,vba,Ms Access,Vba,让我解释一下我是如何设置的,以便轻松描述我的问题。我基于一个表创建了一个子表单,如下图所示: 每个文本框都有边界,即其控制源指向表中相应的字段名 底部有一个保存命令按钮,我在其中添加了一些vba代码,以将4个字段值插入表中 单击“保存”按钮后,我将执行以下操作以插入到表中,并关闭表单: db.Execute "INSERT INTO testTable (Number, Name, OtherNumber, OtherName) " _ & "VALUES (" &am
文本框
都有边界,即其控制源
指向表中相应的字段名
底部有一个保存命令按钮
,我在其中添加了一些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编程,我知道这与表中的绑定文本框有关,因为如果我从文本框中删除控制源
字段,将其保留为空,然后手动获取文本框中的值,即Me.textBox\u OtherNumber
,然后在单击save按钮时将这些值插入表中,当窗体关闭时,表中不会出现重复条目
然而,我更希望文本框绑定到表中,因为这样可以更容易地以acFormAdd
模式打开表单,其中字段值为空,并等待添加为新的记录,或者在acFormEdit
模式下打开表单,其中字段值已使用DoCmd.OpenForm
中的where
criteria子句参数填充表中选定行的值
例如,我有一个父窗体,其中包含一个命令按钮
和子窗体
。子窗体的源对象
链接到一个数据表
,该数据表的记录源
链接到与子窗体相同的表
在数据表
的其他编号
字段中,我创建了一个超链接
,并将其点击
命令编程如下:
Dim uniqID As Integer
Dim criteria As String
uniqID = Me.ID
criteria = "ID = " & uniqID
DoCmd.OpenForm "frmTest", acNormal, , criteria, acFormEdit
单击特定行的特定超链接
时,frmTest
中的字段将填充基于标准
的数据,该标准将用于更新当前记录
但是,如果在父窗体中单击了命令按钮
,我将执行以下操作:
DoCmd.OpenForm "frmTest", acNormal, , , acFormAdd
表单已打开,但字段值为空,表示将根据字段值添加新记录
对我来说,这感觉比不将frmTest
中的文本框绑定到任何内容都要容易得多,如果它没有绑定,我必须找到一种方法来引用数据表中的字段值并传递到子表单frmTest
你明白我的困境吗?解决这个问题的最好办法是什么
谢谢有很多很多方法可以解决这个问题:
使用绑定表单,在“保存”按钮上,只需省略保存记录的行(因为Access会自动保存该记录):
或者,如果您不信任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
参数在表单之间传递参数,并且可以在表单加载时处理这些参数)。解决此问题的方法有很多:
使用绑定表单,在“保存”按钮上,只需省略保存记录的行(因为Access会自动保存该记录):
或者,如果您不信任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
参数在表单之间传递参数,并且您可以在表单加载时处理这些参数)。听起来您在做一些非常奇怪的事情。保存按钮后面的代码是什么?是insert语句吗?因为如果使用绑定表单,任何数据操作都应该通过表单完成recordset@ErikvonAsmuth听起来你在做一些很奇怪的事情。保存按钮后面的代码是什么?是insert语句吗?因为如果使用绑定表单,任何数据操作都应该通过表单完成recordset@ErikvonAsmuth更新的问题感谢您的解释,对于第一个建议,省略DoCmd.Close
显然可以解决问题,但是,一旦单击“保存”按钮,我将如何自动关闭表单?…这是我更喜欢的……抱歉……我读得太快了……正如您所提到的那样,但如果单击“关闭(X)”按钮而不是“保存”按钮,我将如何防止访问自动保存?在许多事件中访问自动保存。我可以向您展示如何抑制所有保存,但是如果您仅在关闭时抑制它,它可能已经自动保存了。感谢您的解释,对于第一个建议,省略DoCmd.close
显然可以解决此问题,但是,一旦单击“保存”按钮,我将如何自动关闭表单?…这是我更喜欢的……抱歉……我读得太快了……正如您所提到的那样,但如果单击“关闭(X)”按钮而不是“保存”按钮,我将如何防止访问自动保存?在许多事件中访问自动保存。我可以向您展示如何抑制所有保存,但如果您仅在关闭时抑制它,则可能已经是了