IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Liste déroulante qui alimente une autre Liste. [AC-2010]


Sujet :

IHM

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Points : 12
    Points
    12
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Images attachées Images attachées

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    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+

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"

  4. #4
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    1) en utilisant le & _

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    1) Comment puis-je découpé en plusieurs lignes cette commande sql sous VBA ? histoire d'eviter de faire l'essuie glace...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Points : 12
    Points
    12
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/01/2013, 13h39
  2. [AC-2007] Liste déroulante depend d'une autre liste déroulante
    Par Kaptin dans le forum IHM
    Réponses: 7
    Dernier message: 10/07/2012, 15h23
  3. Réponses: 5
    Dernier message: 20/05/2011, 14h22
  4. Réponses: 14
    Dernier message: 31/08/2010, 11h25
  5. [AC-2007] Liste déroulante qui alimente 1 autre liste
    Par MaryR dans le forum VBA Access
    Réponses: 4
    Dernier message: 04/03/2010, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo