我目前的查询在某种程度上起作用。在访问查询设计中运行以下查询将显示具有相关公司ID的所有员工。但是,对于VBA,它只会在字符串Link_Table.FirstName
中显示Me.txtbxFirstName = rst!FirstName
中的第一条记录。例如,Link_Table.FirstName
的值是否只是表中的第一条记录?或者它可以保持多个值,然后可以迭代通过?
Public Function DataLookup()
Dim CompDetailSQL As String
Dim rst As DAO.Recordset
CompDetailSQL = "SELECT Companies.CompanyID, Companies.CompanyName,
Companies.AddressNo,
Companies.AddressLine1, Companies.AddressLine2, Companies.AddressLine3,
Companies.AddressPostcode, Companies.AddressCounty,
Companies.Description,
Companies.MainTelephone,
Companies.MainEmail,
Companies.WebAddress,
Link_Table.FirstName
FROM Companies
INNER JOIN Link_Table ON Companies.CompanyID = Link_Table.CompanyID
WHERE Companies.CompanyID = " & Me.lstBoxCompanyName.Value
Debug.Print CompDetailSQL
Set rst = CurrentDb.OpenRecordset(CompDetailSQL, dbOpenSnapshot)
Me.lblDescription.Caption = rst!Description
Me.txtbxAddressLine1.Value = rst!AddressLine1
Me.txtbxAddressLine2.Value = rst!AddressLine2
Me.txtbxAddressLine3.Value = rst!AddressLine3
Me.txtbxAddressPostcode.Value = rst!AddressPostcode
Me.txtbxAddressCounty.Value = rst!AddressCounty
Me.txtbxMainTelephone.Value = rst!MainTelephone
Me.txtbxMainEmail.Value = rst!MainEmail
Me.txtbxMainWeb.Value = rst!WebAddress
Me.txtbxFirstName = rst!FirstName
rst.Close
Set rst = Nothing
End Function
答案 0 :(得分:2)
记录集会保存您的查询返回的所有记录,但您的文本框一次只能显示一条记录。因为您的代码当前关闭了记录集并将其设置为Nothing,所以您需要选择一种方法来保存记录集。
一种方法是将记录集放在更大的范围内,例如在表单本身或全局变量中,而不是仅在此过程中。它可能会使填充记录集或在完成时关闭它等事情变得复杂,因为您必须处理它而不是在其他位置。保持太大的范围也会过度使用你的记忆。一旦拥有了持久记录集,就可以像这样导航它:
If Not (rst.BOF And rst.EOF) Then
'Do something here'
rst.MoveNext 'Navigate to the next sequential record'
'or rst.MovePrevious to go backward'
End If
或
Do While Not rst.EOF
'Do something here'
rst.MoveNext
Loop
您可能还需要考虑让您的查询将记录插入临时表,您可以将其绑定到表单。这将允许您将其视为静态表,就像您在数据库中的任何其他表一样。您不必保留记录集本身,因为记录将驻留在表中,直到您删除它们。
<强>更新强>
尝试一次显示记录集中的所有记录将要求每个记录的每个文本框都有一个副本。给出10个字段和3个记录的示例,您需要在表单上显示30个控件以显示所有这些控件。您可以通过填充第一组,移动到下一条记录并填充下一组等来完成此操作。
Do While Not rst.EOF
Me.lblDescription1.Caption = rst!Description
rst.MoveNext
Me.lblDescription2.Caption = rst!Description
rst.MoveNext
Me.lblDescription3.Caption = rst!Description
Loop
这有点笨拙,特别是因为如果您碰巧有2或4条记录而不是3条记录,那么最终会出现错误,空字段或未显示的数据。相反,您可能希望使用连续表单。这允许您创建一组文本框,并根据需要重复它们以覆盖返回的所有记录。我不确定你能用标签做到这一点,但对于文本框来说这很简单。只需创建一个表单并在默认视图设置中将其标记为连续表单,然后为记录集中的每个字段创建一个TextBox。将它们保留在设计器中,并使用以下代码在运行时附加它们:
Set Me.Recordset = rst
Me.txtbxAddressLine1.ControlSource = "addressline1"
Me.txtbxAddressLine2.ControlSource = "addressline2"
Me.txtbxAddressLine3.ControlSource = "addressline3"
Set rst = Nothing
通常使用连续形式,您可以将其作为另一种形式的子表单,允许您在主窗体上具有唯一的数据和控件,以及包含记录集中重复数据的子窗体。