Gewusst wie: füllen einer ComboBox mit einem Recordset über VBA
Gibt es einige Literatur zur Verfügung zu expert-exchange und teck Republik über die Verwendung des combobox.recordset-Eigenschaft zum füllen einer combobox in einem Access-Formular.
Diese Steuerelemente sind in der Regel gefüllt mit einem "SELECT *" string in der "rowsource" Eigenschaften des Steuerelements verweisen auf eine Tabelle oder Abfrage zur Verfügung, die auf der client-Seite der app. Wenn ich auf display-server-Seite Daten in eine combobox erstelle ich eine temporäre lokale Tabelle und den import angeforderten Datensätze. Dies ist zeitaufwendig, besonders bei großen Tabellen.
In der Lage mit einem recordset füllen eines combobox-Steuerelements erlauben würde, dem Benutzer direkt anzeigen der Daten von der server-Seite.
Inspiriert von den 2 vorherigen Beispiele, ich schrieb einige code wie folgt:
Dim rsPersonne as ADODB.recordset
Set rsPersonne = New ADODB.Recordset
Set rsPersonne.ActiveConnection = connexionActive
rsPersonne.CursorType = adOpenDynamic
rsPersonne.LockType = adLockPessimistic
rsPersonne.CursorLocation = adUseClient
rsPersonne.Open "SELECT id_Personne, nomPersonne FROM Tbl_Personne"
fc().Controls("id_Personne").Recordset = rsPersonne
Wo:
- connexionActive: ist meine ständige ADO-Verbindung zu meinem Datenbank-server
- (fc): ist meine aktuelle/aktive form
- controls("id_Personne"): ist die
combobox-Steuerelement zu füllen mit
Mitarbeiter von Unternehmen Liste - Access-version 2003
Leider, es funktioniert nicht!
Im debug-Modus bin ich in der Lage zu überprüfen, ob das recordset wird korrekt erstellt, die gewünschten Spalten und Daten, und richtig verbunden auf das combobox-Steuerelement. Leider, wenn ich das Formular anzeigen, bekomme ich immer eine leere combobox, ohne Einträge! Jede Hilfe wird sehr geschätzt.
EDIT:
Dieser recordset-Eigenschaft ist in der Tat für die spezielle combobox-Objekt, nicht für die standard-Steuerelement-Objekt, und ich war sehr überrascht zu entdecken, dass es vor ein paar Tagen.
Ich habe bereits versucht die combobox-callback-Funktion, oder zum Auffüllen einer Liste mit der "addItem" - Methode des combobox. Alle diese sind zeitintensiv.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie gesagt wurde, Sie haben, um die RowSourceType auf "Tabelle/Liste" oder "Tabelle/Requête" wenn in Französisch), um zu zeigen, Abfrage Ergebnisse in der combobox.
Ihre Speicher Probleme ergeben sich aus dem öffnen des Recordsets (rsPersonne), ohne es zu schließen. Sie sollte in der Nähe beim schließen/entladen des Formulars (aber dann wieder Sie hätte Geltungsbereich Probleme, da das recordset deklariert in der Funktion und in der form nicht).
Könnten Sie auch versuchen zu erstellen und speichern Sie eine Abfrage mit Access-built-in-query-creator und-Stecker, die gleiche Abfrage in die Datensatzherkunft deiner combobox. So wird die Abfrage überprüft und zusammengestellt in Access.
Setzen Sie ein Steuerelement akzeptiert eine rowsource an ein recordset Sie Folgendes tun:
Funktioniert mit DAO-Recordsets sicher, ich habe nicht versucht ADO-recordsets, da ich keinen wirklichen Grund, Sie zu benutzen.
Wenn auf diese Weise getan, ein einfaches requery wird nicht funktionieren, um die Daten zu aktualisieren, müssen Sie tun, um eine Wiederholung der set-Anweisung.
Ich fand den trick ... die "rowSourceType" - Eigenschaft des combobox-Steuerelements zu setzen "Tabelle/Liste". Anzeige ist jetzt ok, aber ich habe jetzt ein weiteres Problem mit dem Speicher. Da ich diese ADO-recordsets auf meine Formulare, die Speichernutzung der Zugriff erhöht sich jedes mal, wenn ich durchsuchen, eine form. Speicher wird nicht freigegeben, entweder durch beenden der Nutzung von Internetseiten oder das Formular schließen, so dass MS Access instabil und regelmäßig einfrieren. Ich werde öffnen Sie eine Frage, wenn ich nicht dieses Problem zu lösen
gute Methode, mit der Sie die Recordset-Eigenschaft, danke für den Tipp!
Patrick, die Methode, die Sie auf Ihrer Seite hat auch einen großen Nachteil (ich habe versucht, das auch auf meine eigene): Die Werteliste kann nur 32 KB, wenn Sie diese Grenze überschreiten, die Funktion wird keinen Fehler werfen.
Die callback-Methode hat den großen Nachteil, dass es sehr langsam und es wird aufgerufen, einmal für jeden Eintrag, das macht es unbrauchbar für eine längere Liste.
Mit der recordset-Methode sehr gut funktioniert. Ich brauchte das, weil mein SQL-string war mehr als 32 KB (Menge der index-Werte für die WHERE ID IN(x,x,x,x,x...)).
Hier ist eine einfache Funktion, die verwendet diese Idee, legen Sie eine Datensatzgruppe, um die combobox:
(Die Funktion fnADOSelectCommon öffnet ein ADO-recordset und gibt es zurück. Die Funktion fnErr zeigt eine message-box mit dem Fehler, wenn es einen gab.)
Als diese Funktion schließt die geöffnete recordset sollte es keine problem mit dem Speicher. Habe es getestet und habe nicht gesehen, die Erhöhung der Speicher nicht freigegeben, nach dem schließen der form mit den comboboxes.
In das Unload-Ereignis des Formulars können Sie zusätzlich Verwendung eines "Set rs=Me.Comboboxname.Recordset" und schließen Sie es dann. Sollte dies nicht nötig sein in Bezug auf Speicher, aber es ist vielleicht besser, frei, offene verbindungen, wenn verwendet mit einer backend-Datenbank-server).
Cheers,
Christian
Einem Kombinationsfeld-Steuerelement verfügt nicht über eine recordset-Eigenschaft. Es hat eine Datensatzherkunft-Eigenschaft, aber der Zugang ist erwartet einen SQL-string drin.
Können Sie ändern Sie die RowSourceType auf den Namen eines Benutzer-definiert "callback" - Funktion. Access-Hilfe erhalten Sie weitere Informationen, einschließlich Beispielcode durch die Positionierung selbst auf den Herkunftstyp und die Taste F1 drücken. Ich benutze diese Art der Funktion, wenn ich will geben Sie den Benutzern eine Liste der verfügbaren Berichte, Laufwerkbuchstaben oder andere Daten, die nicht verfügbar über eine SQL-Abfrage.
Ich verstehe nicht, was du meinst, bei Ihrem Dritten Absatz bezüglich der Verwendung von Daten, die direkt von der server-Seite. Oder vielmehr, ich verstehe nicht, was das problem ist mit der Verwendung von standard-Abfragen.
In MS-Access, es ist ok, aber in VB, können Sie so etwas wie das mit adodc (Jet 4.0):