Merellys bonjour,
Plusieurs erreurs et à la fois de conception et dans l'utilisation du code VBA.
Pourquoi le nom de la machine dans la table composant et pas l'ID ? Pourquoi également le nom du fournisseur et l'ID ?
Dans un modèle correctement conçu seules les clés (clés étrangères) doivent être insérées dans les tables dérivées et ce pour raison de maintenance évidente.
Ensuite j'ai réadapté une partie de ton code afin de faire fonctionner celui-ci, il sera à améliorer certes mais il est fonctionnel, mais avant de te livrer la solution parcourons en détail tes erreurs :
1 2 3
| If Not IsNumeric(Me!cmbRechMachine) Then Exit Sub
lngcodMa = Me!cmbRechMachine
SQL = "SELECT codMarque, Marque, codMachine FROM Marques WHERE codMachine =" & lngcodMa & "ORDER BY Marque" |
Donc ici erreur 1 : Me!cmbRechMachine ne peut être de type numérique puisque dans les propriétés de ton contrôle tu as colonne liée = 2 (Me!cmbRechMachine te renvoie donc une châine de type string : cheval, chat...). Dans ton cas 2 solutions, récupérer l'id (mettre colonne liée à 1) ou chercher la valeur de la colonne 2 que tu aurais obtenu ainsi : Me!cmbRechMachine.column(1).
Regarde ici : http://access.developpez.com/faq/?pa...#ListBoxColumn
Erreur 2 : Dans ta requête codMachine n'est pas un champ de ta table marques, donc cela ne peut pas fonctionner. Dans ce cas il faut réaliser une jointure. D'autre part les associations marques-machines sont fournies dans la table composants, tu ne dois plus chercher dans la table marques mais filtrer les marques associées à la machine choisie (seule la table composants te le permets).
cmbRechMarque.RowSource = SQL
Dans cette partie le contrôle cmbRechMarque n'étant pas visible, cela provoque une erreur. Avant de modifier le contenu, il est donc impératif de rendre le contrôle visible Me.cmbRechMarque.Visible = True et de rafraîchir le contenu (Me.cmbRechMarque.Requery).
Par ailleurs je te déconseilles fortement d'utiliser SQL comme variable (plutôt sSQL). Tu trouveras ci-dessous les mots réservés :
http://office.microsoft.com/fr-fr/ac...sreservedwords
Le code corrigé ici :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Private Sub cmbRechMachine_AfterUpdate()
'
Dim sSQL As String
'
' errreur dans cette requête une jointure est nécessaire car codmachine n'appartient pas à la table
' SQL = "SELECT codMarque, Marque, codMachine FROM Marques WHERE codMachine = " & lngcodMa & " ORDER BY Marque"
'
' requête corrigée et protégée par des ' car il s'agit d'un champ string
'
sSQL = "SELECT Marques.codMarque, Marques.Marque FROM Marques INNER JOIN Composants ON Marques.codMarque = Composants.IdMarque "
sSQL = sSQL & " WHERE (((Composants.Machine) = '" & Me!cmbRechMachine.Column(1) & "')) GROUP BY Marques.codMarque, Marques.Marque ORDER BY Marques.Marque;"
'
Me.cmbRechMarque.RowSource = sSQL
'
Me.cmbRechMarque.Requery ' actualise la source de données
Me.cmbRechMarque.Visible = True ' rend visible le contrôle
Me.cmbRechMarque.SetFocus ' rend le contrôle actif
Call RefreshQuery
End Sub |
Afin de trouver tes erreurs plus facilement, je te conseilles de lire cet excellent article de Cafeine : http://cafeine.developpez.com/access...el/debugprint/
Ci-joint la base corrigée, je te laisse prendre connaissance de tout çà et revenir vers nous si tu le souhaites.
Ici la base : Merellys_2014_07_04.zip
JimboLion
Partager