Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/11/2010, 17h34   #1
Invité régulier
 
Dan Steely
Inscription : mai 2010
Messages : 14
Détails du profil
Informations personnelles :
Nom : Dan Steely

Informations forums :
Inscription : mai 2010
Messages : 14
Points : 5
Points : 5
Par défaut Liste déroulante qui alimente une autre Liste.

Bonjour
Voila j'ai un problème, bien que j'ai suivi au mieux le tutoriel qui s'y prêtait.

Comme vous pouvez voir sur le doc attaché, j'ai 4 Tables et un formaulaire comportant 2 combox: cmbManager et cmbProject.

Mon souhait serai que lorsque je sélectionne dans cmbManager un nom,
La cmbProject me donne tout les titres de project (Title_Project) dont cette personne s'occupe.

Avec le code ci-dessous, je me retrouve systématiquement quelque soit le nom du manager sélectionné avec tous les titres de projets.

Dans le tuto l'exemple était basée sur un projet à 2 tables...

Merci de votre aide.

karim

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub cmbManager_AfterUpdate()
Dim lngIDMan As Long
Dim SQL As String
 
'verifie que l'on a cliqué sur Manager pour eviter le NULL
If Not IsNumeric(Me!cmbManager) Then Exit Sub
' Affecte la valeur de ID_Manager à la variable lngIDCat
 lngIDMan = Me!cmbManager
 '' Construit la chaîne SQL avec lE mANAGER concerné IDmanager, 
 
SQL = "SELECT distinct ID_Manager_Project, Title_Project, IDManager from NN_MAnager_Project, IT_Project_Manager, IT_Project_Title WHERE IDManager =" & lngIDMan & " order BY Title_Project"
 
'' Affecte la chaîne SQL à la liste des métiers
cmbProject.RowSource = SQL
  '' Déverrouille la liste des métiers
cmbProject.Enabled = True
  '' Donne le focus la liste des métiers
cmbProject.SetFocus
  '' Déroule la liste des métiers
cmbProject.Dropdown
 
End Sub
Fichiers attachés
Type de fichier : pdf État1.pdf (90,4 Ko, 7 affichages)
steelydan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 18h25   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 443
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 443
Points : 7 512
Points : 7 512
Ton SQL ressemble à un produit croisé c-à-d que tu prend tous les enrs de toutes tes tables. Il n'y a aucune jointure.

La solution la plus simple avec le SQL d'Access c'est de demander à Access de te l'écrire. Va dans l'éditeur de requête, monte ta requête en mode conception puis change l'affichage pour SQl. Ainsi tu peux voir ce que Access attend et le lui donner.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 20h21   #3
Invité régulier
 
Dan Steely
Inscription : mai 2010
Messages : 14
Détails du profil
Informations personnelles :
Nom : Dan Steely

Informations forums :
Inscription : mai 2010
Messages : 14
Points : 5
Points : 5
Bonsoir,

Merci pour ta réponse j'ai pu reproduire le code avec ta méthode nickel ça fonctionne bien.
Par contre j'ai 2 petites questions additionnelles:

1) Comment puis-je découpé en plusieurs lignes cette commande sql sous VBA ? histoire d'eviter de faire l'essuie glace...
2) Je voudrais ajouter une liste déroulante sur les mêmes critères qui affiche la date de création du projet qui se trouve dans la table NN_manager_Project, quelle serait ta méthode ? dois-je ajouter un évènement sur la 2 eme combox cmdProject qui pointe une nouvelle liste déroulante ? Ou alors me servir de cet évènement pour afficher la nouvelle liste?

Code :
SQL = "SELECT IT_Project_Manager.Manager, IT_Project_Title.Title_Project FROM (IT_Project_Title INNER JOIN IT_Project ON IT_Project_Title.ID_Title_Project = IT_Project.Titel_Project) INNER JOIN (IT_Project_Manager INNER JOIN NN_MAnager_Project ON IT_Project_Manager.ID_Manager = NN_MAnager_Project.IDManager) ON IT_Project.ID_Project = NN_MAnager_Project.IDProject WHERE ID_Manager =" & lngIDMan & " ORDER BY Title_Project"
steelydan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 20h56   #4
Membre actif
 
Homme David
Inscription : septembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme David
Localisation : France

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : septembre 2007
Messages : 353
Points : 195
Points : 195
Bonsoir,

1) en utilisant le & _

