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

Fermé
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013 - 2 mai 2013 à 16:04
 danytall - 14 mai 2013 à 23:24
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
A voir également:

38 réponses

danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
3 mai 2013 à 16:52
ok j'ai supprimé le filtre contenu dans le bouton mais le message d'erreur reviens toujours dans le même code de tout à l'heure
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
3 mai 2013 à 16:55
Dans ton code, supprime tout ce qu'il y a après le openform, ça ne sert à rien...
Essaye d'ouvrir le formulaire sans le filtre et si ça marche, rajoute le filtre.
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
3 mai 2013 à 17:07
Sans le filtre ça fonctionne normalement dans la mesure où il ne m'affiche aucune infos mais lorsque que je fais le filtre il m'affiche tous les fournisseurs sans prendre en compte ma sélection
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
3 mai 2013 à 21:44
donc le form s'ouvre.
pour le reste, c'est donc bien un problème avec le filtre, il est sûrement mal formaté, d'où l'importance de bien regarder ce qu'il y a dans le msgbox...
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
3 mai 2013 à 21:49
je comprends plus rien qu'est ce que je dois faire alors?
0
Bonsoir, ou bonjour, à tous les deux
DanyTall! L'écriture de ton critère est bien trop compliquée, au point que personne ne s'y retrouve. Il faut, sinon alléger l'écriture au moins la rendre plus claire en sériant les valeurs selon les conditions de sorte qu'il n'en reste qu'une seule au moment de l'entrer dans ta ligne OpenForm
L'énoncé de la ligne est
DoCmd.OpenForm "NomDuFormulaire", "",..., "[CritereSelection] = (ValeurMonCritere)", ...

tu écris:
strFiltre = "" 

.... (Je passe ... )
  If strFiltre <> "" Then     
( mais tu as déjà initialisé auparavant strFiltre = "" )
 strFiltre = strFiltre & " or " strFiltre = strFiltre & "[Code frs]='" & _ 

