Comment faire pour remplir un ComboBox avec un jeu d'enregistrements à l'aide de VBA
Il existe de la littérature disponible à expert de la bourse de et à teck république sur l'utilisation de la zone de liste déroulante.propriété recordset pour remplir une zone de liste déroulante dans un formulaire Access.
Ces contrôles sont généralement remplies avec un "SELECT *" chaîne dans le "contenu" propriétés de la commande, la référence à une table ou une requête à la disposition du client, à côté de l'application. Quand j'ai besoin d'afficher du côté du serveur de données dans une liste déroulante, j'ai créer un local temporaire de table et d'importer des documents demandés. Cela prend du temps, spécialement avec des grandes tables.
Être en mesure d'utiliser un jeu d'enregistrements pour remplir un contrôle combobox permettrait à l'utilisateur d'afficher directement les données à partir du côté du serveur.
Inspiré par les 2 exemples précédents, j'ai écrit un code comme suit:
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
Où:
- connexionActive: mon permanents ADO connexion à mon serveur de base de données
- fc(): est-ce ma de courant/forme active
- contrôles("id_Personne"): c'est l'
contrôle zone de liste déroulante pour remplir avec
du personnel de l'entreprise liste - Accéder à la version en 2003
Malheureusement, il ne fonctionne pas!
En mode debug, je suis en mesure de vérifier que le jeu d'enregistrements est correctement créé, avec des colonnes demandées et données, et correctement associés au contrôle combobox. Malheureusement, lorsque j'affiche le formulaire, je reçois un vide combobox, avec aucun enregistrement! Toute aide est très appréciée.
EDIT:
Cette propriété recordset est en effet disponible pour la zone de liste déroulante objet, pas pour la norme de contrôle de l'objet, et j'ai été très surpris de le découvrir il y a quelques jours.
J'ai déjà essayé d'utiliser la zone de liste déroulante de la fonction de rappel, ou pour remplir une liste avec les "addItem" méthode de la zone de liste déroulante. Tous ces éléments sont consommatrices de temps.
OriginalL'auteur Philippe Grondier | 2009-06-08
Vous devez vous connecter pour publier un commentaire.
Comme on l'a dit, vous devez obtenir l'originesource (RowSourceType) "Tableau/Liste" (ou "de Table/Requête" si en français) afin de montrer les résultats de la requête dans la zone de liste déroulante.
Votre mémoire surviennent des problèmes de l'ouverture du jeu d'enregistrements (rsPersonne) sans la fermer. Vous devez les fermer lors de la fermeture/déchargement de la forme (mais encore une fois vous auriez l'étendue des problèmes depuis le jeu d'enregistrements est déclarée dans la fonction et non pas dans la forme).
Vous pouvez également essayer de créer et d'enregistrer une requête avec un Accès intégré à la requête créateur et branchez la même requête dans le contenu (RowSource) de votre zone de liste déroulante. De cette façon, la requête est validée et est compilé dans l'Accès.
OriginalL'auteur Marcand
Pour définir un contrôle qui accepte un contenu (rowsource) pour un jeu d'enregistrements, vous procédez de la manière suivante:
Fonctionne avec les jeux d'enregistrements DAO pour sûr, je n'ai pas essayé les jeux d'enregistrements ADO parce que je n'ai aucune raison de les utiliser.
Quand fait de cette façon, une simple actualisation ne fonctionnera pas pour actualiser les données, vous devez faire une répétition de l'instruction set.
OriginalL'auteur Lance S
J'ai trouvé le truc ... "originesource (rowSourceType)" propriété du contrôle zone de liste déroulante doit être réglé sur "Tableau/Liste". L'affichage est maintenant ok, mais j'ai maintenant un autre problème avec la mémoire. Depuis que j'utilise ces jeux d'enregistrements ADO sur mes formes, l'utilisation de la mémoire de la croissance de l'Accès à chaque fois que je navigue sur un formulaire. La mémoire n'est pas libérée, soit par l'arrêt de la navigation ou de la fermeture du formulaire, prise de MS Access instable et régulièrement de congélation. Je vais ouvrir un question si je ne peux pas résoudre ce problème
Si vous voulez un conseil, vous devriez donner le code défectueux et d'identifier la ligne de lancer l'erreur.
Description de l'erreur ici : stackoverflow.com/questions/16231456/...
Tou définissez le type de curseur, type de serrure, l'emplacement du curseur du jeu d'enregistrements à leur valeur par défaut. Pourriez-vous appliquer les valeurs utilisées dans mon code de démonstration? Vous pouvez également identifier précisément les défauts de la ligne par la numérotation de vos lignes de code et l'utilisation des erreurs de gestion. Veuillez vérifier cette possibilité ici: stackoverflow.com/a/357882/11436
Mais je pense que le fautif est la ligne "Set rs = cnn.exécuter ...". Pourriez-vous le confirmer? Si j'étais vous, je voudrais ajouter un " Set rs = New ADODB.jeu d'enregistrements, " quelque part dans mon code ...
OriginalL'auteur Philippe Grondier
bonne méthode avec l'aide de la propriété Recordset, merci pour l'astuce!
Patrick, la méthode que vous avez indiqué sur votre page a un gros désavantage (j'ai essayé aussi sur mon propre): La valeur de la liste ne peut être de 32 KO, si vous dépassez cette limite, la fonction renvoie une erreur.
La méthode de rappel qui a le gros inconvénient: il est très lent et il est appelée une fois pour chaque entrée, ce qui le rend inutilisable pour une liste plus longue.
En utilisant le jeu d'enregistrements méthode fonctionne très bien. J'avais besoin de ce parce que ma chaîne SQL a été de plus de 32 KO (beaucoup de valeurs de l'indice pour where ID IN(x,x,x,x,x...)).
Voici une fonction simple qui utilise cette idée de créer un jeu d'enregistrements de la zone de liste déroulante:
(La fonction fnADOSelectCommon ouvre un jeu d'enregistrements ADO et le donne. La fonction fnErr affiche une boîte de message avec l'erreur, si il y en avait un.)
Que cette fonction ferme l'ouverture d'un jeu d'enregistrements, il devrait y avoir aucun problème avec la mémoire. Je l'ai testé et n'ai pas vu tout de l'augmentation de la mémoire qui n'a pas été libéré après la fermeture du formulaire avec les zones de liste modifiables.
Dans l'Événement Unload du formulaire, vous pouvez en outre utiliser un "Set rs=Moi.Comboboxname.Jeu d'enregistrements" et puis fermez-le. Cela ne devrait pas être nécessaire en ce qui concerne la mémoire, mais il peut être préférable de libérer des connexions ouvertes (si utilisé avec un serveur de base de données).
Acclamations,
Christian
OriginalL'auteur
Un contrôle zone de liste déroulante ne dispose pas d'un jeu d'enregistrements de la propriété. Il a une propriété RowSource (contenu), mais l'Accès s'attend à une chaîne SQL.
Vous pouvez modifier la originesource (RowSourceType) pour le nom d'un utilisateur défini "rappel" de la fonction. L'accès de l'aide pourront vous donner plus d'informations, y compris des exemples de code en vous positionnant sur la originesource (RowSourceType) et en appuyant sur F1. J'utilise ce type de fonction quand je veux donner à l'utilisateur une liste des rapports disponibles, les lettres de lecteur, ou d'autres données non disponibles via une requête SQL.
Je ne comprends pas ce que tu veux dire par votre, troisième alinéa, à l'égard de l'aide des données directement à partir du côté serveur. Ou plutôt je ne comprends pas quel est le problème avec l'aide de requêtes standard.
Pourquoi pensez-vous que l'attribution d'un jeu d'enregistrements de la boîte combo va être plus efficace que de laisser Access/Jet gérer la récupération des données d'une chaîne SQL? Voulez-vous dire que vous êtes à l'aide d'un jeu d'enregistrements déconnecté? Je ne peux pas imaginer pourquoi quelqu'un serait jamais besoin de ce que vous me demandez -- il ne fait pas de sens pour moi que ce soit.
Oui, le jeu d'enregistrements ADO est déconnecté
Si le jeu d'enregistrements ADO en l'affectant à la propriété RecordSource de la zone de liste déroulante semble attrayant, de sorte que vous n'avez pas à copier le contenu d'une liste de valeurs ou d'une Table. D'autant que la documentation MSDN pour la source (RecordSource) montre que l'on peut attribuer ADO ou DAO jeux d'enregistrements de cette propriété. Ce qu'il ne dit pas, c'est que vous ne devez le faire pour les Formulaires. De le faire sur une zone de liste déroulante est très feuilletée si ça marche à tous et j'ai constaté qu'une fois que des situations de travail commencera à lancer un message d'erreur après un WindowsUpdate.
OriginalL'auteur Tony Toews
Dans MS Access, c'est ok, mais dans visual basic, vous pouvez utiliser quelque chose comme ceci en utilisant adodc (Jet 4.0):
OriginalL'auteur rexreponte