2012-10-30 47 views
0

我有2個列表框,lbA和lbB。我使用SQL腳本填充lbA,它工作正常。現在我想要做的是當我從lbA中選擇一個項目時,lbB會從SQL腳本中再次填充。它只適用於從lbA中選擇一個項目但選擇兩個或更多項目或取消選擇項目,然後它添加重複項目或不刪除lbB項目。我對如何解決這個問題感到困惑。任何人都可以幫忙嗎?用戶窗體列表框填充和清除,取決於從另一個列表框中的選擇

這是迄今爲止代碼:

Private Sub lbA_Change() 
    Dim Num As Integer 
    Dim lngIndex As Long 

    If Me.lbA.ListIndex <> -1 Then 
     For lngIndex = 0 To lbA.ListCount - 1 
      If lbA.Selected(lngIndex) Then 


       Dim cnPubs As ADODB.Connection 
       Set cnPubs = New ADODB.Connection 
       Dim strConn As String 
       strConn = "PROVIDER=SQLOLEDB;" 
       strConn = strConn & "DATA SOURCE=MSSQLSERVER2008;INITIAL CATALOG=MyDB;" 
       strConn = strConn & " INTEGRATED SECURITY=sspi;" 
       cnPubs.Open strConn 
       Dim rsPubs As ADODB.Recordset 
       Set rsPubs = New ADODB.Recordset 
       With rsPubs 
        .ActiveConnection = cnPubs 
        .Open "My SQl Statement" 
       End With 
       If rsPubs.EOF Or rsPubs.BOF Then 
        Exit Sub 
       End If 
       rsPubs.MoveFirst 
       With Me.lbB 
        .Clear 
        Do 
         .AddItem rsPubs![strName] 
         rsPubs.MoveNext 
        Loop Until rsPubs.EOF 
       End With 
       rsPubs.Close 

      End If 
     Next 
    End If 
End Sub 
+2

您需要遍歷lbA中的選定項並構建一條可用於填充lbB的SQL語句。通常情況下,這將是類似於'select fieldname from tablename where whereFieldName in('itemA','itemB','itemc')'現在您正在多次運行查詢,清除每個查詢的列表框:您需要那部分超出lbA物品運行的循環 –

回答

1

嘗試這樣的函數來獲取SQL語句。

Function GetSQLFromListbox(lbx As MSForms.ListBox) 

    Dim i As Long 
    Dim sIn As String 

    If lbx.ListIndex <> -1 Then 
     sIn = " WHERE field IN(" 
     For i = 0 To lbx.ListCount - 1 
      If lbx.Selected(i) Then 
       sIn = sIn & "'" & lbx.List(i) & "'," 
      End If 
     Next i 
     sIn = Left$(sIn, Len(sIn) - 1) & ")" 
    End If 

    GetSQLFromListbox = "SELECT * FROM table" & sIn 

End Function 

應該返回類似

SELECT * FROM table WHERE field IN('2''3') 

然後創建一個從該語句和循環的記錄,通過它來填充第二個列表框。請注意,如果沒有選擇任何內容,它將返回沒有WHERE子句的SQL,因此您將獲得所有內容。您可能需要調整以適應您的情況。

+0

謝謝迪克。當我嘗試創建記錄集使用'與rsPubs .ActiveConnection = cnPubs 。打開GetSQLFromListboxStatement 結束與',但得到錯誤參數是錯誤的類型,超出了可接受的範圍或相互衝突。 – James

+0

這是我的不好。現在可以。但是,在填充lbB時,從lbA中選擇兩件或更多件物品或取消選擇一件物品時,理論上應該分別顯示所有物品或以lbB爲單位拿走物品。但它不會重複lbB中的所有項目。這是填充LBB'如果rsPubs.EOF或者rsPubs.BOF然後 退出小組 結束如果 rsPubs.MoveFirst 隨着Me.lbB .ColumnCount = 2個 .ColumnWidths = 「18 6」 的代碼 做,直到rsPubs .EOF 貨號=數+ 1 .AddItem 的.List(民 - 1,0)= intItemNumber 的.List!(民 - 1,1)= rsPubs [則strName] rsPubs.MoveNext 環路 結束With' – James

+0

每次運行前清除列表框。 'Me.lbB.Clear' –

相關問題