Conseils de Microsoft Access pour les utilisateurs sérieux
Fourni par Allen Browne
Combos avec des dizaines de milliers d'enregistrements
Les combinaisons deviennent inopérantes avec plusieurs milliers d'enregistrements, voire plusieurs centaines dans Access 2. En ne chargeant les enregistrements dans le combo qu'après que l'utilisateur ait tapé les trois ou quatre premiers caractères, vous pouvez utiliser les combos bien au-delà de leurs limites normales, même si la propriété AutoExpand est activée.
Voici l'idée :
Laissez la propriété RowSource du combo vide.
Créez une fonction qui attribue la RowSource après qu'un nombre minimum de caractères a été tapé. Seules les entrées correspondant à ces caractères initiaux sont chargées, de sorte que la RowSource du combo ne contient jamais plus de quelques centaines d'enregistrements.
Appelez cette fonction dans l'événement Change du combo et dans l'événement Current du formulaire.
Exemple : Recherche de codes postaux à partir de la banlieue
Pour cet exemple, vous avez besoin d'une table nommée Postcodes, avec les champs Suburb, State, Postcode. Vous pouvez créer cette table à partir de données téléchargées, par exemple les codes postaux pour l'Australie. Assurez-vous que les trois champs sont indexés.
Vous avez également besoin d'un combo avec ces propriétés :
Nom Banlieue
RowSource
BoundColumn 1
ColumnCount 3
Étape 1 : Collez le texte suivant dans la section Déclarations générales du module de votre formulaire:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Dim sSuburbStub As String
Const conSuburbMin = 3
Fonction ReloadSuburb(sSuburb As String)
Dim sNewStub As String ' Premiers caractères de Suburb.Text
sNewStub = Nz(Left(sSuburb, conSuburbMin),"")
' Si les n premiers caractères sont les mêmes que précédemment, ne faites rien.
If sNewStub <> sSuburbStub Alors
If Len(sNewStub) < conSuburbMin Then
'Supprimez la RowSource
Me.Suburb.RowSource = "SELECT Suburb, State, Postcode FROM Postcodes WHERE (False) ;"
sSuburbStub = ""
Else
'Nouvelle RowSource
Me.Suburb.RowSource = "SELECT Suburb, State, Postcode FROM Postcodes WHERE (Suburb Like """ & _
sNewStub & "*"") ORDER BY Suburb, State, Postcode ;"
sSuburbStub = sNewStub
End If
End If
End Function |
Étape 2 : Dans la procédure de l'événement actuel du formulaire, entrez cette ligne :
Call ReloadSuburb(Nz(Me.Suburb, ""))
Étape 3 : Dans la procédure de l'événement Change du combo, vous pouvez également utiliser une seule ligne. Le code ci-dessous illustre comment faire un peu plus, en bloquant les espaces initiaux, et en forçant "Mt " à "Mount " :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Dim cbo As ComboBox ' Combo de la banlieue.
Dim sText As String ' Propriété Text du combo.
Set cbo = Me.Suburb
sText = cbo.Text
Select Case sText
Case " " ' Suppression de l'espace initial
cbo = Null
Case "MT " ' Remplacer "Mt " par "Mount ".
cbo = "MOUNT "
cbo.SelStart = 6
Call ReloadSuburb(sText)
Case Else ' Rechargez les données RowSource.
Call ReloadSuburb(sText)
End Select
Set cbo = Nothing |
Étape 4 : pour attribuer l'État et le code postal, ajoutez ce code à la procédure de l'événement AfterUpdate de la liste déroulante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Dim cbo As ComboBox
Set cbo = Me.Suburb
If Not IsNull(cbo.Value) Then
If cbo.Value = cbo.Column(0) Then
If Len(cbo.Column(1)) > 0 Alors
Me.State = cbo.Column(1)
End If
If Len(cbo.Column(2)) > 0 Then
Me.Postcode = cbo.Column(2)
End If
Else
Me.Postcode = Null
End If
End If
Set cbo = Nothing |
Le combo en cours d'utilisation
Lorsque l'utilisateur tape les deux premiers caractères, la liste déroulante est vide. Au troisième caractère, la liste se remplit uniquement des entrées commençant par ces trois caractères. Au quatrième caractère, Access complète le premier nom correspondant (en supposant que la fonction AutoExpand du combo est activée). Une fois qu'il a tapé suffisamment de caractères pour identifier la banlieue, l'utilisateur passe au champ suivant. Lorsqu'il quitte le combo, l'État et le code postal sont attribués.
Le temps nécessaire pour charger le combo entre deux frappes est minime. Cela ne se produit qu'une seule fois pour chaque entrée, à moins que l'utilisateur ne recule à nouveau dans les trois premiers caractères.
Si votre liste contient encore trop d'enregistrements, vous pouvez les réduire d'un autre ordre de grandeur en modifiant la valeur de la constante conSuburbMin de 3 à 4, c'est-à-dire :
Traduit avec
www.DeepL.com/Translator (version gratuite)
Partager