Access 2003 Liste de choix

Fermé
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 - Modifié par microsoluces le 14/09/2012 à 10:06
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 - 17 sept. 2012 à 10:23
Bonjour à tous,

Je voudrais faire une chose toute bête sur un formulaire dans ACCESS 2003 :

J'ai deux listes déroulantes et j'aimerai que la deuxième soit
alimentée en fonction du choix que l'on aurait fait dans la première :

Exemple :

Si je choisis "Laitages" dans ma liste n°1 "classe_aliments" je voudrais
que ma liste n°2 "aliments" ne me propose que des yaourts, fromages, etc,
et pas des escalopes, haricots verts, ...

J'ai deux tables :

classe_aliments
num_auto : 1,2,3,4,5...
nom_classe : laitages, viandes, poissons, légumes, ....

aliments
num_auto : 1,2,3,4,5...
nom_classe : laitages, viandes, poissons, légumes, ....
nom_aliment : blanc de dinde, haricots verts, Lasagnes....

Les solutions que je trouve sur Internet me semblent compliquées, quel serait le
moyen le plus simple pour y arriver...

Merci d'avance à tous ceux susceptibles de m'aider....



4 réponses

microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 4
Modifié par microsoluces le 14/09/2012 à 17:37
Effectivement je te remercie, je mettais le code VBA au mauvais endroit...
Je n'ai donc plus de message d'erreur mais le système ne fonctionne pas :

J'ai fait un essai avec l'assistant de liste pour que la zone_2 tienne compte
du "nom_aliment" et du "nom_classe" et à l'écran suivant l'assistant m'affiche
l'origine du problème puisqu'il me liste bien dans le colonne 1 le nom de mes aliments mais dans la colonne 2 j'ai les numéros des classes d'aliments au lieu d'avoir leurs noms...
J'ai vérifié ma table "ALIMENTS" qui contient les éléments suivants :
num_auto
nom_aliment
nom_classe (renseigné en liaison avec la table classe_aliments = affiche bien
du texte et pas des numéros ! ! ! )

Tu dis : "Il suffit également de vérifier que la colonne liée de zone_1 est bien celle qui renvoie le nom_classe et non son num_auto. "

Je pense que cela doit venir de ça, et je ne sais pas comment faire...
1
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
Modifié par blux le 17/09/2012 à 10:24
une zone de liste comprend quelques champs qui ont beaucoup d'importance, je vais essayer de t'en donner la liste et les explications :

Dans l'onglet 'données' :
- contenu : c'est en gros, la requête (ou autre chose) que l'on va exécuter pour afficher les résultats dans la liste
- colonne liée : c'est la valeur de la colonne que va renvoyer la liste quand on demandera son contenu (liste_1.value). Si le contenu est 'SELECT toto, tata, titi FROM table et que la colonne liée est la 2, cela renverra la valeur de tata (indépendamment de ce qui peut être affiché)

Dans l'onglet 'format' :
- Nbre colonnes : combien de colonnes seront (théoriquement) affichées. Si on reprend la requête que j'ai donné en exemple au-dessus, on peut mettre 1, 2 ou 3.
- Largeur colonnes : définit si les colonnes seront affichées ou non, en fonction de leur largeur. On trouvera par exemple : 3;0;1, ce qui veut dire que la colonne toto sera affichée sur 3 cm de large, la colonne tata ne sera pas affichée (largeur 0) et la colonne titi sera affichée sur 1 cm de large.

C'est comme ça que l'on peut afficher une zone de liste avec par exemple, un nom prénom, mais travailler en vrai avec un numéro interne.

Ex :
Contenu : SELECT id,nom,prénom FROM table;
Colonne liée : 1
Nbre colonnes : 3
Largeur colonnes : 0;3;3

La zone de liste affichera nom et prénom mais renverra id quand on lui demandera sa valeur.

C'est plus clair ?

Et si tu le peux encore change ta table 'aliments' pour remplacer 'nom_aliment' par le 'num_auto' de la table 'classe_aliments'...
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
Modifié par blux le 14/09/2012 à 12:51
Salut,

trois lignes de code (pour faire propre) et le tour est joué :

- une liste déroulante zone_1
- une liste déroulante zone_2
- dans l'évènement 'sur changement' de zone_1, mettre le code suivant :

Dim StrSql As String 
StrSql = "SELECT nom_aliment from aliments where nom_classe = '" & zone_1.Value & "';" 
zone_2.RowSource = StrSql

Il suffit également de vérifier que la colonne liée de zone_1 est bien celle qui renvoie le nom_classe et non son num_auto.

Mais si je peux me permettre, nom_classe ne devrait pas apparaitre dans la table 'aliments', mais il devrait y avoir num_auto (celui de la table classe_aliment). Ce sera plus simple si un jour tu mets en relation tes tables et que l'intitulé d'une classe d'aliments change...

A+ blux
 "Les cons, ça ose tout. 
C'est même à ça qu'on les reconnait"
0
Merci pour ta réponse Blux, hélàs j'ai du faire une mauvaise manip car
j'obtiens un message d'erreur :

Microsoft Office Access ne peut pas trouver l'objet "Dim StrSql As String
StrSql = "SELECT nom_aliment from aliments where nom_classe = '"&zone1".

Si "Dim StrSql As String
StrSql = "SELECT nom_aliment from aliments where nom_classe = '"&zone1" est
une nouvelle macros, vérifiez qu'il (elle) est enregistré(e) et que vous avez correctement tapé son nom...

Ai je copié ton code au mauvais endroit ou mes tables sont mal construites ?



(Merci de venir à mon secours une nouvelle fois Blux, tu m'avais déjà aidé quand
j'avais construit une moulinette pour verifier les tarifs à la hausse entre 2 tables)
(http://www.commentcamarche.net/forum/affich-2420206-access-requete-update-en-sql)
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
14 sept. 2012 à 14:56
Tu n'as pas du mettre le code dans la propriété 'sur changement' de ta liste zone1...
Il faut faire un clic sur la ligne de l'évènement, développer la liste déroulante qui se trouve à droite de la ligne et choisir '[Procédure événementielle]', cliquer ensuite sur les trois petits points à droite, ça ouvre la fenêtre VBA sur l'évènement choisi, il suffit de coller le code entre Private Sub et End Sub
0
microsoluces
17 sept. 2012 à 10:12
Salut Blux,


Effectivement, c'est beaucoup plus clair !
Dès vendredi j'avais suivi ton conseil pour le num_auto...
Au début, je ne comprenais pas pourquoi car je ne voyais pas
comment remplir manuellement mes tables en saisissant des
numéro ID plutôt que des noms.
En fouinant sur le net, j'ai vu que tout le monde disait comme
toi (num_auto) et en creusant qu'on pouvait afficher une liste
de choix dans la table qui avec le réglage que tu donnes sur la
largeur des colonnes permettait de visualiser des noms plutôt
que des ID...
Je vais retourner sur mon formulaire pour mettre en pratique
tes explications... (sur un autre forum j'ai lu également que l'on
pouvait désactiver (en grisé) la liste 2 tant qu'un choix n'avait
pas été fait dans la liste 1 : c'est tip top !)

Encore merci Blux !
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
17 sept. 2012 à 10:23
Au lieu de griser, tu peux plutôt la masquer.

Il te suffit pour cela, dans l'évènement 'sur ouverture' de ton formulaire qui contient les listes de mettre un zone_2.visible = false et dans l'évènement 'sur changement' de zone_1 de rajouter (en plus du code de construction de l'affichage) zone_2.visible = true
0