( maintenant, tu complètes : strFiltre = strFiltre .... mais la valeur de strFiltre est normalement "ChaineVide" donc Access a sauté l'étape ou bien il te sort strFiltre = ChaineVide )
( Et tu y ajoute un "or ", que vient-il faire ici, ou bien quoi ? et aucun de tes codes fournisseurs ne commence par or)

(Dès lors, si tu as une conditionnelle pour la valeur en cours de determination de ton "strFiltre" le mieux serait que tu aies un iif() de façon à ce qu'à la fin de parcourt tu puisses avoir une écriture qui ressemble à l'écriture type avec la valeur du critère déterminée et non pas flottante.
 Me!lstFOURNISSEURS.ItemData(varI) & "'"


Enfin, il me parait indispensable de mettre un point d'arrêt qq part pour que tu puisses suivre pas à pas le déroulé de ton code, en particulier la prise de valeur de ton "strFiltre" qui est vraiment problématique.
En espérant avoir un peu contribué à votre recherche.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
6 mai 2013 à 09:23
Bonjour,

j'ai bien noté ta remarque sauf que si tu veux je connais pas du tout VB avec Access du coup ce que tu me demande de faire j'arrive pas à le cerner.
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
13 mai 2013 à 10:17
Bonjour à tous,

je reviens avec un autre soucis sur mon code VB Access. N'ayant pas jusque là trouvé de solution sur mon problème précédent j'ai alors décidé de passer à autre chose qui semble bien marché mais j'ai deux débogages lors de l'exécution et je n'ai aucun affichage des informations que je veux récupérer sur les éléments sélectionnés dans mon état.
Je m'explique: J'ai fais deux listes déroulantes, une qui contient la liste des éléments à sélectionner (lstfrs) et une autre (lstfrsselectionnes) qui contiendra les éléments sélectionnés dans la liste "lstfrs" via des boutons de bascules que j'ai créé. Une fois que la bascule des éléments sélectionnés établi, je fais un clique sur le bouton "ok" qui me donne directement l'état de ces éléments. J'ai fais pour mon code un module standard qui contient toute la partie initialisation et dans le module du formule j'ai fais le code d'exécution même du processus. J'ai souligné et mis en gras les lignes où j'ai un débogage:

Voici mon code:

Code contenu dan le module standard:

' -----------------------------
' INITIALISATION DES SELECTIONS
' -----------------------------
' Entrée : strTableCible     <- Nom de la table dont
'                               on veut sélectionner les lignes
'          strClefPrimaire   <- Nom de la clef primaire de la table cible.
'          strTableSelection <- Nom de la table de sélection
'          strWhere          <- Clause Where optionnelle
'

Sub InitialiserSelection( _
  ByVal strTable As String, _
  Optional ByVal strClefPrimaire As String, _
  Optional ByVal strTableSelection As String = "Table sélection", _
  Optional ByVal strWhere As String = "")
  

  ' Vider la table des sélections
  'strTableSelection = "[" & strTableSelection & "]"
  'CurrentDb.Execute "DELETE * FROM " & strTableSelection & ";"
 
  ' Renseigner les nouvelles valeurs
  ' de la table des sélections
  Dim strSQL As String
  strSQL = "INSERT INTO " & strTableSelection & " (ID frs, Sélectionné)" _
  & " SELECT [" & strClefPrimaire & "],True" _
  & " FROM [" & strTable & "]"
  If strWhere <> "" Then strSQL = strSQL & " WHERE " & strWhere
  CurrentDb.Execute strSQL (1er débogage: Message d'erreur: "Erreur de syntaxe dans l'instruction INSERT INTO")
End Sub

' -------------------------------
' SELECTIONNER TOUTES LES LIGNES
' -------------------------------

Sub ToutSelectionner( _
  Optional ByVal strTableSelection As String = "Table sélection")
 
  CurrentDb.Execute "UPDATE [" & strTableSelection & "] SET [Sélectionné] = True;"
End Sub

' --------------------------------
' DESELECTIONNER TOUTES LES LIGNES
' --------------------------------

Sub ToutDeselectionner( _
  Optional ByVal strTableSelection As String = "Table sélection")
 
  CurrentDb.Execute "UPDATE [" & strTableSelection & "] SET [Sélectionné] = False;"
End Sub

' --------------------------------
'INVERSER LA SELECTION D'UNE LIGNE
' --------------------------------

Sub InverserSelection( _
    ByVal lngNumero As Long, _
    Optional ByVal strTableSelection As String = "Table sélection")

  Dim strSQL As String
  strSQL = "UPDATE [" & strTableSelection & "] SET [Sélectionné] = TRUE" _
  & " WHERE [ID frs] = " & lngNumero
  CurrentDb.Execute strSQL
End Sub


' ------------------------------
' COMPTER LE NOMBRE DE SELECTION
' ------------------------------
Function NombreSelections( _
    Optional ByVal strTableSelection As String = "Table sélection") As Long
   
    NombreSelections = DCount("*", strTableSelection, "[Sélectionné] = True")
    
End Function


Code contenu dan le module du formulaire:
'
 ------------------------
' CHARGEMENT DU FORMULAIRE
' ------------------------
Private Sub Form_Load()
    InitialiserSelection "FOURNISSEURS", "ID frs", "Table sélection"
    MiseAJourListes
End Sub

' ----------------------
' MISE A JOUR DES LISTES
' ----------------------
Private Sub MiseAJourListes()
    Me.lstfrs.Requery
    Me.lstfrsselectionnes.Requery
End Sub


' --------------------------
' SELECTION D'UN FOURNISSEUR
' --------------------------
Private Sub btnselectionun_Click()

   InverserSelection Me.lstfrs.Value
    'TransfererUn Me.lstfrs, Me.lstfrsselectionnes
    MiseAJourListes
End Sub

' ----------------------------
' DESELECTION D'UN FOURNISSEUR
' ----------------------------
Private Sub btndeselectionun_Click()

    InverserSelection Me.lstfrsselectionnes.Value (2ème débogage: Message d'erreur: Utilisation incorrecte de NULL)
    'TransfererUn Me.lstfrsselectionnes, Me.lstfrs
    MiseAJourListes
End Sub

' ----------------------------------
' SELECTION DE TOUS LES FOURNISSEURS
' ----------------------------------
Private Sub btnselectiontout_Click()
    ToutSelectionner
    MiseAJourListes
End Sub

' ------------------------------------
' DESELECTION DE TOUS LES FOURNISSEURS
' ------------------------------------
Private Sub btndeselectiontout_Click()
    ToutDeselectionner
    MiseAJourListes
End Sub

' --------------------------------------------
' DOUBLE-CLIC POUR SELECTIONNER UN FOURNISSEUR
' --------------------------------------------
Private Sub lstfrs_DblClick(Cancel As Integer)
    btnselectionun_Click
End Sub

' ----------------------------------------------
' DOUBLE-CLIC POUR DESELECTIONNER UN FOURNISSEUR
' ----------------------------------------------
Private Sub lstfrsselectionnes_DblClick(Cancel As Integer)
    btndeselectionun_Click
End Sub
' -----------------------
' FERMETURE DU FORMULAIRE
' -----------------------
Private Sub btnannuler_Click()
    DoCmd.Close
End Sub
' ------------------------
' VALIDATION DU FORMULAIRE
' ------------------------
Private Sub btnok_Click()
    ' Est-ce qu'on a sélectionné au moins 1 fournisseur ?
    If NombreSelections() = 0 Then
        MsgBox "Vous n'avez sélectionné aucun fournisseur !", vbExclamation
        Exit Sub
    End If
   
    ' Fermer le formulaire et ouvrir l'état des fournisseurs
    DoCmd.Close
    DoCmd.OpenReport "rapport frs", acViewPreview, , "[Sélectionné] = True"
End Sub


Je vous remercie d'avance de votre aide.

Dany
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
13 mai 2013 à 10:35
ID frs, Sélectionné sont de quels types ?

Que donne un msgbox strsql avant le execute sql ?
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
Modifié par danytall le 13/05/2013 à 11:23
ID frs est une clé primaire donc de type Numauto, Séléctionné est de type case à caucher (oui/non) et le msgbox avant le Execute strSQL me done "INSERT INTO Table sélection (ID frs, Sélectionné) SELECT [ID frs] TRUE FROM [FOURNISSEURS]
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
13 mai 2013 à 11:33
bien que ce que tu me donnes ne soit pas vraiment l'exacte copie de ce que tu devrais avoir (je pense aux crochets de la table table selection, par exemple), essaie d'enquoter le TRUE...

Quand au NULL, il faut tester la valeur de Me.lstfrsselectionnes.Value avant de faire quoi que ce soit.

If ISNULL(Me.lstfrsselectionnes.Value) then ...

Access, comme beaucoup de concepts informatiques, n'a pas de valeur par défaut pour les objets. Lorsqu'ils ne contiennent pas de valeur, il sont généralement à NULL.
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
Modifié par danytall le 13/05/2013 à 11:48
Désolé mais qu'est ce que ça voudrait dire "enquoter le TRUE?" je ne connais pas l'expression. Et pour les crochets de la table sélection je ne les avais pas dans le msgbox amis je vais tester ce que tu viens de me dire puis revenir vers toi. Et le if isnull...je le place où dans mon code?
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
Modifié par blux le 13/05/2013 à 13:44
Ta zone oui/non doit sûrement attendre une valeur entre 'simple guillemet' (quote en anglais), comme tu le ferais avec une chaine de caractères...

& " SELECT [" & strClefPrimaire & "],'True'" _

Le isnull doit être mis avant de se servir de l'objet. Par contre, tu dois gérer le cas où l'objet n'a pas de valeur...
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
13 mai 2013 à 14:38
Après avoir enquoté le "TRUE", je pense que le premier problème est résolu j'arrive maintenant à faire la bascule mais dans un seul sens, c'est-à-dire que je peut sélectionner un ou plusieurs éléments de la liste "lstfrs" et les faire basculer dans la liste "lstfrsselectionnes" mais je peux pas faire l'inverse. Par contre comme je te l'avais dit je suis pas vraiment expert en la matière du coup j'ai du mal avec la mise en place du isnull, franchement si tu peux m'aider en me l'insérant dans mon code de façon à ce que je comprenne cela m'aiderai énormément sinon voici comment j'ai procédé:

' ----------------------------
' DESELECTION D'UN FOURNISSEUR
' ----------------------------
Private Sub btndeselectionun_Click()
    
    If IsNull(Me.lstfrsselectionnes.Value) Then
    InverserSelection Me.lstfrsselectionnes.Value
    MiseAJourListes
    End If
    
End Sub
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
13 mai 2013 à 14:50
Le problème du 'null' est que lorsque tu lances ton application, lstfrsselectionnes n'a pas de valeur sélectionné, donc est 'null'.
Tu dois donc agir avant de t'en servir. Pour cela, deux manières possibles :

- à l'ouverture du formulaire, tu positionnes lstfrsselectionnes a une valeur et tu pourras ensuite t'y référer
- avant de récupérer la valeur de lstfrsselectionnes, tu testes si sa valeur est nulle (avec isnull), dans le cas où c'est vrai, tu dois te débrouiller pour gérer une action en conséquence de cette absence de valeur.
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
13 mai 2013 à 15:05
lstfrsselectionnes est la liste que je veux alimenter par les éléments de la liste "lstfrs" qui à l'ouverture du formulaire comporte déjà tous les éléments à sélectionner. Mais dans ta deuxième hypothèse c'est dans quelle partie du code je dois insérer cette condition et je sais pas comment la formuler en VB ACCESS. N'aurais - tu pas un bout de code à me proposer s'il te plais?
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
13 mai 2013 à 15:13
La première fois que tu dois utiliser lstfrsselectionnes, tu dois vérifier s'il est null ou pas.
S'il est null, c'est à toi de savoir ce que tu dois faire en termes de traitement, je ne peux pas t'aider pour ça...
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
13 mai 2013 à 15:18
ok mais le test je le fais où exactement?
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
13 mai 2013 à 15:28
La première fois que tu dois utiliser lstfrsselectionnes
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
13 mai 2013 à 15:58
je pense que je ne m'en sors pas du tout car je vois ,pas comment m'y prendre
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
13 mai 2013 à 16:01
j'aimerai bien pouvoir arriver à résoudre ce problème c'est une base de données que je dois rentre dans peux de jours (stage)
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
13 mai 2013 à 16:13
Dans le code que tu as mis, tu signales une erreur à propos d'une valeur nulle que possède un objet de ta base.

Avant de te servir de cet objet, il est DE TON RESSORT de vérifier sa valeur et d'agir en conséquence dans le cas où cette valeur est 'null'.

Pose -toi la question de savoir pourquoi cet objet n'est pas initialisé et ce que tu dois faire dans ce cas.
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
14 mai 2013 à 12:07
Bonjour,

je reviens toujours sur mon problème d'hier (message d'erreur Null) que j'ai essayé de contourner je sais pas par quel moyen mais maintenant j'ai un message d'erreur "incompatibilité de type" sur la partie en gras du code:

' ----------------------------
' DESELECTION D'UN FOURNISSEUR
' ----------------------------
Private Sub btndeselectionun_Click()

    InverserSelection Me.lstfrsselectionnes.Value
    'TransfererUn Me.lstfrsselectionnes, Me.lstfrs
    MiseAJourListes
End Sub


Est ce quelqu'un pourrait bien m'aider?

Merci

Dany
0
danytall Messages postés 33 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 14 mai 2013
14 mai 2013 à 17:28
Rebonjour à tous,

j'aimerai savoir comment résoudre un problème de message d'erreur "incompatibilité de type? Voici mon code et l'erreur est signalé dans la ligne en gras.

' ----------------------------
' DESELECTION D'UN FOURNISSEUR
' ----------------------------
Private Sub btndeselectionun_Click()

Dim MSG As String
If IsNull(Me.lstfrsselectionnes.Value) Then

MSG = MsgBox("NULL")
Else  
End If
    InverserSelection Me.lstfrsselectionnes.Value
    MiseAJourListes
End Sub


J'ai aussi un autre problème. En fait j'aimerai avoir l'ouverture d'un Etat qui contient des infos détaillées de tous les éléments contenu dans une liste "lstfrsselectionnes" via un clic. Ces infos détaillés sont dans la requete "selection frs". J'ai fais un Etat en mode création "rapport frs", j'aimerai savoir comment le paramétrer pour qu'il soit alimenter par les infos détaillées des éléments de "lstfrsselectionnes"? Voici le code que j'ai fais mais il s'exécute à moitié c'est à dire que je n'ai que le msgbox "vous n'avez sélectionné aucun fournisseur":

' ------------------------
' VALIDATION DU FORMULAIRE
' ------------------------
Private Sub btnok_Click()
    ' Est-ce qu'on a sélectionné au moins 1 fournisseur ?
    If NombreSelections() = 0 Then
        MsgBox "Vous n'avez sélectionné aucun fournisseur !", vbExclamation
        Exit Sub
    End If
   
    ' Fermer le formulaire et ouvrir l'état des fournisseurs
    DoCmd.OpenReport "selection frs", acViewPreview, "[Sélectionné] = True"
End Sub


Merci de votre aide.
0
blux Messages postés 26036 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 mai 2024 3 289
14 mai 2013 à 17:53
Dans ton premier code, tu affiches un message si une valeur est null, mais tu continues à travailler.
Il est probable que le problème se situe à ce niveau...
0
castours Messages postés 2955 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 31 août 2019 217
Modifié par castours le 14/05/2013 à 22:20
Bonjour
comme le projet est bien avancé, je vous laisse a vos reflexions.
Par contre j'ai un exemple de recherche multi criteres qui peut, peut etre vous aider que je mets sur le site.
Cet exemple n'est pas de moi
https://www.cjoint.com/c/CEowoyKovLX
0
Bonjour blux,

encore grand merci pour ton intervention par rapport à mon soucis. Pour réagir à ta remarque je dirai que meme avant d'avoir mis ce code j'avais déjà ce problème et en le mettant cela n' a rien changé à l'exécution du code car j'ai toujours le meme problème. Le comble c'est que je sais pas si le
if isnull(...)
est au bon endroit (comme tu me l'a demandé de le placer avant d'utiliser lstfrselectionnes) et surtout s'il l'expression du code convient.
0
Bonjour Castours,

merci également pour ton intervention par contre je n'arrive pas du tout à lire ton code. voici un aperçu de ce que j'obtiens en cliquant sur le lien:

???Standard Jet DB?????nb' ?U?gr@???~?????1?y??0???c??ßF???N'?7???]?(?-?'?{6n???oCT4?3??y[ .|*??|?
????M?f_???$?g?'D???e???F?x ??-b?T

Est ce qu'il ne serait pas possible d'avoir une version lisible de ce code?

Grand merci encore
0