|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Futur Membre du Club
![]() Thomas M Inscription : février 2011 Messages : 38 ![]() |
Bonjour à tous,
Après quelques recherches, je n'ai toujours pas trouvé réponse à mon problème. Tout d'abord, je ne pense pas qu'il s'agisse d'une requête récursive, quoi que son fonctionnement m'y fait penser ... J'ai une requête qui me donne des enregistrements de la sorte: REQ: Code :
Je voudrais donc faire une jointure (externe) de la requête sur elle même, en rajoutant un champ SemainePrécédente, avec comme critère Code :
ON(T1.ID_Usine = T2.ID_Usine AND T1.SemainePrécédente = T2.Semaine) Mais Access n'aime pas ... "référence circulaire" bla bla bla, même avec un IIf pour mettre à zéro le reste précédent s'il est nul (pour la première semaine). Je sais qu'il est aussi possible de trouver ce reste en faisant une somme cumulée du style: Code :
Cependant cette dernière solution est beauuuuucoup trop longue à s'executer, car je dispose de milliers d'enregistrements dans ma dernière requête, qui est déjà composée de 4 à 5 sous requêtes traitant des tables contenant plusieurs dizaines de milliers d'enregistrements ... Merci d'avance pour votre aide |
||||
|
|
00
|
|
|
#2 | |
|
Membre habitué
![]() Inscription : janvier 2006 Messages : 99 ![]() |
Bonjour,
je rebondis sur cette phrase : Citation:
Si c'est bien le cas, la requête est ensuite facile à faire. Cordialement, |
|
|
|
00
|
|
|
#3 | ||||
|
Futur Membre du Club
![]() Thomas M Inscription : février 2011 Messages : 38 ![]() |
Citation:
Citation:
C'est bien ce que je disais, mais en effet, c'est facile mais lourd ... refaire la somme pour chaque enregistrement, ce n'est pas du tout efficient, et je ne peux pas me le permettre. A moins qu'il y ait une manière plus simple et efficace de construire la requête. |
||||
|
|
00
|
|
|
#4 | ||
![]() ![]() Denis Développeur informatique Inscription : août 2004 Messages : 3 205 ![]() |
Salut,
Je ne vois pas d'autre solution, sauf à essayer ceci : Code sql :
A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp. Bon développement ! Mes tutoriels et contributions sur ma page perso: Ma page personnelle |
||
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Thomas M Inscription : février 2011 Messages : 38 ![]() |
Merci User, ça marche et c'est vraiment 1000 fois plus rapide que la fonction Somdom que je n'utiliserai plus jamais ...
Mais bon par contre ça met toujours 14 minutes pour m'afficher 557 restes ... Pourtant ma requête "REQ" (qui est composée pas mal de choses déjà) ne met que 2 à 3 secondes à s'ouvrir ... (ce qui est déjà beaucoup certes) Etant donné que je vais devoir encore effectuer beaucoup de requêtes sur cette dernière requête, il est intéressant d'enregistrer le résultat dans une table non? Tant pis la redondance d'informations? Access ne garde t il pas en mémoire tampon les résultats des requêtes pour ne pas avoir à tout recalculer à chaque fois ? EDIT: en sauvegardant le résultat de ma première requête "REQ" dans une table, avec une jolie clé multichamp, le calcul du reste est instantanné .. je pense que je vais dire au diable le principe de redondance des informations dans les tables. Y a t il des règles à propos de ça ? |
|
|
00
|
|
|
#6 |
![]() ![]() Denis Développeur informatique Inscription : août 2004 Messages : 3 205 ![]() |
En effet,
Il arrive dans certain cas que la création d'une table temporaire (par exemple) soit indispensable niveau performance, mais as-tu essayé de le faire en 1 seule requête sans passer par la requête intermédiaire "Req" ? Regardes aussi si tu ne peux pas mettre des index sur certains champs pour optimiser les temps d'exécutions... A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp. Bon développement ! Mes tutoriels et contributions sur ma page perso: Ma page personnelle |
|
00
|
|
|
#7 |
|
Futur Membre du Club
![]() Thomas M Inscription : février 2011 Messages : 38 ![]() |
Toutes mes tables disposent de Clés Multichamps, et toutes les clés étrangères sont aussi indexées. Quasiment toutes mes relations sont faite avec l'intégrité référentielle. Tout est sensé être bien optimisé.
Effectuer la requête sans passer par "REQ" ? Ma requête "REQ" est composée de différentes jointures de requêtes, elles même composées de jointures de requêtes .. ça fait beaucoup. Je viens d'essayer, et ça met autant de temps. Je vais donc passer par une table temporaire que je vais créer proprement en VBA, ça me parait inévitable. Merci pour ton aide en tout cas. |
|
|
00
|
|
|
#8 | ||||
|
Futur Membre du Club
![]() Thomas M Inscription : février 2011 Messages : 38 ![]() |
Bonjour,
Dans le même thème, je me heurte à un nouveau problème ... Je voudrais effectuer un calcul de la sorte: Style un peu gestion des stocks (mais différent), avec chaque semaine, une livraison, une entrée qui correspond au reste de la semaine précédente, une consommation Prévision = entrée * un certain pourcentage, et ma sortie qui est l'entrée - prévision. Dans le cas précédent, la consommation était constante et il suffisant de faire la somme des livraisons précédentes - la somme des consos précédentes. Or dans mon cas, ce n'est pas possible comme ça. J'ai même essayé en rajoutant un champ "% cumulé" qui est le produit des % précédents, mais dès qu'une nouvelle livraison arrive, cela foire tout ( normal ! ). Et lorsque je fais une requête du type Code :
Code :
Même en faisant des tests "If(Not isnull( ... ) ) je me récupère cette erreur la ligne suivante en vouant récupérer la valeur du Fields(0). A mon avis, cela vient du fait que je fasse la requête sur le même Champ (je veux mettre à jour le champ Entrée en fonction du champ Entrée précédent), et que la requête "UPDATE ..." ne met à jour les champs en une seule fois à la fin ... Merci d'avance pour votre aide |
||||
|
|
00
|
|
|
#9 | ||
|
Futur Membre du Club
![]() Thomas M Inscription : février 2011 Messages : 38 ![]() |
Finalement j'ai trouvé. Il suffisait de refaire les étapes de calcul une par une sans chercher à repasser par la valeur du même champ précédent:
Code :
DoCmd.RunSQL "UPDATE [Ma_Table] SET Entree=SortiePrecedente(Modèle,SemainePlan)+Livraison Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com