VBA SQL选择查询到单个字符串

时间:2013-09-24 14:25:08

标签: sql vba ms-access access-vba

我目前的查询在某种程度上起作用。在访问查询设计中运行以下查询将显示具有相关公司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

1 个答案:

答案 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

通常使用连续形式,您可以将其作为另一种形式的子表单,允许您在主窗体上具有唯一的数据和控件,以及包含记录集中重复数据的子窗体。

More on binding recordsets to forms.

More on creating unbound data controls.