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

Access Discussion :

Ajout de données dans une zone de liste déroulante d'un form


Sujet :

Access

  1. #1
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut Ajout de données dans une zone de liste déroulante d'un form
    Bonjour à tous,

    J'ai créer un formulaire dans lequel j'ai créer une zone de liste déroulante basé sur la table TB_DESCRIPTIONS que j'ai. En fait ce que j'aimerais faire c'est avoir la possibilité d'ajouter des données directement dans cette liste et que ces données (si elles n'existe pas) qu'elles viennent directement dans la table TB_DESCRIPTIONS.

    Voici ce que j'ai trouvé dans la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub MaListe_NotInList(NewData As String, Response As Integer)
          Response = acDataErrContinue 
    End Sub
    à ce lien :
    http://access.developpez.com/faq/?pa...ZoneListMsgErr

    Cela me permet de supprimer le message qu'il vient quand je veux ajouter une valeur dans une zone de liste déroulante et qu'elle n'existe pas.

    Voici la fonction que j'ai faite :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    Public Function fn_AjouterDescription(str_Description As String)
     
    'Déclaration des variables
        Dim base_donnee As DAO.Database
        Dim str_ReqDescription As String
        Dim rst_Description As DAO.Recordset
        Dim int_PkDescription As Integer
     
    'On spécifie quelle table on doit ouvrire
        Set base_donnee = Application.CurrentDb
        Set rst_Description = base_donnee.OpenRecordset("TB_DESCRIPTIONS")
     
    'Requête pour parcourir la table avec les critères.
        str_ReqDescription = ("SELECT * FROM TB_DESCRIPTIONS WHERE [nom_description] LIKE '" & str_Description & "'")
     
    'Attribution de ce que l'on doit exécuter dans le parcours de la table
        Set rst_Description = base_donnee.OpenRecordset(str_ReqDescription, dbOpenDynaset)
     
    If (rst_Description.EOF = False) Then
    'Parcours de la table TB_OFS selon la requête et les critères spécifiés.
     
        'Si il EXISTE ( on ne fais rien )
     
    Else
        'Si il EXISTE PAS
     
        rst_Description.AddNew
     
            rst_Description("nom_description") = str_Description
            int_PkDescription = rst_Description("pk_description")
     
        rst_Description.Update
     
    End If
     
    End Function
    Le problème que j'ai c'est que lorsque je rentre une valeur qui n'appartient pas à la table sur laquelle ma zone de liste déroulante est basé, il n'y a rien qui se passe, c'est à dire que pour quitter mon champ de zone de liste déroulante je dois ABSOLUMENT choisir une valeur dans ma liste ...

    Savez-vous ce que je peux faire pour modifier cela ???

    Merci de votre aide ...

    A tout bientôt ...
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Pour ton problème voici ce que tu peux faire

    Dans les propriété de ta liste box :
    - dans donnée : origine/source : tu met table/requête
    - dans donnée : contenu : tu met une requête qui te selectionne les choix dans ta table (ex : SELECT DISTINCT monchamps FROM matable WHERE macondition;
    - dans donnée : Limiter a la liste : non

    Ceci te permettra d'avoir ta liste box éditable sans une ligne de code vb.

    ensuite toujours dans les propriété de ta liste box
    dans événement : Après maj : voici un exemple de code
    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
     
    Private Sub malistebox_AfterUpdate()
    ' Variables
    dim r as dao.recordset
    dim sql as string
    dim test as byte
    ' Vérification que l'enregistrement existe ou non
    sql = "SELECT Count(*) FROM matable WHERE monchamps = '" & me.malistebox & "'
    set r = currentdb.openrecordset(sql)
    test = r.fields(0).value
    ' Si l'enregistrement n'existe pas
    if test = 0 then
    sql = "INSERT INTO (monchamps1, monchamps2) VALUES (valeur1, valeur2);"
    docmd.runsql(sql)
    end if
    End Sub
    voila c bon !

    et si tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Form_Open(Cancel As Integer)
    DoCmd.SetWarnings False
    End Sub
    tu ne verras aucun des messages access "vous êtes sur le point de ..."
    [/quote]

  3. #3
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Merci stan21 pour tous ces détails ...

    Je me permets juste de te poser une petite question ...

    Voici le détails de mes tables ...

    Mon formulaire principal ( sur lequel il y a la zone de liste déroulante ) il est basé sur cette table :

    TB_MOUVEMENTS
    pk_mouvement --> Clé primaire --> NuméroAuto
    numero_mouvement --> Texte ( je ne fais pas ce calcul avec )
    fk_description --> Clé étrangère de la TB_DESCRIPTIONS --> Numérique


    Table pour la zone de liste déroulante :
    TB_DESCRIPTIONS
    pk_description --> CLé primaire --> NuméroAuto
    nom_description --> Texte

    Pour créer ma zone de liste déroulante dans mon formulaire j'utilise le champ fk_description (de la table TB_MOUVEMENTS) puis j'ai fait : Clique droit, REMPLACER PAR , ZONE DE LISTE DEROULANTE.

    Dans les propriétés j'ai mit :

    Contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT TB_DESCRIPTIONS.pk_description, TB_DESCRIPTIONS.nom_description FROM TB_DESCRIPTIONS;
    Origine source : Table/Requête

    Nombre de colonne : 2

    Largeurs colonne : 0;3

    Je pense que tu vois le problème que j'ai non ???

    En fait si je mets à NON la propriété Limiter à la liste, je ne pourrai pas rentrer mes nouvelles valeurs puisque dans ma zone de liste déroulante je stoque qqch de numérique ...

    Tu vois le problème ???

    En tout cas merci de ton aide ...
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Excuse moi, mais pourquoi tu fais afficher deux colonne, quelle est l'utilité d'affichzer la clé primaire de ta table TB_DESCRIPTIONS ?

  5. #5
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Je n'affiche pas la colonne de la clé primaire ...

    Dans la largeur de mes colonnes je mets : 0;3 le 0 permet de cacher la colonne de la clé primaire ...

    Et je suis obligée de mettre la clé primaire de la table car cela me pemet de faire la relation entre ma clé étrangère et ma clé primaire de la table TB_DESCRIPTIONS et de la table TB_MOUVEMENTS ...
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 419
    Points : 508
    Points
    508
    Par défaut
    salut

    voila le code que j'utilise pour des nouveaux no de contrat.
    Si tu veux t'en inspirer...
    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
    Private Sub NoContrat_NotInList(NewData As String, Response As Integer)
    Dim rst As dao.Recordset
     
    If MsgBox("Le contrat [" & _
        NewData & "] n'existe pas. Voulez-vous l'ajouter ?", _
        vbQuestion + vbYesNo) = vbYes Then
        ' Ajouter l'élément à la liste
        Set rst = CurrentDb.OpenRecordset("Contrats")
        rst.AddNew
            rst!NoContrat = NewData
        rst.Update
        rst.Close
        Set rst = Nothing
    End If
     
    ' Annuler le message d'erreur d'Access
    Response = acDataErrAdded
    End Sub

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    tu as pas besoin de passer par la pour faire la relation.

    Essaie de laisser une seule colonne a ta listebox

    quand tu feras une saisi, essai ce code pour l'ajout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim sql as string
     
    sql = "INSERT INTO TB_DESCRIPTIONS (nom_description) VALUES ('" & me.listebox & "');" 
    docmd.runsql(sql)
    si la clé primaire est un numéro auto dans ta table elle se mettra automatiquement.

    et a ta place je remplacerai ta listebox par une autre indépendante, tu peux mieux la gérer ainsi.

  8. #8
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    J'ai pris note de tout ce que vous m'avez dit ... je vais essayer sur le champ tout ça ..

    Merci pour tout ...
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

  9. #9
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Alors je me suis inspiré du code de boubignole pour faire ce code ici :

    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
    Private Sub fk_description_NotInList(NewData As String, Response As Integer)
     
    Dim rst_Description As DAO.Recordset
     
    If MsgBox("La descritpion n'existe pas, voulez-vous l'ajouter ?", vbQuestion + vbYesNo) = vbYes Then
     
        'Ajout de l'élément
        Set rst_Description = CurrentDb.OpenRecordset("TB_DESCRIPTIONS")
        rst_Description.AddNew
            rst_Description!nom_description = NewData
        rst_Description.Update
     
        rst_Description.Close
     
        Set rst_Description = Nothing
    End If
     
    Response = acDataErrAdded
     
     
    End Sub
    et vous savez quoi ???

    Cela marche !!! et du premier coup


    Merci beaucoup pour votre aide ... .... merci stan21 aussi ...

    A tout bientôt
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/05/2010, 19h12
  2. Réponses: 13
    Dernier message: 26/11/2009, 16h28
  3. [Access 2007] changement de donnée dans une zone de liste
    Par Jerez62 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/09/2008, 13h09
  4. Retrouver une donnée dans une zone de liste
    Par uloaccess dans le forum Access
    Réponses: 9
    Dernier message: 07/11/2005, 13h25

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