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

VBA Access Discussion :

Mise a jour d'un champ multivalué


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut Mise a jour d'un champ multivalué
    Bonjour,

    J'ai une table qui contient un attribut multivalué définit par les jours de la semaine ("Lundi","Mardi",...). J'essaye d'effectuer une opération de mise a jour dessus avec les recordset et le tutoriel http://warin.developpez.com/access/multivalue/
    et j'obtiens donc le code suivant:

    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
     
    Dim Str2 As String
    Str2 = "Lundi"
    Dim oDb As DAO.Database
    Dim oRstJour As DAO.Recordset, oRst As DAO.Recordset
    Set oDb = CurrentDb
    'Instancie un recordset correspondant à la facture 1
    Set oRstJour = oDb.OpenRecordset( _
        "SELECT * FROM Planning WHERE NumPlan = 1")
    With oRstJour
        'Vérifie que le curseur n'est pas vide
        If Not .EOF Then
            'Récupère le recordset du champ multi-valué
            Set oRst = .Fields("Jour").Value
            'Mettre le jour à vrai ?
            With oRst
                .AddNew
                .Fields(0) = Str2
                .Update
            End With
        Else
            MsgBox "Aucun planning valide", vbCritical, "Erreur"
        End If
    End With
    J'obtiens l'erreur suivante sur la ligne .AddNew:
    Impossible de mettre a jour un champ a plusieurs valeurs si le jeu d'enregistrements parent n'est pas accessible en mode modification. Pour ce faire, utilisez la méthode AddNew ou Edit.

    L'utilisation finale sera, quand l'utilisateur choisira les jours dans une ListBox multivalues dans un formulaire, la mise a jour selon les paramètres mis dans le formulaire (aucun problème a ce niveau là) de tous les jours séléctionnés dans la lsite.

    Merci pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 503
    Points
    503
    Par défaut
    Salut,

    suivant l'erreur annoncée, teste

    après With oRstJour

    6ril
    6ril25



    "Par trois méthodes nous pouvons apprendre la sagesse : d'abord, par la réflexion qui est la plus noble; en second lieu, par l'imitation, qui est la plus facile; et troisième, par l'expérience, qui est la plus amère." Confucius

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut
    Merci pour ta réponse, j'avoue que je n'y avait pas pensé
    Cependant j'ai maintenant une erreur sur le .Update :
    Vous ne pouvez pas entrer cette valeur car elle duplique une valeur existante dans le champ liste de choix à plusieurs valeur ou dans le champ pièce jointe. Le champ liste de choix a plusieurs valeurs ou le champ pièce jointe ne peuvent pas contenir de valeurs dupliquées.

    D'après cette erreur, ça ne marche pas car la valeur éxiste déja. Comment faire pour que cette valeur soit séléctionnée dans la liste ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 503
    Points
    503
    Par défaut
    et bien teste oRstJour.Update au lieu de oRstJour.Edit
    6ril25



    "Par trois méthodes nous pouvons apprendre la sagesse : d'abord, par la réflexion qui est la plus noble; en second lieu, par l'imitation, qui est la plus facile; et troisième, par l'expérience, qui est la plus amère." Confucius

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut
    En effet, après divers essais tout a l'air de fonctionner !
    Mais il faut à la fois le Edit et le Update pour que ça marche. C'est en regardant la boucle du recordset oRst que j'ai compris ça.
    Un grand merci, je galère la dessus depuis hier (hier j'essayais de le faire avec une requête UPDATE mais ça ne donnait rien).

    Pour ceux que ça interesse voici le 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Dim Str2 As String
    Str2 = "Lundi"
    Dim oDb As DAO.Database
    Dim oRstJour As DAO.Recordset, oRst As DAO.Recordset
    Set oDb = CurrentDb
    'Instancie un recordset correspondant à la facture 1
    Set oRstJour = oDb.OpenRecordset( _
        "SELECT * FROM Planning WHERE NumPlan = 1")
    With oRstJour
        oRstJour.Edit
     
        'Vérifie que le curseur n'est pas vide
        If Not .EOF Then
            'Récupère le recordset du champ multi-valué
            Set oRst = .Fields("Jour").Value
            'Mettre le jour à vrai ?
            With oRst
                .AddNew
                .Fields(0) = Str2
                .Update
            End With
        Else
            MsgBox "Aucun Planning valide", vbCritical, "Erreur"
        End If
        oRstJour.Update
    End With
    Set oRstJour = Nothing
    Set oRst = Nothing
    Merci !

  6. #6
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Oui, les méthodes AddNew et Edit nécessitent toutes les deux un Update plus bas. La méthode Delete n'en a pas besoin, en revanche
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut
    Oui c'est ce que je suis en train de constater et je n'arrive pas a faire le delete avec le code suivant:

    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
               With oRstJour
                        oRstJour.Edit
                        'Vérifie que le curseur n'est pas vide
                        If Not .EOF Then
                            'Récupère le recordset du champ multi-valué
                            Set oRst = .Fields("Jour").Value
                            'Mettre le jour à vrai ?
                               With oRst
                                .AddNew
                                .Fields(0) = Me.JourDiff.ItemData(J)
                                .Delete
                            End With
                        Else
                            MsgBox "Aucun Planning valide", vbCritical, "Erreur"
                        End If
                        oRstJour.Update
                    End With
    Il me dit: Aucun enregistrement en cours. sur le .Delete. Est ce que je peux enlever le .AddNew du coup ? (j'ai test mais j'ai une autre erreur :p)

    Ah oui aussi des fois il met dit: La transaction n'a pas pu démarrer. Trop de transactions sont déjà imbriquées.
    Comment faire pour "fermer" les transactions ?

  8. #8
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Ben si tu veux supprimer un enregistrement, il ne faut pas mettre d'AddNew !
    Tu mets juste ton Delete
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut
    Le problème c'est que je veux delete un enregistrement particulier (enfin le déselectionner de la liste quoi) et que le delete a l'air de tout supprimer :/

    Et je reviens sur un Edit que j'ai fait plus haut vu que j'ai pas eu de réponse:
    La transaction n'a pas pu démarrer. Trop de transactions sont déjà imbriquées.
    Comment faire pour "fermer" les transactions ?

  10. #10
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Effectivement, il te faut un critère dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim bd As Database
    Dim t As Recordset
    Dim critere As String
     
    Set bd = CurrentDb
    Set t = bd.OpenRecordset("MaTable", DB_OPEN_DYNASET)
     
    critere = "MaClePrimaire=" & MonChamp
    t.FindFirst critere
    t.Delete
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  11. #11
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    De rien ...
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut
    Ca n'a pas marché () :p
    Du coup j'ai viré mon champ multivalué, j'ai mis un champ texte sur lequel j'effectue un traitement...

  13. #13
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    xD
    Ma foi ...
    Et comment tu fais, donc ? (ça m'intéresse )
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    Points : 88
    Points
    88
    Par défaut
    Bah dans mon formulaire j'ai mis des checkbox, je vérifie chacune d'entre elles.
    Si Lundi est check, alors je met une chaine de caractère a "1,", si mardi est vrai je rajoute "2," a ma chaine etc et après j'insère la chaine finale dans ma table. Quand j'en ai besoin je fais un traitement dessus en faisant un Split sur les ",". C'est moche mais ça marche :p

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

Discussions similaires

  1. [AC-2003] Extraction d'une chaîne pour mise a jour d'un champ
    Par martinfa dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/12/2009, 10h27
  2. [Trigger] mise a jour d'un champ lors de l'uptate d'un autre
    Par johnson95 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/10/2009, 17h14
  3. [Requete]Mise a jour d'un champ
    Par le_gueux90 dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 11/05/2007, 11h52
  4. Réponses: 4
    Dernier message: 25/09/2006, 14h36
  5. VB6 Access Mise a jour d'un champ
    Par getea85 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/08/2006, 16h21

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