Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Access VBA:关闭表单会导致表中出现重复条目_Ms Access_Vba - Fatal编程技术网

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)”按钮而不是“保存”按钮,我将如何防止访问自动保存?在许多事件中访问自动保存。我可以向您展示如何抑制所有保存,但如果您仅在关闭时抑制它,则可能已经是了