在VBA / Access

时间:2015-11-20 13:41:39

标签: access-vba

我是VBA的新手。我被告知要使用表单和“保存”按钮向表中添加记录,并给出一些非常基本的说明。虽然我已经使用内联查询实现了这一点,但我被告知要遵循一些严格的方法,例如使用QueryDef / QueryDefs和.Parameters。

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

表(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;

表单有两个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一无所知,很乐意接受任何帮助。如果我得到任何类型的源代码来解释从表单保存记录并使用这些querydef,参数和记录集来编辑它们的所有细节,那将是很棒的。

3 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow!

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

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

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

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

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

enter image description here

记录源实际上是将表单与一组记录连接起来,无论这些记录是表对象,查询对象还是SQL查询字符串中的记录。

在您的情况下,我认为最好将 tbl_Test 表格绑定到您的表单,方法是在表单的记录源中引用它:

enter image description here

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

enter image description here

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

enter image description here

然后将表单放入表单视图:

enter image description here

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

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

enter image description here

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

enter image description here

所以希望您可以看到将表单的记录源属性设置为表的属性比尝试获取追加查询以从表单中收集数据并将其提供给表格要清晰得多。

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

当我填写表格中的记录字段时,如何保存该记录?

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

enter image description here

以下是我的保存按钮示例的点击事件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:

enter image description here

这是移动到新记录的VBA:

Private Sub cmdNew_Click()

    DoCmd.GoToRecord , , acNewRec

End Sub

<强>摘要

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

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

但希望我在这里给你的是至少指向你更好的方向。祝你好运!

答案 1 :(得分:0)

针对绑定表单优化访问权限。未绑定表单仅适用于特殊情况。

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

在任何一种情况下,请浏览初学者的教程。

答案 2 :(得分:-1)

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

Dim mysql as String

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

DoCmd.RunSQL mysql