让我解释一下我设置的内容,以便轻松描述我的问题。我基于一个表创建了一个子表单,为了说明,我看起来像这个样本:
每个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
模式下打开表单,其中字段值为空并等待已添加为新记录,或者表单以acFormEdit
模式打开,其中字段值已使用WHERE
填充表格中所选行的值DoCmd.OpenForm
中的criteria子句参数。
例如,我的父表单包含Command Button
和subform
。子表单的Source Object
链接到Datasheet
,Record Source
与子表单链接到同一个表。
在OtherNumber
的{{1}}字段中,我创建了一个Datasheet
并将其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
的数据,该数据将用于更新< / strong>当前记录。
但是,如果在父表单中单击criteria
,我会执行以下操作:
Command Button
表单已打开,但字段值为空,表示即将根据字段值添加新记录。
对我而言,这感觉就像没有DoCmd.OpenForm "frmTest", acNormal, , , acFormAdd
中的文本框更容易受到任何限制,如果没有限制,我必须找出一种方法来引用字段值。 frmTest
并传递给子表单Datasheet
。
你看到我的困境吗?什么是解决这个问题的最佳方法?
由于
答案 0 :(得分:2)
有许多方法可以解决这个问题:
使用绑定表单,在保存按钮上,只省略保存记录的行(因为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
表示不保存对表单 design 的任何更改,并且与以任何方式保存记录无关。
如果要在未绑定表单上设置其他表单的值:
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
(当然,也有很多替代方案。最相关的是你可以使用OpenArgs
的{{1}}参数在表单之间传递参数,你可以在表单加载时处理这些参数)。