2017-07-15 107 views
0

我想我有一個相當簡單的問題來回答。下面的代碼完全按照原樣工作,最終結果是從Access數據庫中填充了我的用戶窗體的組合框中的2個字段數據。我仍然有幾個組合框來填充訪問數據。我正在尋找一種方法來循環訪問單個記錄集中的多個SQL語句,而不需要爲每個SQL查詢創建一個新的記錄集。一如既往,非常感謝。VBA - 循環多個記錄集

Const conStrAccess As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data 
Source=C:\Users\Andy\Desktop\Database\IATC.accdb;Persist Security 
Info=False;" 
Const providerSQL As String = "SELECT DISTINCT [Provider Name] FROM 
tblProvider ORDER BY [Provider Name];" 
Const employeeSQL As String = "SELECT DISTINCT [Employee Name] FROM 
tblEmployee ORDER BY [Employee Name];"  

Dim aConn As ADODB.Connection 
Dim providerData As ADODB.Recordset 
Dim employeeData As ADODB.Recordset 

Set aConn = New ADODB.Connection 
Set providerData = New ADODB.Recordset 
Set employeeData = New ADODB.Recordset 

aConn.ConnectionString = conStrAccess 
aConn.Open 

aConn.ConnectionString = conStrAccess 
aConn.Open 

providerData.Open providerSQL, aConn, adOpenStatic, adLockReadOnly 
providerData.MoveFirst 

With Me.cbxProvider 
    .Clear 
    Do 
     .AddItem providerData![Provider Name] 
     providerData.MoveNext 
    Loop Until providerData.EOF 
End With 

employeeData.Open employeeSQL, aConn, adOpenStatic, adLockReadOnly 
employeeData.MoveFirst 

With Me.cbxEmployee 
    .Clear 
    Do 
     .AddItem employeeData![Employee Name] 
     employeeData.MoveNext 
    Loop Until employeeData.EOF 
End With 
+0

似乎是在你的代碼一個錯字... _aConn.Open_和前面的行有兩次 – jsotola

+0

您必須使用兩個記錄集,因爲您有兩個表(兩個數據源)......您是否有任何方法將兩個記錄集合成一個sql查詢? – jsotola

回答

2

在編程一個有用的經驗法則是「不要重複自己」(「幹」)。如果你發現你一次又一次地寫出相同的代碼並且有一致的變化,那麼你應該將這些代碼重構爲一個單獨的方法,並用一些參數來管理變化。

未經測試:

Sub Main() 

    Const conStrAccess As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data " & _ 
     "Source=C:\Users\Andy\Desktop\Database\IATC.accdb;Persist Security Info=False;" 

    Const providerSQL As String = "SELECT DISTINCT [Provider Name] FROM tblProvider ORDER BY [Provider Name]" 
    Const employeeSQL As String = "SELECT DISTINCT [Employee Name] FROM tblEmployee ORDER BY [Employee Name]" 

    Dim aConn As New ADODB.Connection 
    aConn.Open conStrAccess 

    FillListBox aConn, providerSQL, Me.cbxProvider 
    FillListBox aConn, employeeSQL, Me.cbxEmployee 
    '...more lists... 

    aConn.Close 

End Sub 

'Fill a combobox from a single-field SQL query 
Sub FillComboBox(con As ADODB.Connection, SQL As String, cb) 
    Dim rs As New ADODB.Recordset 
    rs.Open SQL, con, adOpenStatic, adLockReadOnly 
    With cb 
     .Clear 
     Do While Not rs.EOF 
      .AddItem rs.Fields(0).Value 
      rs.MoveNext 
     Loop 
    End With 
    rs.Close 
End Sub 
3

考慮不使用任何的記錄,在所有的MS Access窗體組合框和列表框可以使用表和查詢作爲rowsources:

Dim var As Variant, varList As Variant 

varList = Array("Provider", "Employee") 

For Each var in varList 

    sql = "SELECT DISTINCT [" & var & " Name] " _ 
      & " FROM tbl" & var & " ORDER BY [" & var & " Name];" 

    With Me.Form.Controls("cbx" & var) 
     .RowSourceType = "Table/Query" 
     .RowSource = sql 
     .Requery 
    End With 

Next var