代码之家  ›  专栏  ›  技术社区  ›  Pangu

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

  •  0
  • Pangu  · 技术社区  · 7 年前

    让我解释一下我是如何轻松描述我的问题的。我基于一个表创建了一个子表单,其示例如下:

    enter image description here

    每个 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编程,我知道这与表的有界文本框有关,因为如果我删除 控制源 字段,将其保留为空,并手动获取文本框中的值,即。 Me.textBox_OtherNumber ,然后在单击“保存”按钮时将这些值插入表中,当窗体关闭时,表中不会出现重复条目。

    然而 ,我希望文本框绑定到表,因为这样可以更容易地在 acFormAdd 字段值为空并等待添加为的模式 记录,或在中打开表单 acFormEdit 已使用表中选定行的值填充字段值的模式 WHERE 中的criteria子句参数 DoCmd.OpenForm

    例如,我有一个包含 命令按钮 subform 。子窗体的 Source Object 链接到 Datasheet 谁的 Record Source 与子窗体链接到同一个表。

    在现场 OtherNumber 数据表 ,我创建了 hyperlink 并将其 On Click 命令如下:

    Dim uniqID As Integer
    Dim criteria As String
    
    uniqID = Me.ID
    criteria = "ID = " & uniqID 
    
    DoCmd.OpenForm "frmTest", acNormal, , criteria, acFormEdit
    

    当特定 超链接 单击特定行的 frmTest 使用基于 criteria ,将用于 使现代化 当前记录。

    但是,如果 命令按钮 在父窗体中单击,我执行以下操作:

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

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

    对我来说,这感觉比没有文本框要容易得多 FRM测试 有界到任何东西,如果没有界,我必须找到一种方法来引用 数据表 并传递给子窗体 FRM测试

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

    谢谢

    1 回复  |  直到 4 年前
        1
  •  2
  •   Erik A    7 年前

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

    使用绑定表单,在“保存”按钮上,只需省略保存记录的行(因为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
    

    (当然,也有很多替代方法。最相关的方法是可以使用 OpenArgs 的参数 DoCmd.OpenForm ,您可以在表单加载时处理这些)。