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 :

Choix par liste déroulante


Sujet :

IHM

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 99
    Points : 67
    Points
    67
    Par défaut Choix par liste déroulante
    Bonjour le forum.


    En tant que débutant sur Access, j’ai une question qui va sans doute vous paraître un peu simpliste. Voici mon problème.



    J’essaye de faire une base de donnée de films. Ainsi, j’ai une table réalisateur (IDRéal, NomDuRéal), une table Film (IDFilm, Titre), et une table de Jonction (IDRéal, IDFilm). (Relation plusieurs à plusieurs)



    J’ai un formulaire d’ajout de film qui contient lui-même un sous-formulaire Réalisateur pour pouvoir ajouter directement le réalisateur lié au film sur ce formulaire.

    Sur ce même sous-formulaire, j’ai donc une liste déroulante qui contient le nom des réalisateurs déjà dans la table Réalisateur.



    Lorsque je sélectionne un réalisateur pour un nouveau film, celui-ci était automatiquement ajouté à ma table des réalisateurs, même si celui-ci existe déjà (doublons).

    J’ai donc indexé cette valeur, mais à présent, Access m’interdit d'entrer une valeur non existant dans la liste. Autoriser les modifications de la liste de valeur est pourtant à Oui dans les paramètres de la liste déroulante



    En fait, ce que je voudrais, c’est pourvoir sélectionner un réalisateur qui existe déjà dans ma liste déroulante, et si il n’existe pas encore, l’ajouter à la table des réalisateurs



    Merci de votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 348
    Points : 19 600
    Points
    19 600
    Billets dans le blog
    65
    Par défaut
    Salut,

    Il me semble que tu dois agir sur l'évènement absence dans liste (NotInList):

    Peut-être avec ceci ?

    D'autre part tu dis :

    J’ai un formulaire d’ajout de film qui contient lui-même un sous-formulaire Réalisateur pour pouvoir ajouter directement le réalisateur lié au film sur ce formulaire.
    Sur quelle table est basé ton sous-formulaire Réalisateur ?

    A+

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 99
    Points : 67
    Points
    67
    Par défaut
    Bonjour User, et merci de ta réponse.

    Mon sous formulaire Réalisateur est basé sur la table Réalisateur.
    J'ai l'impression que ce n'est pas la bonne façon de faire, parce que la macro événementielle ne s'enclenche jamais...

    D'ailleurs, je ne sais pas ce que j'ai modifié, mais à présent, j'ai l'index du réalisateur qui s'affiche après avoir sélectionné un réalisateur dans la liste, et non plus son nom...

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 348
    Points : 19 600
    Points
    19 600
    Billets dans le blog
    65
    Par défaut
    Salut,

    Il faut baser ton sous-formulaire sur la table jonction.

    De plus, apparemment un film peut avoir plusieurs réalisateurs ?

    Enfin il faut bien préciser tes index (clés primaires..) en gras :

    la table réalisateur (IDRéal, NomDuRéal),
    la table Film (IDFilm, Titre),
    et une table de Jonction (IDRéal, IDFilm). (Relation plusieurs à plusieurs)

    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    Si tu as l'index qui s'affiche dans la liste au lieu du nom, c'est probablement un problème de largeur de liste et / ou de colonne liée. En effet, il faut bien distinguer la valeur qui est mise en mémoire par la liste (colonne liée dans la propriété de ta liste) et la valeur qui est affichée par la liste. En général, on met en colonne liée l'identifiant alors que l'on affiche le nom. Ainsi, il faut adapter les largeurs de la liste pour masquer à l'affichage l'identifiant et n'afficher que le nom.
    exemple : (0 cm;5cm)

    Pour ajouter un réalisateur qui n'existe pas dans ta liste, tu peux effectivement utiliser l'évènement "absence sur liste". En fait c'est un évènement qui va s'opérer si la valeur saisie dans la liste n'existe pas encore.

    Je te transmets le bout de code que j'avais réalisé pour faire cela.


    En gros, il demande à l'utilisateur s'il souhaite effectivement ajouter la valeur saisie à la liste. Si oui, il charge la source de la liste dans un Recordset et ajoute la valeur. par contre, tu vas devoir passer par du VBA pour faire cela.
    Voici le code à ajouter et à adapter sur l'évenement absence sur liste.


    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
    23
    24
    25
    26
    27
    28
    Private sub nom_control_NotInList (Newdata As string, Response As Interger)
     
    Dim strmsg As string
    Dim rst As DAO.recordset
    Dim db as DAO.Database
     
    strmsg = "'" & NewData & "'  n'est pas dans la liste. "
    strmsg = strmsg & "Souhaitez-vous l'ajouter ?"
     
    If Vbno = Msgbox(strmsg, vbYesNo + vbquestion,"nouvelle saisie") then
     
    Response = acDataErrDisplay
     
    Else
     
    set db = CurrentDb()
    set rst = db.openRecordSet("nom_de_la_table_qui_contient_ta_liste")
     
    rst.Addnew
     
    rst("ton_champs_liste") = NewData
     
    rst.update
    Response = AcDataErrAdded
    rst.close
    end if
     
    end sub

    Pour que cela fonctionne, tu dois ajouter DAO aux références.


    De plus, pour éviter les valeurs qui se répètent dans ta liste, il te faut ajouter le terme DISTINCT dans la chaîne SQL qui constitue la source de ta liste juste après le SELECT.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT "nom de colonne" FROM "nom de table"</SQL>
    J'espère que ces quelques conseils pourront t'aider.

    Bon courage.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 99
    Points : 67
    Points
    67
    Par défaut
    Merci pour vos conseils, et aussi pour votre indulgence envers un novice ;-)
    J'ai bien réussi ce que je voulais faire.

    En fait, j'ai créé un sous-formulaire lié à la table de jonction sur lequel j'ai ajouté la liste déroulante qui contient la liste des réalisateurs (Prénom-Nom), et j'ai également ajouté le code VBA adapté afin de gérer l'événement NotInList.

    Par contre, le code SQL de la liste est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT [Réalisateurs].[NumRéal], [Réalisateurs].[Prénom-Nom] FROM Réalisateurs ORDER BY [Prénom-Nom];
    Il doit servir à n'avoir qu'une seule fois l'entrée dans la liste déroulante, c'est ça ? Par ce qu'à priori, ce n'est pas possible dans mon cas.



    PS en hors sujet pour répondre à User : Un film peux parfaitement être réalisé par plusieurs réalisateurs, souvent des fratries (ou presques ;-) ), comme par exemple Matrix de Andy et Lana (Larry) Wachowski, L'Enfant des frères Dardenne, Padre padrone des frères Taviani, les Coen, les Farrelly...
    Ou alors, il peux s'agir de segments de films réalisés par plusieurs : Paris je t'aime, ou encore New York, I Love You


    D'ailleurs, on vois même ici qu'un même réalisateur peux avoir 2 noms...
    En effet, Larry Wachowski est officiellement devenu(e) Lana Wachowski.
    M'enfin, je ne vais pas me compliquer la vie pour un cas particulier.

    Encore merci de votre aide à tous les deux.

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 348
    Points : 19 600
    Points
    19 600
    Billets dans le blog
    65
    Par défaut
    Salut,

    Normalement tu ne dois pas avoir de réalisateur en double:

    NumRéal doit être la clé primaire de la table Réalisateurs de type numéro auto pour simplifier.

    Dans la table Réalisteurs tu as donc les champs (NumRéal,Nom-Prénom)

    Dans la table Jonction tu as les champs (NumRéal,NumFilm)

    Dans ton sous-formulaire tu as 1 liste déroulante nommée NumRéal:

    les propriétés de cette liste déroulante :

    Source contrôle : NumRéal

    Origine source : Table/Requête
    Contenu : Réalisateur

    Nbre colonnes : 2
    Largeurs colonnes : 0cm;5cm (comme indiqué plus haut)

    Colonne liée : 1

    Limiter à liste : Oui

    =====================================

    Et sur l'évènement NotInList de ta liste dérulante tu mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub NumRéal_NotInList(NewData As String, Response As Integer)
     
       If MsgBox("Voulez-vous ajouter " & NewData & " à la liste des réalisateurs ?", _
                           vbYesNo + vbQuestion + vbDefaultButton2, "Ajout") = vbYes Then
            DoCmd.RunSQL "INSERT INTO Réalisateurs ( [Nom-Prénom] ) SELECT """ & NewData & """;"
            Response = acDataErrAdded
        Else
            Response = acDataErrContinue
            NumRéal.Undo
        End If
     
    End Sub
    Remarque: Bien respecter les noms des tables et des champs

    A+

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 99
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup, ça m'a bien aidé pour débuter avec Access, ce n'est pas VBA qui me pose problème (je connais pas mal Excel), mais plutôt certains fonctionnements d'Access (malgré l'acquisition d'un livre qui ne rentre pas assez dans les détails, où plutôt devrais-je dire dans mon idée perso du programme à réaliser).
    Je remarque néanmoins que c'est relativement puissant et rapide, et que c'est une hérésie de vouloir faire une base de données sous Excel (mon idée à la base)...
    Je marque le post comme résolu, je viendrais certainement vous voir pour d'autres questions

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2016, 12h36
  2. Réponses: 2
    Dernier message: 23/12/2011, 16h05
  3. [AC-2010] Choix critère par liste déroulante
    Par mirooz dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/11/2011, 02h55
  4. Réponses: 1
    Dernier message: 29/11/2010, 03h49
  5. Réponses: 4
    Dernier message: 23/07/2009, 13h06

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