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 :

Supprimer un enregistrement sélectionné dans une liste déroulante [AC-2003]


Sujet :

IHM

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut Supprimer un enregistrement sélectionné dans une liste déroulante
    Bonjour,

    Voila j'ai une liste déroulante basée sur une requête et un bouton "supprimer". Je voudrais supprimer l'enregistrement qui est sélectionné dans la liste en appuyant sur le bouton. Mais je n'ai aucune idée de comment procéder, je ne sais pas comment récupérer l'identifiant de l'enregistrement qui est sélectionné.

    merci d'avance de votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2009
    Messages : 111
    Par défaut
    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
    Sub btSupp_Click()
    Dim SQL As String
    Dim "MaTable" As DAO.Database
    Dim enregistrement As DAO.Recordset
    Dim identifiant as single
    Dim enregselect as string
     
            enregselect = Me!"Malistedéroulante"
     
            SQL = "SELECT * FROM "MaTable"WHERE "MaTable"."MonChamp"=enregselect "' ;"
            Set MaTable= CurrentDb
            Set enregistrement = MaTable.OpenRecordset(SQL, dbOpenSnapshot)
            If enregistrement.RecordCount = 1 Then
                identifiant = enregistrement.Fields("NomChampidentifiant")
                DoCmd.RunSQL "DELETE FROM "MaTable" WHERE "NomChampidentifiant"=" & identifiant & " ;"        
            End If
     
     End Sub
    Si je ne me suis pas trompé cela devrait marcher !
    (en l'adaptant à ton formulaire évidement ^^ )

    Cordialement.

    Tristan

  3. #3
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Citation Envoyé par Tristan33000 Voir le message
    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
    Sub btSupp_Click()
    Dim SQL As String
    Dim "MaTable" As DAO.Database
    Dim enregistrement As DAO.Recordset
    Dim identifiant as single
    Dim enregselect as string
     
            enregselect = Me!"Malistedéroulante"
     
            SQL = "SELECT * FROM "MaTable"WHERE "MaTable"."MonChamp"=enregselect "' ;"
            Set MaTable= CurrentDb
            Set enregistrement = MaTable.OpenRecordset(SQL, dbOpenSnapshot)
            If enregistrement.RecordCount = 1 Then
                identifiant = enregistrement.Fields("NomChampidentifiant")
                DoCmd.RunSQL "DELETE FROM "MaTable" WHERE "NomChampidentifiant"=" & identifiant & " ;"        
            End If
     
     End Sub
    Si je ne me suis pas trompé cela devrait marcher !
    (en l'adaptant à ton formulaire évidement ^^ )

    Cordialement.

    Tristan
    Bonjour,

    Là, y aurait fallu tester avant de proposer ...

    Dim SQL As String
    Dim "MaTable" As DAO.Database
    Ce n'est pas possible, une variable ne peut être déclarée comme ça.

    SQL = "SELECT * FROM "MaTable"WHERE "MaTable"."MonChamp"=enregselect "' ;"
    Le compilateur lève au moins 8 erreurs de compilations sans compter les erreur d'exécution à cause du guillemet simple


    Set MaTable= CurrentDb
    Pourquoi appeler MaTable un objet qui représente une base de données ?

    Set enregistrement = MaTable.OpenRecordset(SQL, dbOpenSnapshot)
    Pourquoi appeler un objet enregistrement alors que c'est une requête ?

    DoCmd.RunSQL "DELETE FROM "MaTable" WHERE "NomChampidentifiant"=" & identifiant & " ;"
    Enfin pourquoi tout ce code pour finalement lancer une requête DELETE. Le delete aurait pu se faire sur le recordset directement



  4. #4
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    On pourrait aussi, si la zone de liste déroulante est basé sur la même table que là où il faut supprimer, tenter un :

    Bien entendu en gardant le principe du test pour savoir si un élément est sélectionné et en ajoutant un requery sur la zone de liste pour afficher les changements.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2009
    Messages : 111
    Par défaut
    humm il est clair que j'aurai du la testé désolé on ne m'y reprendra pas

    Par rapport à la déclaration j'ai mi entre guillemets afin de situé ou faire des changement (pas judicieux j'en convien c'est pas plus clair ^^).

  6. #6
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Bonjour

    Par rapport au titre, la réponse serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With MaZL
        If .ListIndex > -1 Then
            .RemoveItem .ListIndex
            .Value = Null
        End If
    End With
    Mais finalement ça ne correspond pas à ta question qui est de supprimer un enregistrement et non un élément de la liste ... D'où l'intérêt d'utiliser des titres précis

    Pour supprimer un enregistrement dans une table correspondant à l'élément sélectionné dans la zone de liste, il faut savoir que l'élément sélection est récupérable (dans le cas d'une zone de liste sans selection multiple) par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With MaZL
        .ItemData (.ListIndex)
    End With
    Où maZL est le nom de la liste. En effet, ItemData retourne la valeur par rapport au numéro de ligne passé en paramètre et ListIndex retourne le numéro de la ligne séectionné. Par imbrication, on a le résultat souhaité.

    Ensuite, il suffit simplement de lancer une requête DELETE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Valeur as Integer
    With MaZL
        Valeur = .ItemData(.ListIndex)
        CurrentDb.Execute "DELETE FROM MATABLE WHERE " & _
                            BuildCriteria("MONCHAMP", dbInteger, Valeur), dbFailOnError
    End With
    Ici, j'ai pris le cas où le champ qui sert d'itenfiant pour le DELETE est de type Entier, mais si c'était du texte, on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Valeur As String
    With MaZL
        Valeur = .ItemData(.ListIndex)
        CurrentDb.Execute "DELETE FROM MATABLE WHERE " & _
                            BuildCriteria("MONCHAMP", dbText, Valeur), dbFailOnError
    End With
    Enfin, pour éviter les erreurs d'exécution lorsque rien est sélectionné, il faut ajouter un petit test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Valeur As String
    With MaZL
        If .ListIndex <> -1 Then
            Valeur = .ItemData(.ListIndex)
            CurrentDb.Execute "DELETE FROM MATABLE WHERE " & _
                            BuildCriteria("MONCHAMP", dbText, Valeur), dbFailOnError
        End If
    End With
    Et enfin, si on veut afficher un petit message d'information:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Valeur As String
    Dim oDb As DAO.Database
    With MaZL
        If .ListIndex <> -1 Then
            Valeur = .ItemData(.ListIndex)
            Set oDb = CurrentDb
            oDb.Execute "DELETE FROM MATABLE WHERE " & _
                            BuildCriteria("MONCHAMP", dbText, Valeur), dbFailOnError
            MsgBox oDb.RecordsAffected & " enregistrement(s) supprimé(s)"
        End If
    End With
    Sans oublier de rafraichir la zone de liste pour afficher les changements


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim Valeur As String
    Dim oDb As DAO.Database
    With MaZL
        If .ListIndex <> -1 Then
            Valeur = .ItemData(.ListIndex)
            Set oDb = CurrentDb
            oDb.Execute "DELETE FROM MATABLE WHERE " & _
                            BuildCriteria("MONCHAMP", dbText, Valeur), dbFailOnError
            MsgBox oDb.RecordsAffected & " enregistrement(s) supprimé(s)"
            MaZL.Requery
        End If
    End With

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    ... D'où l'intérêt d'utiliser des titres précis
    Et un titre long et préçis, un!

    Pour en revenir à mon problème j'ai testé le code de Tristan mais j'obtiens une erreur d'exécution (pas assez de paramètres) à cette ligne :
    Set enregistrement = MaTable.OpenRecordset(SQL, dbOpenSnapshot)
    Je vais de ce pas tester le code de Tofalu et vous en dire des nouvelles.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Par défaut
    Ca fonctionne merci beaucoup.

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

Discussions similaires

  1. Récupérer valeur sélectionnée dans une Liste déroulante
    Par coeurdange dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/08/2008, 15h27
  2. Réponses: 10
    Dernier message: 15/07/2008, 16h23
  3. Réponses: 1
    Dernier message: 07/03/2008, 08h49
  4. Comment récupérer le texte sélectionné dans une liste déroulante ?
    Par Je-cherche-pfe dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/09/2007, 20h35
  5. Réponses: 13
    Dernier message: 01/08/2006, 16h59

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