1

这是一个非常简单的问题,但我一直无法使用谷歌找到解决方案。我很可能使用了错误的术语。对于解决我的问题或为我指明正确方向的任何帮助,我们将不胜感激。由于我公司的内部要求,我正在创建一个带有与 SQL Server 的 ODBC 连接的 Access 数据库,以维护用户定义的表。我已经有一段时间没有用 VBA 编程了。

我正在使用访问表单来提取要编辑的数据。按下按钮,查询运行并根据条件返回一行。我正在使用记录集来保存从查询中提取的信息。我的目标是将查询中的数据放入可以编辑的文本框中,然后对所做的更改执行更新语句。但是,我编写的将记录集数据放入各种文本框中的代码失败了,我无法弄清楚原因。

这是我的代码:

Dim rst As Recordset
    'add rows to record set
Set rst = CurrentDb.OpenRecordset("Select Parent_Name, Child_Name, Address, City, State, Zip, CustomerID, Facility, SystemID, " & _
            "from Table where CustomerID = '" & Forms!Frm_Edit_Child!cbx_Cust_ID & "' and  Facility = '" & Forms!Frm_Edit_Child!cbx_Facility & "' and SystemID = '" & _
            Forms!Frm_Edit_Child!cmb_SystemID & "';")

rst.MoveLast

Me.txt_Edit_IDN_Name.Text = rst.Fields("Parent_Name").Value
Me.txt_Edit_Customer_ID.Text = rst.Fields("CustomerID").Value
Me.txt_Edit_Facility.Text = rst.Fields("Child_Name").Value
Me.txt_Edit_Facility_Num.Text = rst.Fields("Facility").Value
Me.txt_Edit_Address.Text = rst.Fields("Address").Value
Me.txt_Edit_City.Text = rst.Fields("City").Value
Me.cmb_Edit_State.Text = rst.Fields("State").Value
Me.txt_Edit_Zip.Text = rst.Fields("Zip").Value
Me.cmb_Edit_SystemID.Text = rst.Fields("SystemID").Value

我认为我尝试引用记录集中数据的方式是错误的,但我无法弄清楚我出错的地方或使用正确的术语通过 Google 找到解决方案。感谢您的时间!

4

2 回答 2

2

我认为您对该代码有多个问题。在讨论它们之前,我会给你这个建议。告诉我们您的代码失败不如告诉我们“CurrentDb.OpenRecordset触发错误 #3141,‘ SELECT 语句包含保留字或参数名称拼写错误或缺失,或者标点不正确’”

丢弃语句字段列表SystemID中的逗号。SELECT最后一个字段表达式后面不能跟逗号,否则会触发错误 #3141。

将您的SELECT语句存储在字符串变量中,然后Debug.Print在使用它打开记录集之前将其存储。

Dim strSelect As String
strSelect = "Select Parent_Name, Child_Name, Address, City, " & _
    "State, Zip, CustomerID, Facility, SystemID " & _
    "from [Table] where CustomerID = '" & _
    Forms!Frm_Edit_Child!cbx_Cust_ID & "' and  Facility = '" & _
    Forms!Frm_Edit_Child!cbx_Facility & "' and SystemID = '" & _
    Forms!Frm_Edit_Child!cmb_SystemID & "';"
Debug.Print strSelect
Set rst = CurrentDb.OpenRecordset(strSelect)

然后,如果您仍然遇到错误CurrentDb.OpenRecordset,您可以转到立即窗口 (CTRL+g) 查看您要求 db 引擎使用的语句。当您看到实际完成的声明时,您可能会立即发现问题。如果没有,您可以复制该语句并将其粘贴到新查询的 SQL 视图中...找出需要进行哪些更改以避免错误,然后修改您的 VBA 代码,使其生成相同的正确 SQL 语句。如果这仍然不能解决您的问题,请将 SQL 粘贴到您的问题中,并告诉我们您从SQL 获得的错误消息。

Table是保留字。请参阅Access 中的问题名称和保留字。如果您必须将其保留为表名,请将其括在方括号中以避免混淆 Access 的数据库引擎。

如果您的应用程序包含 Microsoft ActiveX 数据对象的引用并且它的优先级高于 DAO,则下一行可能存在问题。

Dim rst As Recordset

显式声明所需的记录集类型更安全。

Dim rst As DAO.Recordset

.Text按照@user247245 的建议,从这些行中删除。该.Text属性仅适用于当前具有焦点的控件。

Me.txt_Edit_IDN_Name.Text

你想要.Value。您可以添加它,但您不需要,因为.Value它是默认属性。所以这两个在功能上是等效的:

Me.txt_Edit_IDN_Name.Value
Me.txt_Edit_IDN_Name

SELECT最后,我认为使用绑定到语句的表单会更简单。您不必填写文本框值,因为 Access 将使用绑定控件自动为您完成此操作。您可以根据 、 和在这些控件的更新后事件或命令按钮的单击事件中修改表单的cbx_Cust_ID记录cbx_Facilitycmb_SystemID。如果您向我们展示的代码来自不同的表单(不是Frm_Edit_Child),您将不得不使用命令按钮方法。

于 2012-05-09T22:50:00.417 回答
1

已经很久了,但是:

  • .Text 是要走的路吗?尝试省略。

  • 为什么不链接源表(到链接的 MS-Acess 表)并在表单上应用过滤器?根本不需要代码。查询很容易让 JET 解析这么少的带宽。还是完整性/安全问题?

于 2012-05-09T22:07:53.180 回答