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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    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 émérite 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 : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

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

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    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 émérite 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 : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 115
    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 émérite 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 : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 961
    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" ?

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