Access 2013 中 1:m 表的主窗体和子窗体

Posted

技术标签:

【中文标题】Access 2013 中 1:m 表的主窗体和子窗体【英文标题】:Main form and subform for 1:m tables in Access 2013 【发布时间】:2017-08-25 07:23:58 【问题描述】:

我想在一个表单上显示两个表中的字段。这两个表是“客户”和“车辆”。 (1:米)。客户字段将显示在主表单中,并显示车辆字段,我在数据表视图中放置了一个子表单,并为车辆 ID 添加了一个文本框。当我输入 CustomerID 并单击另一个窗体上的命令按钮时,此主窗体 (frmCustomerDetails) 将与子窗体 (sfrmVehicle) 一起打开。 客户字段正确显示在主窗体中。没有错误消息,但我在子表单中看不到 Vehicle 字段。它只显示#Name?六次。车辆表中有 6 条记录,所以我认为它甚至没有过滤该客户的车辆 ID。 (vehicle 表中只有两条记录属于该客户。) 我的 Ms Access 2013 VBA 代码是;

Dim strSQL1 As String
Dim rs1 As DAO.Recordset
strSQL1 = "SELECT Customer.CustomerID, " & _
               "  Customer.fName, " & _
               "  Customer.lName, " & _
               "  Customer.Telephone, " & _
               "  Customer.MobilePhone, " & _
               "  Customer.EMail, " & _
               "  Customer.Address1, " & _
               "  Customer.Address2, " & _
               "  Customer.City, " & _
               "  Customer.State, " & _
               "  Customer.PostalCode, " & _
               "  Vehicle.VehicleID " & _
               "FROM Customer INNER JOIN Vehicle ON Customer.CustomerID = Vehicle.CustomerID;"
Set rs1 = CurrentDb.OpenRecordset(Name:=strSQL1, Type:=dbOpenDynaset)
rs1.FindFirst "[CustomerID] =""" & txtIDs & """"
DoCmd.OpenForm "frmCustomerDetails"
[Forms]![frmCustomerDetails]![txtCustomerName] = rs1.Fields!fName
..
..
[Forms]![frmCustomerDetails]![sfrmVehicle]![txtVehicleId].ControlSource = rs1.Fields!VehicleID
rs1.Close
Set rs1 = Nothing

主窗体和子窗体是否必须有两个不同的 SQL 语句?那么如何进行过滤。需要帮忙。请。

【问题讨论】:

主表单+子表单根本不需要任何代码。请阅读:support.office.com/en-us/article/… 【参考方案1】:

要对子表单进行过滤,您只需要这段代码;

Me.sfrmVehicle.Form.Filter = "[vehicleID]=" & Me.vehicleIDTextBox
Me.sfrmVehicle.Form.FilterOn = True

对于子表单中的名称错误,这可能是因为您没有在其属性表的数据选项卡中选择正确的源对象。

编辑:使用 SQL 语句,就像 Andre 所说的,您不需要它们。

【讨论】:

谢谢安德烈和马克。我的另一个要求有点复杂,这就是我尝试使用 VBA 代码和 SQL 语句的原因。接下来,我必须在一个表单中显示 3 个表中的字段。当用户输入车辆 ID 时,必须显示来自 tblcustomer 的客户字段、来自 tblVehicle 的车辆数据和来自 tblPass 的传递数据。 tblcustomer, tblvehicl 1:m 和 tblvehicle and tblPass 1:m。马克我已经选择了正确的源对象我不知道这个错误的原因。 在设计视图中查看子表单时,文本框的左上角是否有一个绿色的小三角形显示#Name?如果是这样,那么您在文本框中对控件源的拼写不正确,无法在子表单的控件源中找到。 没有绿色三角形,拼写正确。我刚刚删除了 .controlsource 来设置这样的 value 属性并检查; [Forms]![frmCustomerDetails]![sfrmVehicle]![txtVehicleId] = rs1.Fields!VehicleID 然后只显示了一个车辆 ID (QWE0123) 七次。 QWE0123 是车辆表中第一条记录的字段。

以上是关于Access 2013 中 1:m 表的主窗体和子窗体的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历所有子窗体 MS Access VBA

更新子窗体 Access 2010 时出错

在ACCESS创建表的五种方法

MS Access - 基于同一张表但不同记录的表单和子表单

在 Access 2010 中重命名子窗体

在按钮单击 MS Access 2013 VBA 在子窗体中创建新记录