Bonjour à tous,
J’ai un formulaire (basé sur une table « tblTaxa ») dont 9 champs (Ordo, Subordo, Superfamilia, Familia, Subfamilia, Tribus, Subtribus, Genus & Subgenus) sont en liste déroulante en cascade.
Le contenu de chaque liste déroulante (sauf la première) est basé sur le choix qui est fait dans la liste précédente.
J’ai donc 9 tables annexes (une pour chaque champ) avec :
- une clé primaire (ex : idGenus)
- un champ texte (ex : Genus)
- un champ numérique en liste déroulante basée sur la table précédente (ex : ici tblSubtribus) pour « lier » le nom encodé au nom dont il dépend dans la table précédente.
Sur chacun des champs du formulaire (sauf le premier) j’utilise ce code pour arriver au résultat voulu:
(ici sur le champ Genus)
Jusque là tout fonctionne à merveille…
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Genus_AfterUpdate() Dim lngIDCat As Long Dim SQL As String If Not IsNumeric(Me!Genus) Then Exit Sub lngIDCat = Me!Genus SQL = "SELECT idSubgenus, Subgenus, idGenus FROM tblSubgenus WHERE idGenus =" & lngIDCat & " ORDER BY Subgenus" Subgenus.RowSource = SQL Subgenus = True Subgenus.SetFocus Subgenus.Dropdown End Sub
Pour tester, j’ai déjà encodé une centaine d’enregistrements et je les ai liés dans chacune des tables concernées mais, à terme, la bdd devrait comprendre plusieurs milliers d’enregistrements et je me vois mal faire les liens manuellement pour chaque nouvel enregistrement.
J’ai donc ajouté une procédure événementielle « Sur absence dans liste »:
Cela fonctionne, le nom encodé s’ajoute bien à la liste mais (logique) le lien avec le choix précédent ne se fait pas automatiquement et je dois le faire manuellement (ce qui revient donc au même que sans le NotInList).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Private Sub Genus_NotInList(NewData As String, Response As Integer) Dim rst As DAO.Recordset If MsgBox("The Genus [" & _ NewData & "] is not currently in the list. Do you want to add it?", _ vbQuestion + vbYesNo) = vbYes Then Set rst = CurrentDb.OpenRecordset("tblGenus") rst.AddNew rst!Genus = NewData rst.Update rst.Close Set rst = Nothing End If Response = acDataErrAdded End Sub
Serait-il donc possible (et si oui comment), une fois que le nouveau nom est ajouté à la liste, de copier automatiquement le contenu du champ précédent (qui s’affiche correctement dans la table de base dans la table source) dans le champ numérique que j’utilise pour faire le lien ?
Exemple:
Si j’encode un nouveau nom dans le champ « Genus » de mon formulaire, il s’ajoute automatiquement à la liste (dans ma table « tblGenus ») avec la procédure sur NotInList.
Ensuite, il copie le contenu du champ « Subtribus » (de la table de base « tblTaxa ») dans le champ numérique « idSubtribus » de la table « tblGenus ».
Un grand merci d’avance pour votre aide!
Partager