2013-09-24 18 views
0

我現在的查詢在某種程度上工作。在訪問查詢設計中運行下面的查詢將顯示具有相關公司ID的所有員工。但是使用VBA時,它只會顯示字符串Me.txtbxFirstName = rst!FirstNameLink_Table.FirstName的第一條記錄。例如,Link_Table.FirstName的值是否只會是表中的第一條記錄?或者它可以保存可以迭代的多個值?VBA SQL選擇查詢到單個字符串

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

它會舉行多個記錄 – satyajit

+0

怎麼可能提取'第一個!FirstName'內的記錄? –

回答

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,因爲你最終會出現錯誤,空字段或未顯示的數據。相反,您可能想要使用連續的表單。這使您可以創建一組文本框,並根據需要重複多次,以覆蓋返回的所有記錄。我不確定你可以用標籤來做到這一點,但對於文本框來說,這很簡單。只需創建一個表單並在默認視圖設置中將其標記爲連續表單,然後爲記錄集中的每個字段創建一個文本框。讓他們在設計綁定,並使用下面的代碼在運行時將它們附加:

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.

+0

因爲我已經改變了代碼太 'EmployeeDetailSql = 「SELECT * FROM Link_Table WHERE Link_Table.CompanyID =」 &Me.lstBoxCompanyName.Value 設置RST1 = CurrentDb.OpenRecordset(EmployeeDetailSql,dbOpenSnapshot) rst1.MoveLast EMPLOYEECOUNT = RST1 .RecordCount Me.txtbxFirstName = EmployeeCount rst1.Close' 這表明查詢中有3條記錄。將它放入數組並遍歷記錄並填充文本框是否可能? @techturtle –

+0

你可以使用一個數組,但是你已經有了一個可以迭代的記錄集。問題仍然是你有3組記錄的文本框。如果你知道總是有3條記錄,那麼你可以製作3組盒子,但效率很低。您也可以嘗試將表單直接綁定到記錄集:http://support.microsoft.com/kb/281998然後,您只需將按鈕添加到您的表單來回移動記錄集中的記錄。 – techturtle

+0

表單上最多隻有12個文本框。一般而言,效率並不是真正的關鍵,因爲它只是小型數據庫。如果可能的話,我正在尋找一種解決方案,在該解決方案中,來自查詢的數據填充文本框,並使用與此刻我所擁有的類似的想法。問題在於所有返回的記錄需要同時顯示在表單上。 @techturtle –