Code :
1
2
3
4
5
6
SQL = "SELECT IT_Project_Manager.Manager, IT_Project_Title.Title_Project " & _
" FROM (IT_Project_Title INNER JOIN IT_Project ON IT_Project_Title.ID_Title_Project = IT_Project.Titel_Project) " & _
"INNER JOIN (IT_Project_Manager INNER JOIN NN_MAnager_Project ON " & _
"IT_Project_Manager.ID_Manager = NN_MAnager_Project.IDManager) ON " & _
"IT_Project.ID_Project = NN_MAnager_Project.IDProject " & _
" WHERE ID_Manager =" & lngIDMan & " ORDER BY Title_Project"
par exemple, c'est pas forcément bien découpé mais voilà le principe

par contre attention aux espaces, je te conseille de mettre un debug.print de ton sql car une erreur n'est pas tjs flagrante!

2) il faut procéder de la même manière, càd qu'il faut mettre à jour la 3ème liste sur un évènement de la 2ème
damalaan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 21h02   #5
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 443
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 443
Points : 7 512
Points : 7 512
Citation:
1) Comment puis-je découpé en plusieurs lignes cette commande sql sous VBA ? histoire d'eviter de faire l'essuie glace...
Code :
1
2
3
SQL = "SELECT IT_Project_Manager.Manager, IT_Project_Title.Title_Project"
sql = sql & "  FROM (IT_Project_Title INNER JOIN IT_Project ON IT_Project_Title.ID_Title_Project = IT_Project.Titel_Project) INNER JOIN (IT_Project_Manager INNER JOIN NN_MAnager_Project ON IT_Project_Manager.ID_Manager = NN_MAnager_Project.IDManager) ON IT_Project.ID_Project = NN_MAnager_Project.IDProject"
sql=sql & " WHERE ID_Manager =" & lngIDMan & " ORDER BY Title_Project"
le & est le symbole de la concatenation. Essaye de découper à un endrois logique cela facilite la compréhension. Ici j'ai coupé sur la jointure et sur la clause Where que je considère comme des éléments important de mon SQL. Ils ont un sens en eux-même, même pris hors contexte.

Citation:
2) Je voudrais ajouter une liste déroulante sur les mêmes critères qui affiche la date de création du projet qui se trouve dans la table NN_manager_Project, quelle serait ta méthode ? dois-je ajouter un évènement sur la 2 eme combox cmdProject qui pointe une nouvelle liste déroulante ? Ou alors me servir de cet évènement pour afficher la nouvelle liste?
Si tes 2 listes paragent le même unique critère (lngIDMan) alors tu peux le faire ici en ajoutant le code pour gérer la seconde liste.

Si tu veux combiner 2 choix successifs, (je n'ai pas bien compris ton besoin) il faut le faire à 2 places.

Afin de rendre le code plus lisible tu pourrais faire 2 sub private pour gérer la liste 1 et la liste 2.

Dans l'événement tu aurais un truc du genre :

Code :
1
2
call MAJ_Liste1()
call MAJ_Liste2()
C'est une pratique recommandée de gardrer tes fonctions et procedures simples. C-à-d n'effectuant qu'une seule tâche à la fois.

Un bon truc est d'essayer de la nommer avec un verbe d'action ou assimilié et un attribut comme ici MAJ_Liste1().

Si tu ne sépare pas cela donne MAJ_Liste1_Liste2.

Si tu as une fonction/procedure que tu peux nommer MAJListe_OuvrirMAil_CommanderCafe_RepasserLinge_ReserverRestaurant_GererRDV ou c'est ta secrétaire ou elle fait probablement trop de chose :-).

Évidement il faut éviter de tricher en choisissant TraiterDonnees() qui couvre 100% des actions de ton logiciel :-).

Attention aussi à la sur-décomposion : c-à-d une fonction qui appele une function qui appele une fonction qui appele une fonction qui appele une fonction ... qui appele une instruction.
Personnelement passer 3 niveaux d'imbrication j'ai du mal à suivre.

À mon avis un très bon livre sur ces sujets est Code Complete de MIcrosoft Press.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 17h36   #6
Invité régulier
 
Dan Steely
Inscription : mai 2010
Messages : 14
Détails du profil
Informations personnelles :
Nom : Dan Steely

Informations forums :
Inscription : mai 2010
Messages : 14
Points : 5
Points : 5
Par défaut Merci

Merci Beaucoup Messieurs pour votre aide, quand à la secrétaire elles sont plusieurs et très busy à maintenir la machine à café en marche.
Elle tombe souvent en rade...(machines à capsules, c’est pas top), pour le repassage je repasserai une autre fois, elles sont déjà en mains.

A+
merci encore
steelydan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h40.


 
 
 
 
Partenaires

Hébergement Web