在不使用 VBA/Access 中的内联查询的情况下向表中添加记录

Posted

技术标签:

【中文标题】在不使用 VBA/Access 中的内联查询的情况下向表中添加记录【英文标题】:Adding records to table without using inline query in VBA/Access 【发布时间】:2015-11-20 13:41:39 【问题描述】:

我对 VBA 完全陌生。我被告知通过使用表单和保存按钮将记录添加到表中,并给出了一些非常基本的说明。虽然我通过内联查询实现了这一点,但有人告诉我要遵循一些严格的方法,例如使用 QueryDef/QueryDefs 和 .Parameters。

到目前为止,我正在尝试一个非常基本的项目,只是为了掌握概念,但我无法将任何记录添加到空表中。如果表不为空(我手动输入一条记录),每当我单击保存按钮以保存较新的记录时,添加的记录数会随着每个实例增加一倍。比如我第一次保存时添加了1条记录,第二次添加了相同类型的2条记录,第三次添加了4条,以此类推。

table(tbl_test) 有 2 个字段 --> ID(primary key), Source(Long Text) and Reg No (Number).

查询(qry_test)是使用附加功能进行的,我被告知要添加使代码如下所示的表达式 -

INSERT INTO tbl_test ( Source, [Reg No] )
SELECT [strSource] AS Expr1, [lngRegNo] AS Expr2
FROM tbl_test;

表单有 2 个字段用于 Source(txt_Source) 和 Reg No(txt_RegNo),它们有空白记录源(未绑定)。保存按钮具有以下事件过程 -

Private Sub btn_save_Click()

Dim qdf As QueryDef

Set qdf = CurrentDb.QueryDefs("qry_test")

qdf.Parameters("strSource") = Me.txt_Source
qdf.Parameters("lngRegNo") = Me.txt_RegNo

qdf.Execute

End Sub

我对 VBA 的了解为零,很乐意接受任何帮助。如果我能得到任何类型的源代码来解释有关从表单保存记录并使用这些查询定义、参数和记录集的东西编辑它们的所有细节,那就太好了。

【问题讨论】:

【参考方案1】:

欢迎来到 ***!

如果您使用表单来收集存储在表中的记录的数据,那么在我看来,运行 QueryDefs 保存的追加查询来执行此操作并不是最好的方法。

虽然追加查询确实将新记录添加到现有表中,但我倾向于使用追加查询,其中我有 多个 已建立的记录要添加到现有表中。

如果我正在设置一个数据输入表单,旨在为新记录一次收集新数据,则附加查询并不真正适合此目的。

相反,MS-Access 表单设计中内置了许多功能,可帮助收集数据并将其保存到表格中。这是因为表单的设置主要是为了让用户能够以受控、用户友好的方式与表中的记录进行交互,而不是直接与表对象本身进行交互。

在这种情况下,表单的第一个也是最重要的特征可能是表单的记录源属性。创建新表单时,进入表单的设计视图并打开表单的属性表(F4 键)。在表单属性表的“数据”选项卡中,您将找到记录源属性:

记录源本质上将您的表单与一组记录连接起来,无论这些记录是表对象、查询对象还是 sql 查询字符串中的记录。

在我看来,在您的情况下,通过在表单的记录源中引用它来将您的 tbl_Test 表绑定到您的表单会更好:

您的表单似乎没有发生任何事情,但如果您现在打开“添加现有字段”面板 (alt + F8),您会注意到与您的 tbl_Test 关联的字段您可以使用该表:

将它们拖到表单的详细信息部分...

然后将您的表单放入表单视图中:

基本上您和您的用户看到的是您的 tbl_Test 中的第一条空白记录,而是显示在表单上。

在表单的这些字段中输入数据...

...将该数据放入我们在表单记录源中指定的表中...

因此,希望您能看到将表单的记录源属性设置为表的记录源属性,这比尝试获取附加查询以从表单中收集数据并将其传送到表中要干净得多。

此时您可能会问几个问题:

当我在表单上填写了记录的字段后,如何保存该记录?

关于这一点可以说更多,但为简洁起见,我建议使用命令按钮来运行一些 vba 来保存记录;与您所做的类似,但使用表单的 Dirty 属性而不是使用附加查询:

这是我的保存按钮示例的点击事件 VBA:

Private Sub cmdSave_Click()

    If Me.Dirty Then

        Me.Dirty = False

    End If

End Sub

Me.Dirty 是表单的布尔值(True 或 False)设置;本质上,当用户更改表单上的某些内容时,它会自动设置为 True。要保存这些更改,Me.Dirty 设置必须设置为 False。

Me.Dirty 有点像羊圈上的摆门。当牧羊人将羊(数据)放入围栏(表格)时,他们将打开围栏的大门。打开的门就像表单的Me.Dirty 设置为True。要锁定羊(数据),需要关闭门,或者在表单的情况下,Me.Dirty 属性需要设置为 False。上面的 VBA 本质上是检查门是否打开以及是否要关闭。

保存当前记录后,如何移动到表单中的新记录?

再次,我会给用户一个命令按钮来执行此操作并在其单击事件上运行一些 VBA:

这是移动到新记录的 VBA:

Private Sub cmdNew_Click()

    DoCmd.GoToRecord , , acNewRec

End Sub

总结

除了我在这里概述的内容之外,还有很多需要考虑的内容,例如:

在保存之前验证数据 检查其他表单事件(如关闭)以确保数据输入不会丢失 导航到现有记录

但希望我在这里给您的内容至少可以为您指明一个更好的方向。祝你好运!

【讨论】:

这很有帮助。谢谢你。这与 AllowEdit 功能一起让我了解了如何使用表单维护基本表格。但是,我被告知即使添加记录也要使用查询,我希望我能改变我的导师的想法。【参考方案2】:

Access 针对绑定表单进行了优化。未绑定的表单仅适用于特殊情况。

如果您更喜欢未绑定的表单(可能有很多原因),Access 不值得麻烦,您应该转向 Visual Studio 和 WinForms。

无论哪种情况,请浏览初学者教程。

【讨论】:

【参考方案3】:

如果您想使用未绑定的 for 或未绑定的控件,您可以在过程中创建 SQL 字符串:

Dim mysql as String

mysql = "INSERT INTO tbl_test ( [source], [reg_No]) VALUES (Me.txt_Source, Me.txt_RegNo)

DoCmd.RunSQL mysql

【讨论】:

正如我所提到的,我不能在代码生成器中使用内联查询定义。但是,我可以使用 QueryDef 和数据绑定参数。无论是什么查询,都必须在 Access 中定义,而不是在 VBA 部分中。

以上是关于在不使用 VBA/Access 中的内联查询的情况下向表中添加记录的主要内容,如果未能解决你的问题,请参考以下文章

可以在不使用内联绘图的情况下远程访问 IPython Notebook 吗?

VBA、Access 和 SQL 的新手。我如何编写一个 SQL 查询来搜索我的 AccessDB 中的一个表并在找到它时给我一个 True/False? [复制]

在VBA(Access)中独立地重新查询多个表单实例

VBA Access SQL SELECT查询只返回一条记录

.net CLR 在 VBA (Access) 中的后期绑定

vba access 2010更新过滤子表单