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 à jour table depuis recordset d'une requete regroupement [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut mise à jour table depuis recordset d'une requete regroupement
    Bonjour,

    J'ai une requête qui me permet de connaitre les identifiants de promotions n'étant plus d'actualité. Cette requête nécessite un regroupement.
    J'aimerais mettre le champ "Drop" à Vrai pour les résultats de la requête.

    J'ai actuellement le code suivant mais ça ne fonctionne pas :

    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
    37
    38
    39
    40
    41
    42
    43
    Sub DAOOpenRecordset()
        Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field
        Dim sSQL As String
        Dim sSQL_Update As String
        ' Ouverture de la base de données
        Set db = CurrentDb
        'Requête sélection retournant les ID_Promotion_Et_Annee considérés (identifiants)
    sSQL = _
        "SELECT T_Promotion_Et_Annee.ID_Promotion_Et_Annee " & _
        "FROM R_ImportPromo_Norme RIGHT JOIN T_Promotion_Et_Annee ON " & _
        "(R_ImportPromo_Norme.ID_NomPromotion = T_Promotion_Et_Annee.ID_NomPromotion) AND " & _
        "(R_ImportPromo_Norme.Annee = T_Promotion_Et_Annee.Annee) " & _
        "WHERE (((R_ImportPromo_Norme.ID_NomPromotion) Is Null)) OR (((R_ImportPromo_Norme.Annee) Is Null));"
     
     
    'La mise à jour souhaitée
        sSQL_Update = _
        "UPDATE T_Promotion_Et_Annee " & _
        "SET T_Promotion_Et_Annee.Drop_Promotion_Et_Annee = True " & _
        "WHERE (((T_Promotion_Et_Annee.ID_NomPromotion)=36));"
     
        ' Ouverture du recordset
        Set rst = db.OpenRecordset(sSQL, dbOpenForwardOnly, dbReadOnly)
     
        If Not rst.EOF Then
            'rst.MoveFirst
            Do While Not rst.EOF
             ' code
                'Différents essais mais rien de concluant : 
                rst.Edit
                rst("Drop_Promotion_Et_Annee") = True
                rst.Update
             'Suivant
             rst.MoveNext
            Loop
        Else
          MsgBox "Le jeu d'enregistrements est vide"
        End If
     
     
        ' Fermeture du Recordset
        rst.Close
    End Sub

  2. #2
    Membre habitué Avatar de jimay
    Profil pro
    Inscrit en
    Août 2006
    Messages
    146
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 146
    Points : 178
    Points
    178
    Par défaut
    Salut,

    Je ne suis pas sûr de moi mais il me semble qu'il est impossible de faire une modification sur un résultat de requette contenant un regroupement. à mon avis tu devra récupérer une clefs dans cette requete de regroupement puis modifier la table correspondante.

    Si quelqu'un peut confirmer ^^

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    il semblerait en fait qu'on ne puisse pas faire de mise à jour depuis une requête regroupement.
    Je récupère cependant bien une clé avec la requête de regroupement : T_Promotion_Et_Annee.ID_Promotion_Et_Annee

    J'ai mis ça dans le recordset mais je n'arrive pas à mettre à jour la table T_Promotion_Et_Annee en parcourant mon recordset.
    Il faudrait que pour chaque enregistrement du recordset, je puisse mettre à jour le champs Drop de la table pour l'identifiant correspondant (ID_Promotion_Et_Annee)

  4. #4
    Membre habitué Avatar de jimay
    Profil pro
    Inscrit en
    Août 2006
    Messages
    146
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 146
    Points : 178
    Points
    178
    Par défaut
    re,


    tu devrais essayer de modifier un peu tes requetes pour obtenir un recordset modifiable, du genre:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT * 
    FROM T_Promotion_Et_Annee 
    WHERE ID_Promotion_Et_Annee IN ( 
        SELECT T_Promotion_Et_Annee.ID_Promotion_Et_Annee 
        FROM R_ImportPromo_Norme 
        RIGHT JOIN T_Promotion_Et_Annee 
        ON (R_ImportPromo_Norme.ID_NomPromotion = T_Promotion_Et_Annee.ID_NomPromotion) 
        AND (R_ImportPromo_Norme.Annee = T_Promotion_Et_Annee.Annee) 
        WHERE (((R_ImportPromo_Norme.ID_NomPromotion) Is Null)) 
        OR (((R_ImportPromo_Norme.Annee) Is Null)))


    tu as juste à parcourir le recordset issu de cette requete pour modifier tes données.

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    J'ai finalement trouvé une solution mais je la trouve quand même très "bourrin"
    Ma requête regroupement me cré un recordset que je parcours et à chaque enregistrement, j'exécute une requête de mise à jour de ma table avec en condition, la clé contenue dans l'enregistrement courant du recordset.

    Mes temps de traitement peuvent-ils exploser avec l'augmentation de données (pour l'instant j'ai 100 lignes mais par la suite ça va augmenter.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub DAOOpenRecordset()
        Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field
        Dim sSQL As String
        Dim sSQL_Update As String
        ' Ouverture de la base de données
        Set db = CurrentDb
        sSQL = _
        "SELECT T_Promotion_Et_Annee.ID_Promotion_Et_Annee " & _
        "FROM R_ImportPromo_Norme RIGHT JOIN T_Promotion_Et_Annee ON " & _
        "(R_ImportPromo_Norme.ID_NomPromotion = T_Promotion_Et_Annee.ID_NomPromotion) AND " & _
        "(R_ImportPromo_Norme.Annee = T_Promotion_Et_Annee.Annee) " & _
        "WHERE (((R_ImportPromo_Norme.ID_NomPromotion) Is Null)) OR (((R_ImportPromo_Norme.Annee) Is Null));"
     
     
     
        ' Ouverture du recordset
        Set rst = db.OpenRecordset(sSQL, dbOpenForwardOnly, dbReadOnly)
     
        If Not rst.EOF Then
            'rst.MoveFirst
            Do While Not rst.EOF
             ' code
                Debug.Print rst("ID_Promotion_Et_Annee").Value
                sSQL_Update = _
                "UPDATE T_Promotion_Et_Annee " & _
                "SET T_Promotion_Et_Annee.Drop_Promotion_Et_Annee = True " & _
                "WHERE (((T_Promotion_Et_Annee.ID_Promotion_Et_Annee)=" & rst("ID_Promotion_Et_Annee").Value & "));"
                DoCmd.RunSQL sSQL_Update
             'Suivant
             rst.MoveNext
            Loop
        Else
          MsgBox "Le jeu d'enregistrements est vide"
        End If
     
     
        ' Fermeture du Recordset
        rst.Close
    End Sub


    On a posté en même temps, je vais tester ta solution.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Excellente ta solution , je prends.
    je ne connaissais pas la condition IN.


    j'obtiens donc le code suivant qui marche impeccable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE T_Promotion_Et_Annee SET T_Promotion_Et_Annee.Drop_Promotion_Et_Annee = True
    WHERE (((T_Promotion_Et_Annee.ID_Promotion_Et_Annee) In (SELECT T_Promotion_Et_Annee.ID_Promotion_Et_Annee 
        FROM R_ImportPromo_Norme 
        RIGHT JOIN T_Promotion_Et_Annee 
        ON (R_ImportPromo_Norme.ID_NomPromotion = T_Promotion_Et_Annee.ID_NomPromotion) 
        AND (R_ImportPromo_Norme.Annee = T_Promotion_Et_Annee.Annee) 
        WHERE (((R_ImportPromo_Norme.ID_NomPromotion) IS NULL)) 
        OR (((R_ImportPromo_Norme.Annee) IS NULL)))));

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

Discussions similaires

  1. Mise à jour d'une table .fic à partir d'une requete access
    Par hobbes34 dans le forum HyperFileSQL
    Réponses: 3
    Dernier message: 25/02/2013, 10h22
  2. [SQL SERVER 2005] mise à jour de la structure d'une table
    Par gdkenny dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 27/12/2007, 16h47
  3. Réponses: 5
    Dernier message: 29/05/2007, 10h52
  4. Mise à jour table depuis autre table
    Par dual77 dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/01/2007, 21h01
  5. Mise à jour de données à partir d'une autre table
    Par rsc dans le forum Langage SQL
    Réponses: 7
    Dernier message: 05/04/2006, 10h53

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