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

Requêtes et SQL. Discussion :

Copier les cumuls dans une table. [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Copier les cumuls dans une table.
    Bonjour à tous et merci de votre temps et de votre aide.

    Pour faire des calculs (mon client me demande presque de réécrire Excel :-) j'ai besoin d'avoir la somme des temps quotidiens disponibles de mes ressources.
    J'ai donc fait une requête de regroupement qui me fait cela.

    Et je souhaites enregistrer ces valeurs dans ma table de calcul, une valeur par jour qui pour ce jour est la même pour toutes mes activités.
    J'utilise une table intermédiaire de calcul à cause de problème de performance.

    Ci-joint une image de ce que j'aimerai faire.

    Nom : MAJ_Cumul.JPG
Affichages : 85
Taille : 76,1 Ko

    et ici le SQL :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE tblPlanif_GroupeActivite_Quotidien INNER JOIN reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour 
    ON (tblPlanif_GroupeActivite_Quotidien.NoGroupeAff = reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour.NoGroupeAff) 
          AND (tblPlanif_GroupeActivite_Quotidien.NoTerr = reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour.NoTerr) 
          AND (tblPlanif_GroupeActivite_Quotidien.NoDir = reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour.NoDir) 
          AND (tblPlanif_GroupeActivite_Quotidien.DateHeure = reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour.DateHeure) 
          AND (tblPlanif_GroupeActivite_Quotidien.Annee = reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour.Annee) 
    SET tblPlanif_GroupeActivite_Quotidien.NbHeureDispoQuotidien = [reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour].[NbHeureDispo];

    Mon problème c'est que cela fait une relation de 1 à plusieurs et que Access dit que la requête ne peut être mise à jour.

    J'ai essayé en jouant sur le type de jointure et/ou l'unicité des enregistrements sans succès mais j'ai peut-être raté un truc.

    Je pourrais remplacer la jointure par un DFirst mais ma requête de cumul [reqPlanif_MainOeuvre_TempsAssignationQuotidien_CumulJour] est assez longue (environ 20s pour avoir les résultats) et que j'ai quand même 124830 enregistrements à mettre à jour dans [tblPlanif_GroupeActivite_Quotidien].

    Je l'ai codé en VBA mais cela met des siècles à s'exécuter.
    J'ai fait un essai avec un autre algorithme plus intelligent mais pour le moment il n'est pas correct et je trouve dommage d'voir à réécrire quelque chose que Access pourrait faire pour moi.

    Donc ma question est : Y-a-t'il un moyen pour que Access s'aperçoive que mon champ mis à jour est dans une seule table, que le fait qu'il y ai une jointure multiple n'est pas grave et qu'il me fasse la mise à jour.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,

    Si réellement elle est non-updatable, une solution consiste à passer par une table temporaire

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    Bonsoir rené,
    C'est une particularité avec SQL Access : dès lors que tu utilises une requête regroupement, il n'est pas possible de l'utiliser pour faire une mise à jour.
    Hormis le VBA ou le Dsum() que tu as testé, la seule solution reste la table temporaire.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    C'est une particularité avec SQL Access : dès lors que tu utilises une requête regroupement, il n'est pas possible de l'utiliser pour faire une mise à jour.
    À OK, je comprend pourquoi on trouve des exemples de mise à jour qui marchent.
    Les auteurs ne précisaient pas ce point.

    Merci à vous.

    Je vais voir lundi ce qui va être le plus simple : un meilleur algo VBA ou une table tempo.
    Comme je suis un peu pris par le temps, je vais sans doute opter pour la table temporaire.

    Bonne fin de semaine.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Invité
    Invité(e)
    Par défaut
    bonjour,

    exemple de fonction qui réalise tout ça :
    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
     
    Public Function RunUpdateViaTable(ByVal TmpTableNom As String, ByVal SelectQueryNom As String, ByVal UpdateQueryNom As String) As Boolean
    On Error GoTo catch
    Dim oDb As DAO.Database
     
    Set oDb = CurrentDb
    DoCmd.SetWarnings False
     
    DoCmd.RunSQL "SELECT * INTO " & TmpTableNom & " FROM " & SelectQueryNom
    oDb.Execute UpdateQueryNom, dbFailOnError
    DoCmd.RunSQL "DELETE FROM " & TmpTableNom
     
    RunUpdateViaTable = True
     
    fin:
    DoCmd.SetWarnings True
    Set oDb = Nothing
    Exit Function
    catch:
        MsgBox "Erreur n°" & err.Number & vbCrLf & "Description : " & err.Description, vbExclamation, "RunUpdateViaTable()"
        Resume fin
    End Function
    Bien entendu, la requete update enregistrée pointe sur la table tmp et non plus sur la requete de selection

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci Galoir.

    J'ai fait grosso modo cela.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Question rapidité, ça donne quoi ?
    Merci

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    À peu près 1mn pour un traitement complet avec tous mes calculs.
    Ça fait en moyenne 5 à 6 secondes par étapes de calcul.
    Avec la table c'est hyper-rapide.

    Et cela n'explose pas ma BD. J'ai surveillé et elle prend environ 10 Mo entre le début et la fin des traitements tout en gardant les tables temporaires.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/06/2014, 21h21
  2. Outil VBA sur ArcGis : Copier/coller les lignes dans une table attributaire
    Par Alexiis dans le forum SIG : Système d'information Géographique
    Réponses: 2
    Dernier message: 26/09/2013, 16h15
  3. Copier les valeurs d'une table dans une autre
    Par Invité dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/08/2013, 16h11
  4. Copier les enregistrements d'une table dans une autre
    Par doolar dans le forum Bases de données
    Réponses: 10
    Dernier message: 21/04/2008, 21h36
  5. Réponses: 5
    Dernier message: 25/07/2005, 14h03

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