[Access] Liste déroulante

Otis07 Messages postés 3 Statut Membre -  
incaout Messages postés 347 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je me présente, je suis en école d'ingénieur et je dois réaliser un jeu de carte ( Le UNO) sous Access sans avoir de cours d'informatique. Je me suis donc lancer dans l'interface, et sa se passe plutôt bien. Cependant, lorsqu'on va commencer une partie, je souhaite que le joueur ai un nom. J'ai donc mi une liste déroulante pour que le joueur marque son nom ou en choisissent un existant.
Mais, j'aimerai que ce nom soit sauvegarder lorsqu'on valide la saisie... Faut il utiliser un code spécial par rapport a cette liste déroulante, ou faut-il lier une table a cette liste et comment faire.

Merci de votre aide par avance.
Configuration: Windows XP
Firefox 3.0.8

4 réponses

  1. incaout Messages postés 347 Date d'inscription   Statut Membre Dernière intervention   74
     
    Salut.

    Il faut utiliser l'événement "Not in list" associé à ta liste déroulante modifiable. Si le nom saisi ne figure pas dans la liste, il sera ajouté automatiquement via cet événement. Il faut que la liste soit liée à une table et que la colonne de la liste soit liée ou dépendante du champ dans lequel le nom sera ajouté (pas sur d'être très clair sur ce coup là.)

    Voici un bout de code qui devrait t'aider

    Private Sub Nomdemaliste_NotInList(NewData As String, Response As Integer)

    'Ajoute la saisie de l'utilisateur à la liste des joueurs

    Dim db As Database
    Dim enr As Recordset

    Set db = Application.CurrentDb
    Set enr = db.OpenRecordset("Nomdematable", dbOpenTable, dbAppendOnly)

    Response = acDataErrAdded
    ' Ajoute la chaîne de l'argument NouvDonnée au contenu.
    With enr
    .AddNew
    .Fields("Nomduchamp").Value = NewData
    .Update
    End With

    Set db = Nothing
    Set enr = Nothing

    End Sub

    Il faut remplacer Nomdemaliste par le nom de ta liste déroulante, Nomdematable par le nom de la table où tu veux stocker les noms des joueurs et Nomduchamp par le nom du champ dans la table où sont enregistrés les noms.

    Bon courage

    IC
    0
  2. Otis07 Messages postés 3 Statut Membre
     
    Merci de ta réponse aussi rapide, je vais essayer de comprendre ta réponse et de l'adapter a mon problème, merci beaucoup.
    0
  3. Otis07 Messages postés 3 Statut Membre
     
    J'ai essayé ton code, mais rien ne se passe, peut être parce que quelque chose m'échappe. J'ai donc fait des recherches et je suis tombé sur ceci ( ListeDeroulanteNomJoueur est le nom de ma zone de liste déroulante):

    Private Sub ListeDeroulanteNomJoueur_AfterUpdate()

    Const NB_ITEMS As Long = 20 'Nombre d'éléments archivés dans la liste
    Dim b As Byte

    'Maj de la liste des derniers critères recherchés
    With ListeDeroulanteNomJoueur

    'Si la valeur saisie est un Null _
    ou une chaîne de longeur nulle _
    ou égale au premier item, _
    alors aucune Maj de la liste n'est nécessaire.
    If Nz(.Value, "") = "" Or .Value = .Column(0, 0) Then Exit Sub

    'Etant donné qu'on ne souhaite pas de doublons, _
    on va parcourir tous les éléments _
    pour éliminer un éventuel doublon avant d'ajouter notre valeur en haut de liste.
    For b = 1 To .ListCount - 1
    If .Column(0, b) = .Value Then .RemoveItem b: Exit For
    Next b

    'Ajoute la nouvelle saisie
    .AddItem Item:=.Value, Index:=0

    'Limite la liste à NB_ITEMS éléments
    If .ListCount = NB_ITEMS Then .RemoveItem NB_ITEMS - 1

    End With

    End Sub

    Mais des problèmes subsistent:
    -Lorsque je rentre en nom dans ma liste, et que je valide en appyuant sur "entrer", j'ai un message d'erreur "erreur d'execution '6' Depassement de capacité' et la ligne " For b = 1 To .ListCount - 1" se met en surbrillance jaune.
    -J'ai donc supprimer cette partie qui evite les doublons. Le code marche mais en fait je souhaite que les noms soient conservés si l'on change de formulaire, or ce n'est pas le cas. Il s'accumule que si l'on ne change pas de formulaire. Comment faire pour les sauvegarder?
    0
  4. incaout Messages postés 347 Date d'inscription   Statut Membre Dernière intervention   74
     
    Salut.

    En fait, si tu veux enregistrer les informations de la liste, soit tu utilises un fichier soit une table. Dans ce cas, avant toute chose, tu initialises ta liste en la chargeant avec les données lues dans le fichier ou dans une table d'une base de données.
    Avant de fermer le formulaire, tu enregistres les nouvelles valeurs dans le fichier ou la table.

    Mais normalement l'événement NotInList sert à ajouter la saisie utilisateur au contenu d'une liste et aussi dans la table à laquelle la liste est liée.

    Pour que le code que je t'ai donné fonctionne, il faut que ta base de données Access contienne une table "Joueurs" par exemple qui contienne elle même 2 champs "IdJoueur" et "NomJoueur"
    IdJoueur est de type autoincrémenté
    NomJoueur est de type chaine (string)

    Il te faut ensuite une liste modifiable nommée par exemple LM_Joueurs. Les propriétés suivantes doivent être définies comme suit pour cette liste
    "Nombre de colonnes" = 2
    "Largeur des colonnes" = 0cm;3cm
    "Source controle" = "NomJoueur"
    "Origine source" = "table/requete"
    "Contenu" = "SELECT IdJoueur, NomJoueur FROM Joueurs ORDER BY NomJoueur ASC"
    "Colonne liée"= 1
    "Limiter à la liste" = oui

    Ensuite, il faut que le formulaire dans lequel se situe cette zone de liste soit associé à une requête qui renvoie les champs IdJoueur et NomJoueur, sinon tu auras des problèmes, je pense avec la propriété "source controle" de la zone de liste.

    Et enfin, tu associes le code suivant à l'événement NotInList

    Private Sub LM_Joueurs_NotInList(NewData As String, Response As Integer)

    'Ajoute la saisie de l'utilisateur à la liste des joueurs

    Dim db As Database
    Dim enr As Recordset

    Set db = Application.CurrentDb
    Set enr = db.OpenRecordset("Joueurs", dbOpenTable, dbAppendOnly)

    Response = acDataErrAdded
    ' Ajoute la chaîne de l'argument NouvDonnée au contenu.
    With enr
    .AddNew
    .Fields("NomJoueur").Value = NewData
    .Update
    End With

    Set db = Nothing
    Set enr = Nothing

    End Sub

    Et normalement, quand tu saisis un nom qui n'est pas dans la liste, il est ajouté automatiquement à la liste et à la table Joueurs. Désolé, mais c pas évident à expliquer en ligne.

    Bon courage

    IC
    0