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 attribut multi-valué a partir d'une listbox avec recordset


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 attribut multi-valué a partir d'une listbox avec recordset
    Bonjour,

    J'ai une table qui contient un attribut "Jour" pouvant être multivalué (plusieurs valeurs pour un seul enregistrement) et dans un formulaire j'ai une listebox contenant les jours de la semaine.

    Le traitement que j'aimerai mettre au point serait, quand on clique sur un bouton, de mettre a jour les données de l'enregistrement séléctionné ainsi que les jours. Pour faciliter le traitement, quand on clique sur le bouton je pensais "éffacer" les données Jour du recordset lié a l'enregistrement puis le remplir avec les nouvelles données.
    Cependant le traitement ne marche pas vraiment et je m'entête dessus

    Voici mon code:

    Ici j'éfface les anciennes données de Jour
    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
     
    Set oRstJour = oDb.OpenRecordset("SELECT * FROM Planning WHERE NumPlan =" & Me.NumPlan.ItemData(I) & "", DB_OPEN_DYNASET)
     
            With oRstJour
                If Not .EOF Then
                    oRstJour.Edit
                    'Récupère le recordset du champ multi-valué
                    Set oRst = .Fields("Jour").Value
                    With oRst
                         While Not oRst.EOF
                            oRst.Delete
                            oRst.MoveFirst
                         Wend
                    End With
                oRstJour.Update
                Else
                    MsgBox "Aucun Planning valide", vbCritical, "Erreur"
                End If
            End With

    Et ici je suis censé les re-remplir:

    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
     
    Set oRstJour2 = oDb.OpenRecordset("SELECT * FROM Planning WHERE NumPlan =" & Me.NumPlan.ItemData(I) & "", DB_OPEN_DYNASET)
            For J = 0 To Me.JourDiff.ListCount - 1
                If (Me.JourDiff.Selected(J) = True) Then
                    Str2 = Me.JourDiff.ItemData(I)
                        With oRstJour2
                            oRstJour2.Edit
                            'Vérifie que le curseur n'est pas vide
                            If Not .EOF Then
                                'Récupère le recordset du champ multi-valué
                                Set oRst2 = .Fields("Jour").Value
                                With oRst2
                                    'If Not .EOF Then
                                        .AddNew
                                        .Fields(0) = Str2 'on rajoute le nouveau
                                        .Update
                                    'End If
                                End With
                            Else
                                MsgBox "Aucun Planning valide", vbCritical, "Erreur"
                            End If
                            oRstJour2.Update
                        End With
                End If
            Next
    Le problème ce que ça ne marche vraiment pas bien (1 fois sur 10) et je ne parviens pas a trouver comment faire...
    J'ai testé la partie pour effacer en mettant la partie de remplissage en commentaires: ça ne vide pas toujours :/

    Au début j'avais mis dans ma boucle for :
    Si on a une ligne séléctionnée:
    on l'insere
    Sinon
    Si elle apparait dans mon enregistrement
    on la supprime
    finsi
    finsi

    Mais ça ne marchait pas non plus.

    Sinon au bout d'un certain nombre d'utilisation/d'erreur, VBA me dit qu'il y' a trop de Transactions ouvertes et ça m'oblige a fermer et réouvrir Access. Suis-je passé a côté de quelquechose ?

    Merci a ceux qui liront jusque là.

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Quelle erreur te retourne Access ?

  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
    J'ai fait tellement de tests que je sais plus vraiment...
    La tout de suite il me dit:
    "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."

    Mais des fois ils plante sur le ".update" avec... heu je me rappelle plus l'erreur

    Edit: A demain, boulot finit pour aujourd'hui

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Ben l'erreur est claire, tu as sûrement essayé d'ajouter une valeur dans une zone de liste alors que cette valeur existait déjà dans cette zone de liste.

    Sinon, essaye de retrouver l'erreur avec ton Update, je pourrai peut-être t'aider

  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
    Solution 1:
    C'est bien ça qu'il me dit sur le update, en fait les valeurs de la liste apparaissent toutes avec un checkbox vide et j'aimerais le passer a true. Apparement je fais un .AddNew donc il ne veut pas "Rajouter" une valeur éxistante a la liste. J'ai tenté avec un .Edit a la place du .AddNew dans la boucle de remplissage et j'ai une erreur ou il me dit: Aucun enregistrement en cours.. vu qu'aucun checkbox n'est coché il ne prend pas d'enregistrement je suppose. Mais je ne vois pas comment lui dire de "cocher".

    Solution 2:
    Sinon dans un autre formulaire j'essaye d'insérer des valeurs dans la table en question mais ça ne marche pas non plus. Si ça avait marché j'aurais pu effacer l'enregistrement et le remplacer par une insertion avec les nouvelles valeurs.

    Si personne ne trouve comment faire pour la solution 1, voici le code de la solution 2:

    Voici mon code et le Debug.Print associé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.RunSQL "insert into Planning values (" & Cle & "," & TabAnnee(I, J) & ", " & TabAnnee(I, J + 1) & ", " _ 
    & TabAnnee(I, J + 2) & " , " & TabAnnee(I, J + 2) * N & ",'" & Me.NumFacture & "'  , " _ 
    & TabAnnee(I, J + 4) & ",'" & TabAnnee(I, J + 3) & "','" & Str & "')"
    Que mon dernier attribut (le(s) jours, representé par Str soit vide ou non ne change rien:
    insert into Planning values (17,2015, 1, 600 , 300,'V00004' , 15,'Les Milles 1','')
    insert into Planning values (17,2015, 1, 600 , 300,'V00004' , 15,'Les Milles 1','Lundi')
    et j'obtiens l'erreur: "type de données incompatible dans l'expression du critère". Pourtant, le champ Jour accepte les chaines vides, Null.

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Pour ta solution 1, il faut que tu crées un critère qui te permettra de définir quel élément ajouter/modifier/supprimer, sinon, effectivement, Access ne peut pas savoir ce que tu veux faire.

    Pour ta solution 2, vérifie que le type du champ de ta table soit bien une chaine de caractères, mais je pense que ça vient de ton critère.
    Sur quoi pointe Access quand il te met l'erreur "type de données incompatible dans l'expression du critère" ?

  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
    Pour la solution 1, j'éfface toutes les anciennes données, puis je les rajoutes si ils sont séléctionnés dans ma listbox de mon formulaire (.Selected(I) = true, cf le code).

    Pour la solution 2, Access pointe sur le DoCmd.RunSql "insert .."


    Merci pour ton interessement et ton aide (même si pour l'instant je tourne encore en rond:p

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Essaye de : copier ta requète brute (telle qu'obtenue avec le Debug.Print), ensuite tu vas dans Requêtes > Créer une requête en mode création. Si "Ajouter une table" s'affiche, tu clique sur Fermer. Tu fais clic droit sur le grand cadre gris supérieur, puis Mode SQL. Tu colle ta requète (tu enlève ce qu'il y a déjà d'écrit), puis tu clique sur le bouton exécuter dans la barre des tâches (point d'exclamation rouge).
    Là tu verras si Access te retourne quelque chose, ou s'il te donne une erreur, et tu sauras si le souci vient de la requète SQL ou d'autre chose

  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
    Je ne comprend pas, quand je fais ça et que je clique sur Exécuter, il me demande de choisir la source de données alors que j'ai déjà d'autres requêtes qui marchent...

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Tiens, c'est curieux, j'ai jamais eu ce genre de message avec une requète, tu as bien recopié ta requète SQL ? En vrai langage SQL ?
    Fais péter un screen pour voir ?

  11. #11
    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
    Voila

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Ah ben zut, c'est parce que tu as la dernière version d'Access. Moi j'ai la version 2000. J'ai des potes qui l'utilisent, j'ai un peu testé, et je t'avoue que curieusement, on ne l'a pas trouvé intuitive du tout.
    En tout cas, difficile de t'aider par messages interposés sans connaitre le produit ...
    Je sais pas quoi te dire, essaye de trouver un tuto ou une aide pour exécuter une requète SQL sur Access 2007, ça doit pas être dur à trouver

  13. #13
    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
    Je vais chercher ça
    Sinon est ce que tu saurais comment faire pour donner plusieurs valeurs au champ multivalué ? Parceque avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If (TabAnnee(I, 5) <> "") Then
                        .Fields(0).Value = TabAnnee(I, 5)
                    End If
                    If (TabAnnee(I, 6) <> "") Then
                        .Fields(0).Value = TabAnnee(I, 6)
    end if
    Si TabAnnee(I,5) et TabAnnee(I,6) contiennent respectivement "Lundi" et "Mardi", ça ne va me mettre que "Mardi" dans ma liste (déjà un progrès ) alors que j'aimerais avoir les deux.

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Non je ne sais pas trop, mais je cherche aussi sur ce sujet en ce moment même, donc si tu trouve avant moi, ça m'intéresse

  15. #15
    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
    J'ai trouvé ça qui peut être interessant
    http://access.developpez.com/access2...ionListeValeur
    mais je crois que ça crée un nouveau champ et que ça met pas a jour celui éxistant.. faut voir

  16. #16
    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
    Bon après recherches, il semblerait que je doive utiliser la fonction AppendChunk, qui est censée rajouter le paramètre au champ appliqué mais j'ai une erreur sur l'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Str = TabAnnee(I, 6)
     .Fields(0).AppendChunk Str
    Il me dit: Type de champs de données non valide.
    D'après les exemples d'utilisation ça devrait être ça pourtant...

    Edit:
    Rofl....
    http://support.microsoft.com/kb/113949/fr
    "Utilisable sur les champs Mémo ou de type binaire long"
    Rahhhh

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

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    Points : 939
    Points
    939
    Par défaut
    Ok, merci pour lien, je vais regarder ça

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/01/2012, 13h58
  2. mise a jour automatique d'un BD SQLserver a partir d'une BD access
    Par aghilass dans le forum Administration
    Réponses: 1
    Dernier message: 03/01/2012, 16h53
  3. [Modèle Relationnel] Attribut multi-valué.. le mal ?
    Par mensoif dans le forum Schéma
    Réponses: 5
    Dernier message: 12/05/2009, 11h01
  4. Mise a jour d'un attribut relation!
    Par cdekapto dans le forum W4 Express
    Réponses: 2
    Dernier message: 24/09/2008, 11h26
  5. Mise a jour de la base de donnée a partir de DataGridView
    Par salrouge dans le forum Windows Forms
    Réponses: 7
    Dernier message: 10/09/2007, 12h19

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