Trois liste dependantes urgent :-)
Utilisateur anonyme -
j'ai trois listes deroulantes dependantes.
voici le code que j'ai mis:
Dim StrSql As String
'MsgBox Modi1.Value
StrSql = StrSql + "SELECT * FROM Contacts WHERE NomSociete = '" & Modi1.Value & "';"
Modi2.RowSource = StrSql
Modi2.Requery
End Sub
Private Sub Modi2_Change()
Dim StrSql As String
'MsgBox Modi1.Value
StrSql = StrSql + "SELECT num_machine FROM Requete_entier WHERE NomSociete = '" & Modi1.Value & "' and "
StrSql = StrSql + " Ref_contact ='" & Modi2.Value & "';"
Modi3.RowSource = StrSql
Modi3.Requery
End Sub
Private Sub Modi3_Change()
Me.Form_Requete_entier.Visible = True
End Sub
Private Sub Form_Open(Cancel As Integer)
Me.Form_Requete_entier.Visible = False
End Sub
demandez moi plus d'explication si vous avez besoin mais c'est la derniere etape de ma base donc merci
Configuration: Windows XP Internet Explorer 6.0
- Trois liste dependantes urgent :-)
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Liste des appareils connectés - Guide
- Liste caractères spéciaux word - Guide
24 réponses
- 1
- 2
Trois listes déroulantes dépendantes dans une base Access utilisent un code qui construit dynamiquement des requêtes SQL pour alimenter les RowSource et déclencher les requery des listes suivantes.
Plusieurs messages insistent sur la vérification de la concaténation des chaînes et des guillemets, l’assemblage correct de StrSql et l’usage du WHERE pour limiter les résultats selon les valeurs sélectionnées.
D'autres abordent les problèmes de formats de date (dd/MM/yyyy vs mm/jj/yyyy) et suggèrent d'unifier l'approche en remplaçant les trois champs par un seul critère 'type d'intervention' pour simplifier les dépendances, clarifiant le masque de saisie.
Alors voilà, ici au Québec (du moins dans mon village de banlieu ) nous avons eu une
fin de semaine toute en soleil, alors tu comprendras que j'ai pour ainsi dire passer ma
fin de semaine à l'extérieur pour faire du jardinage. Et oui, l'horticulture est ma deuxième
passion. Cette année je dépasserai les 200 fleurs de couleurs diverses qui vont envahir
mon espace de vie à la maison. Ça me rend tout joyeux :-)
Donc, si je comprends bien ton besoin, tu as 3 listes déroulante qui serve à cibler une fiche
client. En fait pour ma part, la solution me sembla assez simple. La deuxième et la troisième
liste devarit être accroché sur des requêtes qu'il faut modifier par programmation.
Dans l'évènement [ Après mise à jour ] de la première liste, tu modifie la reqête de la deuxième
liste comme je te l'ai montré, et en second lieu, dans l'évènement [ Après mise à jour ] de
la deuxième liste déroulante tu modifie la requête de la troisième liste déroulante en tenant
compte ou non de la première liste et en tenant compte de la deuxième liste.
L'évènement [ Après mise à jour de la troisième devarit alors pointer la(es) fiche(s) client(s) désirée(s).
Est-ce bien ce que tu cherche à faire ?
Lupin
C'est exactement ce que je cherchais a faire et ce matin quelqu'un m'as donne une reponse qui fonctionne tres bien et qui n'est pas tres eloignee de ce que tu me dis voila ce qu'il m'a dit:
Private Sub Modi1_Click()
Dim StrSql As String
'MsgBox Modi1.Value
StrSql = StrSql + "SELECT * FROM Contacts WHERE NomSociete = '" & Modi1.Value & "';"
Modi2.RowSource = StrSql
Modi2.Requery
End Sub
Private Sub Modi2_Click()
Dim StrSql As String
''MsgBox Modi1.Value
'StrSql = StrSql + "SELECT num_machine FROM Requete_entier WHERE NomSociete = '" & Modi1.Value & "' and "
'StrSql = StrSql + " Nomcontact ='" & Modi2.Value & "';"
''MsgBox Modi2.Text
'Modi3.RowSource = StrSql
''Modi3.Requery
StrSql = "Select Num_Machine from Requete_machine where nomcontact = '" & Modi2.Text & "';"
Modi3.RowSource = StrSql
Modi3.Requery
End Sub
Private Sub Modi3_Click()
Me.Form_Requete_entier.Visible = True
End Sub
Private Sub Modi3_Change()
Me.Form_Requete_entier.Visible = True
End Sub
voila par contre je pense qu'un peu plus tard, il faudra que je rajoute une 4eme liste donc si tu avais une proposition......
Car ce que tu m'avais conseille de faire au depart marchait super bien mais j'ai fait une modif et ca ne foonctionnait plus voila
en tout cas merci beaucoup!!!! :-)
L'exemple qui tu as trouvé me semble très bien. Personnellement
je préfère la mienne car elle ne modifie pas le nombre d'enregistrement
en cours mais permet de cibler l'un d'eux très précisément.
Dans l'exemple cité, le nombre d'enregistrements diminue après chaque
sélection d'une liste à l'autre.
Soit tu continue avec cette méthode, soit tu revise les étapes de création
selon mon modèle [ Vidéo.mdb ]. Tu as à l'intérieur de cette base plusieurs
exemple de liste déroulante qui modifie une requête par programmation.
Il te suffit d'imbriquer les actions sur les requêtes des listes déroulante.
Si tu n'y arrive pas, dépose ta BD sur ci-joint et je la regarderai !
Lupin
j'ai un sous formulaire qui est une fiche d'intervention. Sur cette fiche, j'ai les options interventions par telephone,mail ou telesurveillance, options que je coche. Le choix de la fiche est toujours conditionne par 3 listes.
Ma question: comment puis -je faire pour avoir dans une de mes liste, le choix 'par telephone' par mail et par telesurveillance et ainsi avoir deja une premiere selection pour ma liste suivante???
merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionje m'explique difficilement que tu ne puisse réaliser ce problème puisque la méthode de
modification de requête par programmation résout tous ces genres de problème. Depuis
que j'ai trouvé cette astuce dans mon bouquin, je l'utilise à toutes les sauces et ça
fonctionne toujours.
J'y vois quelques possibilité :
1.) Sois utiliser une liste déroulante à multicolonne ( plutôt ardu si je cerne bien tes connaissances )
2.) Imbriquer une nouvelle liste déroulante selon le même principe de modification de requête
3.) Sois implanter une requête qui pointe sur 2 tables avec une liason sur le type d'interventions.
Lupin
En fait j'etais parti pour faire une table dans laquelle j'avais telemaintenance(oui/non), par telephone(oui/non) etc.....et je ne voyais pas comment faire une liste deroulante a partir de ces choix
Or en fait, solution toute simple que j'ai trouve 1 demi heure avant de partir, j'ai remplace les 3 champs precedents par un seul champ 'type d'intervention' et ca va tout simplifier au final
Merci quand meme mais t'eloigne pas trop loin je crois que j'aurais encore besoin de tes lumieres......
:-)
oui, je suis levé, mais il est l'heure du diner pour moi, et cette après-midi
je suis sur un dossier chaud, je dois relever un environnement à distance
je ne serai donc pas disponible.
Quand je suis sur le hot-line je puis me permettre de participer un peu au forum
dépendament de la charge de travail. J'ai avec le temps réussi à convaincre
mon patron que je suis devenu expert VBA en naviguant sur certains forums,
à résoudre les problèmes soumis, bien sur j'ai suivi des cours de VB et VBS mais
jamais de VBA. Mes bouquins et ma tenacité ont produit ce que je suis devenu.
Bien entendu, ce n'est pas donné à tous d'avoir cette chance, mais avec un
bon dossier d'arguments et des résultats spectaculaires, mon patron accepte
ce compromis.
Laisse-moi quand même tes infos, comme toujours si je puis aider, ce sera
un plaisirs, mais peut-être pas avec rapidité.
Comme dit l'un de mes menthors Jean-Claude Bellamy. "Le savoir croit avec le partage de connaissance."
@+
Lupin
https://www.cjoint.com/?fCp2vPjBBG
voila le bout qui pose probleme: je n'arrive pas a avoir de preselection je crois en fait car les autres problemes sont en partie regles
(juste pr information quand il s'agit de "REDONDO" ce n'est pas le bon numero machine!)
en tout cas je te remercie beaucoup pour toute l'aide deja apportee :-)
et d'autre part j'en suis toujours au meme point c'est a dire que pour l'instant je n'arrive toujours pas a faire la preselection dans mes listes
il y aura encore un autre probleme apres celui la mais je cherche, je cherche sans trouver pour l'instant
voila ou en est la base donc je profite de ce temps libre pour taper mon rapport de stage !!!
le voila :-) merci d'y regarder malgre que tu n'ais pas beaucoup de temps
alors j'ai jeté un premier coup d'oeil !
Chaque liste modifiable du formulaire [ F_hotline ] est codé par une requête qui lui est intégré.
Si je comprends bien, tu ceux que le sous-formulaire modifie la listes des enregistrements en fonction
des choix effectués dans les 3 listes modifiables.
Ton sous-formulaire est accroché sur les 3 listes modifiables.
Comme j'ai soulevé dans le passé. Moi j'accrocherais le sous formulaire sur une requête ayant les
3 paramètres du contenu de liste modifiable, et après chaeur mise à jour d'une liste, je ferais
reconstruire le requête qui effectuerait le mise à jour de ton sous-formulaire.
Construit une requête ayant un critère de recherche sur chacun des paramètres représenté par
le 3 listes, passe en mode SQL et place un copier/coller du code SQL générer.
@+
Lupin
Dim StrSql As String
StrSql = StrSql + "SELECT distinct Num_machine FROM machine "
StrSql = StrSql + " AND Nomsociete = '" & Chx_Soc.Value & "';"
Chx_Machine.RowSource = StrSql
Chx_Machine.Requery
End Sub
voila le code que j'avais mis donc je vais essaye avec une requete unique et je te dis ce que ca donne
Private Sub Chx_soc_Change()
Dim StrSql As String
StrSql = StrSql + "SELECT distinct Num_machine FROM R_soc+num_mach "
StrSql = StrSql + " AND Nomsociete = '" & Chx_Soc.Value & "';"
Chx_Machine.RowSource = StrSql
Chx_Machine.Requery
End Sub
si jamais tu as une solution je crois que je prendrais volontiers!!
les lignes :
StrSql = StrSql + "SELECT distinct Num_machine FROM R_soc+num_mach "
StrSql = StrSql + " AND Nomsociete = '" & Chx_Soc.Value & "';"
je ne peux vérifier la syntaxe, celle-ci ne reconnais pas les objets cités ?
avant de la construire en dynamique, construit la en static, de façon à cibler
un enregistrement.
une fois celle-ci monté, repère les mots clés qui devront être remplacé par des
variables et une fois là tu peux reconstituer la requête.
Dans la requête que tu essais d'opérer, il n'y a pas de clause [ Where ] !!!
StrSql = ""
StrSql = StrSql + "SELECT ..."
StrSql = StrSql + "FROM ..."
StrSql = StrSql + "WHERE ..."
...
distinct Num_machine -> où est ce champs ?
R_soc+num_mach -> où sont ces tables -> ?
Nomsociete -> où est cette table ?
Lupin
il y a quelque semaines deja, tu avais passe au moins 2 semaines a m'expliquer comment faire pour faire afficher des enregistrement via une selection de dates (on choisit un intervalle de dates et ca nous affiche une liste d'action realisees entre ces deux dates) voila j'avais reproduitle principe pour une autre application et en verifiant hier, je me suis apercu que ca ne marchait pas forcement bien donc est-ce que tu crois que je peux te demander un peu d'aide??
Je suis là mais j'ai une réunion dans 15 minutes et après c'est l'heure du diner.
Copie ton code je vais regarder en après-midi (Hre CA).
Lupin
Sub Test()
'SELECT Machine.[Num_machine], Machine.Type_mach, Machine.Date_install
'FROM machine
'WHERE (((machine.Date_install) >= #11/26/2004# And (machine.Date_install) <= #8/30/2006#))
Dim ChaineSQL As String, Critere1 As String, Critere2 As String
' Critere1 = "#11/26/2004#" ' Pourrait provenir de n'importe où, variable, textbox, etc ...
' Critere2 = "#8/30/2006#"
Critere1 = "#" & Me.Modifiable0 & "#"
Critere2 = "#" & Me.Modifiable2 & "#"
DoCmd.Close acForm, "Choix_dates_install_machine"
ChaineSQL = "SELECT Machine.[Num_machine], Machine.Type_mach, Machine.Date_install"
ChaineSQL = ChaineSQL & " " & "FROM machine "
ChaineSQL = ChaineSQL & "WHERE (((machine.Date_install)>=" & Critere1 & " "
ChaineSQL = ChaineSQL & "And (machine.Date_install)<=" & Critere2 & ")) "
ChaineSQL = ChaineSQL & "ORDER BY Machine.Date_install;"
If (ChangeRequeteDef("R_Machine", ChaineSQL)) Then
DoCmd.OpenForm "F_result_intervalle_machine", acNormal, "", "[Date_install]", , acNormal
End If
End Sub
'
Public Function ChangeRequeteDef(ChaineRequete As String, ChaineSQL As String) As Boolean
Dim Definition As Variant
If ((ChaineRequete = "") Or (ChaineSQL = "")) Then
ChangeRequeteDef = False
Else
Set Definition = CurrentDb.QueryDefs(ChaineRequete)
Definition.SQL = ChaineSQL
Definition.Close
RefreshDatabaseWindow
ChangeRequeteDef = True
End If
End Function
'
Private Sub Modifiable0_Change()
End Sub
Private Sub Modifiable2_AfterUpdate()
If (Me.Modifiable2.Text <> "") Then
Me.Modifiable0.SetFocus
If (Me.Modifiable0.Text <> "") Then
Me.Modifiable2.SetFocus
Call Test
End If
End If
End Sub
'
'Private Sub Modifiable0_AfterUpdate()
'
' If (Me.Modifiable0.Text <> "") Then
' Me.Modifiable2.SetFocus
' If (Me.Modifiable2.Text <> "") Then
' Me.Modifiable0.SetFocus
' Call Test
' End If
' End If
'
'End Sub
''
Alors j'ai testé la reconstitution de la requête et je n'y trouve aucune erreur.
Je serai tenter de penser comme toi, qu'il s'agit d'un problème de format de date.
Pour ces lignes :
Critere1 = "#" & Me.Modifiable0 & "#"
Critere2 = "#" & Me.Modifiable2 & "#"
Tu pourrais essayer :
Critere1 = "#" & CDate(Me.Modifiable0) & "#"
Critere2 = "#" & CDate(Me.Modifiable2) & "#"
pour forcer le format date, bien entendu le format des champs dans la table devra être identique.
Tu devras peut-être modifier le type des variables ?
Dim ChaineSQL As String, Critere1 As Variant, Critere2 As Variant
@+
Lupin
Le masque de saisie importe peut avec la ligne écrite ainsi :
Critere1 = "#" & CDate(Me.Modifiable0) & "#"
L'important à mon avis, c'est que tu ais le même type de masque
dans la table et que le champs soit de type [ Date ].
Tu ne placerais pas une pomme dans un panier d'orange?
Il en est de même pour les formats [ Date ]. Il te suffit
d'homologer le tout, que tes champs [ Date ] soient identiques
en [ Type ] et en [ Format ] (masque de saisie) autant dans
la table que dans les formulaire.
@+
Lupin
j'ai donc deux types de fonctions utilisant des dates:
une, ou l'on tape une date dans une textbox et ca affiche toutes les dates superieures; dans cette fonction j'y ai aussi mis la date du jour automatique
par exemple j'ai essaye avec la date d'aujourd'hui, si je mets 09/06/2008 ca ne marche pas et si j'ai 09/06/2008, j'ai la bonne liste avec le format jj/mm/aaaa
ensuite j'ai deux listes pour faire un intervalle de dates et le resultat obtenu n'est pas celui espere
donc je pensais mettre toutes les dates de mes tables en mm/jj/aaaa mais avec mes masque de saisie---> marche pas :-(
j'essaie ce que tu m'as mis mais ca ne change pas beaucoup le resultat
voila :-)
Et de quel façon est défini la date dans les paramètres [ Options régionales et linguistiques ] ?
J'ai fait des test avec ma BD Vidéo et ça fonctionne !
Lupin
Moi, je configure toujours mes champs [ Date ] de tables selon cette même configuration.
Ainsi, il n'y a pas de confusion lorsque j'utilise des fonctions de dates.
Je te suggère au moins de l'essayer !
Fais une copie de ta BD, et modifie les champs Date de façon à respecter la nomenclature
de windows...
Lupin
- 1
- 2
j'ai une premiere liste deroulante dans laquelle je choisis une societe, dans la deuxieme il y a une preselection ou j'affiche tout les noms des contacts lies a la societe, et dans la troisieme normalement j'ai la liste des machines de la societe
quand les 3 champs sont selectionnes, ca m'ouvre la fiche du client
mon probleme c'est que je n'ai pas de preselection pour la liste machine mais si je prends la bonne machine dans la liste ca m'affiche quand meme la fiche client
Le langage: c'est sous access 2000
le type de forme je ne sais pas ce que c'est!
A+