Recupérer les infos des éléments d'une liste déroulante multichx

Bonjour,

je suis en train de construire une base de données sous Access 2010 afin d'orienter les magasiniers sur les fournisseurs qu'on stocke et ceux chez qui on doit se dépanner dans le cas où le fournisseur pour lequel on garde les références en stock ne peut pas nous fournir la référence commander. J'ai fais une table "famille" (famille de produits) et dans chaque famille de produits on a une ou plusieurs sous-famille. J'ai fait une autre table "fournisseurs" (id_frs, nom_frs, tel, site_web,...) et une table "produit" qui fait l'interaction entre un groupe article et ses-familles.
Le processus de fonctionnement attendu de ma base est le suivant: on part du menu de famille de produits (sélection d'une famille de produits) => on arrive au menu des sous-familles de la famille de produits qu'on a sélectionné au départ=> on sélectionne une sous-famille données puis on arrive sur un formulaire => le formulaire contient une liste déroulante multisélection (liste de tous les fournisseurs avec lesquels on travail) => on sélectionne le ou les fournisseurs de la sous-famille et lorqu'on valide notre sélection j'aimerai avoir les informations (id_frs, nom_frs, tel, site_web,...) concernant le ou les fournisseurs sélectionnés. Ce processus concerne les fournisseurs stockés et il en sera de même pour le dépannage.
Voici le code VBA que j'ai mis en place (et qui marche pas bien):

Private Sub btnListe_Click()

Dim varI As Variant
Dim strFiltre As String
Dim MonCtl As Variant 'défini un controle nommé MonCtl
Dim Element As Variant

strFiltre = ""
If Me.lstFOURNISSEURS.ItemsSelected.Count = 0 Then
MsgBox "Aucun fournisseur n'a été sélectionné"
Else
For Each varI In Me!lstFOURNISSEURS.ItemsSelected
If strFiltre <> "" Then strFiltre = strFiltre & " or "
strFiltre = strFiltre & "[Code frs]='" & _
Me!lstFOURNISSEURS.ItemData(varI) & "'"
Next varI
DoCmd.OpenReport "stock", acNormal, strFiltre
End If

'applique le controle à la liste déroulante du formulaire
Set btnListe = Form!stock!code_frs

'affiche l'ensemble des éléments sélectionés de la liste
For Each Element In lstFOURNISSEURS.ItemsSelected
MsgBox lstFOURNISSEURS.Column(0, Element)
Next
End Sub

J'ai vraiment besoin de votre aide pour voir ma base de données fonctionner correctement.

Merci

Dany

38 réponses

Résumé de la discussion

Une base Access 2010 sert à guider les magasiniers vers les fournisseurs en stock ou dépannés, via une navigation par famille et sous-famille et une liste déroulante multisélection des fournisseurs. Le cœur du processus est de constituer un filtre dynamique strFiltre à partir des éléments sélectionnés et d'ouvrir un état ou un formulaire affichant les données des fournisseurs correspondants. Des solutions incluent la gestion des valeurs nulles (IsNull), l'initialisation des listes à l'ouverture et l'assurance que chaque sélection alimente correctement le filtre via des requêtes SQL utilisant OR. En complément, la discussion distingue entre ouvrir un formulaire et afficher un état des fournisseurs, et recommande de vérifier les valeurs sélectionnées avant d'appliquer le filtre afin d'éviter les erreurs.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,

    Comme on est un peu loin de ton écran, ça serait vachement plus sympa de nous dire ce qui marche pas bien car on n'est pas forcément très doués en devinettes...
    0
    1. J'arrive à sélectionner plusieurs fournisseurs mais je n'ai aucune infos sur les fournisseurs (id_frs, nom_frs, tel, site_web,...) après validation
      0
      1. Modérateur
        Et si tu mets un msgbox strfiltre avant l'openreport, y'a quoi dedans ?
        Quelle est la colonne liée de la liste ?
        Quel est le type de "code frs" dans la table ?
        A+ blux
         "Les cons, ça ose tout.   
        C'est même à ça qu'on les reconnait"
        0
        1. Désolé il ne s'agit pas d'un "openreport" mais d'un "openform" et en mettant le msgbox strfiltre avant ça ne fonctionne toujours pas.

          Excuses-moi mais je comprends pas ta question concernant la colonne liée à la liste.
          Le "code frs" est de type texte
          0
          1. Modérateur
            mettant le msgbox strfiltre avant ça ne fonctionne toujours pas.
            Le msgbox n'a pas pour but de faire fonctionner mais pour effet d'afficher le contenu de la variable strfiltre afin que l'on puisse voir si elle est correctement formatée...

            La colonne liée d'une liste est la valeur renvoyée par cette liste, indépendamment de tout affichage. Jette un oeil ici.
            0
        2. ah ok, dans ce cas la colonne liée est "code frs" et je viens de bien placer le "msgbox strfiltre" et ça me m'affiche l'Id_frs (qui est la clé primaire) des fournisseurs sélectionnés
          0
          1. Modérateur
            Est-ce que la structure a l'air correcte ?
            De toutes façons, pour moi, ça ne peut pas marcher. Tu as deux IF et un seul END IF.
            0
        3. Si tu veux c'est la mon principal problème. Je pense qu'il y a des critères que j'ai pas pris en compte dans mon code mais je n'arrive pas à voir mon erreur.
          0
          1. Modérateur
            Ton code, tel que tu l'as copié ici, devrait déjà sortir une erreur à l'exécution par manque du deuxième END IF.
            0
        4. Bonjour,

          t'as bien raison qu'il me manque un END IF mais lorsque je le place j'ai le message d'erreur "END IF sans bloque if".
          0
          1. Modérateur
            Tu peux reposter ton code VBA en format code (à l'aide des balises de la boite de dialogue) ?
            0
        5. ok voici le code:

          Private Sub btnListe_Click()
          
            Dim varI As Variant
            Dim strFiltre As String
            Dim MonCtl As Variant 'défini un controle nommé MonCtl
            Dim Element As Variant
          
            strFiltre = ""
            If Me.lstFOURNISSEURS.ItemsSelected.Count = 0 Then
              MsgBox "Aucun fournisseur n'a été sélectionné"
            Else
              For Each varI In Me!lstFOURNISSEURS.ItemsSelected
                If strFiltre <> "" Then strFiltre = strFiltre & " or "
                  strFiltre = strFiltre & "[Code frs]='" & _
                    Me!lstFOURNISSEURS.ItemData(varI) & "'"
                Next varI
                
                MsgBox strFiltre
                
                DoCmd.OpenForm "FOURNISSEURS", acNormal, strFiltre
            
            End If
             'applique le controle à la liste déroulante du formulaire
             Set btnListe = Form!lstFOURNISSEURS!code_frs
             
             'affiche l'ensemble des éléments sélectionés de la liste
                  For Each Element In lstFOURNISSEURS.ItemsSelected
                      MsgBox lstFOURNISSEURS.Column(0, Element)
                  Next
          
          End Sub
          
          0
          1. Modérateur
            Ca va beaucoup mieux à lire ainsi.
            Donc pas de END IF supplémentaire à prévoir.

            Il faut juste savoir ce qu'affiche strfiltre afin de voir si c'est correct au niveau syntaxe....
            0
        6. "Il faut juste savoir ce qu'affiche strfiltre afin de voir si c'est correct au niveau syntaxe" je comprends pas très bien ce que tu veux dire par la.
          0
          1. Modérateur
            Voir ce que fait msgbox strfiltre afin de voir si la syntaxe de strfiltre est bonne et sera interprétée correctement par access. S'il y a une erreur de syntaxe, le filtre ne sera pas exécuté...
            0
        7. lorsque je sélectionne un fournisseurs au hasard et que je valide ma sélection, il me retourne 'lID du fournisseur mais après j'ai un message d'erreur derrière "le nom du formulaire "FOURNISSEUS" est mal orthographié ou fait référence à un formulaire inexistant"
          0
          1. Modérateur
            J voudrais savoir exactement ce qui est affiché par msgbox...
            Quant à l'erreur, je ne vois pas, à part vérifier si le formulaire porte le bon nom...
            0
        8. le msgbox affiche ceci "[code frs]=133" et 133 correspond a l'identifiant du fournisseur dans la base
          0
          1. Modérateur
            Dans ton code, tu as mis des quotes autour de ton code frs, sont-elles affichées par le msgbox ?
            0
        9. oui
          0
          1. Modérateur
            Une question : le form que tu veux ouvrir n'est pas celui dans lequel tu te trouves déjà ?
            0
        10. Non! en fait dans le premier form il s'agit de la table "fournisseurs" et dans le deuxième il s'agit du formulaire
          0
          1. Modérateur
            Quel deuxième ?
            Je ne vois qu'un openform...
            0
        11. vu que tu parlais du "form" j'ai pas compris que tu voulais parlé de "l'openform". Pour répondre à ta question je dirai non, je ne suis pas dans le formulaire que je veux ouvrir
          0
          1. Modérateur
            Tu as bien un formulaire nommé 'FOURNISSEURS' ?
            Tu peux l'ouvrir manuellement ?
            0
        12. oui c'est exactement cela
          0
          1. Modérateur
            et si tu laisses ton code d'ouverture sans mettre de filtre, ça fait quoi ?
            0
        13. ça me donne le resultat du msgbox "[code frs]=133"
          0
          1. Modérateur
            Ma question était : est-ce que le formulaire s'ouvre sans mettre le filtre ?
            0
        14. non
          0
          1. Modérateur
            Et si tu essayes d'ouvrir un autre formulaire ?
            0
        15. je pense pas que cela puisse passer dans la mesure où le résultat doit provenir de la table "fournisseurs" à partir du fournisseur qu'on aura sélectionné dans la liste déroulante. Et ce sont les informations sur ce fournisseur qui alimenteront le formulaire à ouvrir. Je viens quand même de faire le test comme tu me l'as demandé j'ai le même message d'erreur ""le nom du formulaire "formulaire 2" est mal orthographié ou fait référence à un formulaire inexistant".
          0
          1. je viens de faire à nouveau le test et j'ai le message d'erreur "la procédure property let n'est pas définie et la procédure property get n'a pas renvoyée d'objet". l'erreur vient de cette partie du code:

            'applique le controle à la liste déroulante du formulaire
               Set btnListe = Form!lstFOURNISSEURS!code_frs
            0
            1. Modérateur
              Tu veux faire quoi avec ce code ?
              0
          2. je veux qu'il m'ouvre un formulaire qui contiendra uniquement les infos des fournisseurs sélectionnés dans la liste déroulante.
            0
            1. Modérateur
              tu as déjà mis un filtre à l'ouverture, pas besoin de remettre autre chose sur le bouton sur lequel tu viens d'appuyer...
              0
          • 1
          • 2