|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Analyste de gestion Inscription : décembre 2010 Messages : 10 ![]() |
Bonjour,
J'ai 2 tables très simples dans une base Access : - 1 table qui contient des actes enregistrés par code et par date de réalisation : 2 champs : >> code acte ; date acte - 1 table qui contient une nomenclature tarifaire historisée de ces actes : 3 champs : >> code acte ; date effet ; tarif Dans cette dernière nomenclature, certains actes apparaissent bien entendu plusieurs fois car leur tarif a été modifié au cours du temps. Ma question est sans doute bête... Dans le module de requête, je lie mes 2 tables par le code acte, et dans la requête je pose tous les éléments avec comme critère "<=date acte" sous "date effet". Là, la requête me remonte bien pour chaque acte tous les tarifs applicables jusqu'à la date de réalisation de l'acte, mais comme il peut y avoir eu plusieurs changements de tarifs pour un même acte avant cette date de réalisation, il remonte plusieurs lignes évidemment. Logiquement, pour un même acte qui remonte avec plusieurs tarifs, c'est la date effet la plus proche de la date de réalisation (donc la plus grande) qui indique le tarif applicable. Je pose donc "Max" dans la ligne des opérations et "regroupement" partout ailleurs, mais là je ne retrouve que la toute dernière date effet de toute la liste des actes... En fait le "max" porte sur la requête entière alors que je voudrais qu'il ne s'applique qu'au niveau de chaque acte qui remonte avec plusieurs dates effet. En écrivant ceci, je me rends compte que ce n'est pas très clair... si quelqu'un comprend et peu me filer un tuyau... merci d'avance ;o) ! Bonne soirée Seb |
|
|
00
|
|
|
#2 |
![]() ![]() René MAROTInscription : octobre 2005 Messages : 5 458 ![]() |
Ta question n'a rien de bête, et elle n'est pas simple à résoudre.
Une solution de contournement qui simplfie grandement le problème est d'avoir une date de début tarif et une date de fin de tarif. Quelque chose qui ressemble à : code acte ; date effet debut ; date effet fin ; tarif Pour le tarif en cours tu mets 31/12/9999 pour la date de fin. Pour sélectionner le tarif tu fais un truc du genre : Code sql :
WHERE [Date Acte] BETWEEN [DateEffetDebut] AND [DateEffetFin] AND [CodeActe] = ... Évidement il faut faire attention à ne pas avoir de recouvrement de période mais généralement c'est assez facile. Sinon tu dois trouver la date maximum tel que la date d'effet <= date de l'acte, puis une fois que tu as la date, tu peux trouver pour un acte le tarif à appliquer. C'est long et mal commode. 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. |
|
|
00
|
|
|
#3 | |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 176 ![]() |
Bonsoir Marot_r... désolé, nous nous sommes croisés, sur ce coup là...
Bonsoir Kerseb, Tu y étais presque... Tous les besoins ne peuvent pas, toujours, être résolus en une seule requête ! Il faut segmenter la solution. Nommes R1 cette requête (sans regroupement) : Citation:
- prends la requête R1 (FROM) ; - sélectionnes les champs "code acte" / "date effet" (SELECT) ; - sélectionnes "regroupement" (GROUP BY) ; - prends Max de "date effet". ==> donne 1 ligne par "code acte" avec la "date effet" maximum. Crées une requête R3 : - prends la requête R2 ; - lies-la à la requête R1 via "code acte"="code acte" et "date effet"= Max("date effet") ; - sélectionnes les champs que tu veux. ==> donne 1 ligne par "code acte" avec le prix correspondant à la "date effet" maximum.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
|
00
|
|
|
#4 | ||||
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
Bonsoir,
Une solution en partant de ta requête de base. 1ère table = tblActe 2ème table = tblActeTarif Code :
Code :
|
||||
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Analyste de gestion Inscription : décembre 2010 Messages : 10 ![]() |
Merci Marot, Richard et LedZepp !
Marot : en fait il faut que je monte une requête pour retraiter le fichier des tarifs historisés afin de bien les borner entre une date début et une date fin. Ca va en effet faciliter la requête de calage des dates de réalisation entre les bornes d'application des tarifs. Richard : ta solution est la plus évidente à première vue, et je la garde en réserve à utiliser en dernier ressort au cas où je ne m'en sortirais pas avec les autres, parce que, pour être très clair (j'aurais du le préciser dès le départ), ma table de réalisation des actes contient à l'heure actuelle plus de 2 millions de lignes (je suis dans un établissement hospitalier) pour retracer l'activité du labo de 2008 à aujourd'hui, et l'enchaînement de plusieurs requêtes à la suite occupe sérieusement le système (je n'ai jamais entendu mon PC faire autant de bruit que lorsque ces requêtes tournent sous Access !). LedZepp : Je pressens, mais je me trompe peut-être, que ta solution serait la plus légère, compte-tenu de la taille de la table à traiter, même si je suis un peu frileux pour me lancer dans la rédaction en SQL direct. Bref, je vais essayer tout ça tout à l'heure et je vous tiens au courant ! Encore merci à vous trois, et bon réveillon pour ce soir ![]() Seb |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Analyste de gestion Inscription : décembre 2010 Messages : 10 ![]() |
YEEESSS !
![]() OK, j'ai appliqué la solution de ZepLepp et ça fonctionne apparemment. Ceci dit, j'ai voulu vérifier que je ne perdais pas ni ne démultipliais d'enregistrements en appliquant la requête, et pour le moment, Access n'arrive plus à décompter les enregistrements résultant... Là j'ai quitté Access en compactant la base, je relancerai plus tard pour voir si j'arrive à faire un décompte et si j'obtiens le même nombre d'enregistrements que dans la table de départ. En tous cas encore merci à vous 3 ! Seb |
|
|
00
|
|
|
#7 |
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
Bonjour,
Avec 2 millions d'enregistrements ça risque de prendre du temps. Si ta 1ère table (code acte ; date acte) est remplie au fur et à mesure, tu aurais peut-être intérêt à recopier le tarif de l'acte dans cette table. Au lieu de rechercher en une fois 2 millions de tarifs, tu aurais recherché 2 millions de fois (réparties dans les temps) un tarif. A+ |
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Analyste de gestion Inscription : décembre 2010 Messages : 10 ![]() |
Oui, c'est précisément ce que je suis en train de faire : juste avant de faire ma requête d'ajout (je remonte les données une fois par mois et j'empile les mois dans la table de réalisation des actes), je vais d'abord passer une requête d'attribution des tarifs. Merci Led !
D'ailleurs, je crois même que je vais finir par scinder ma base en plusieurs bases, ne contenant chacune que les données d'une année entière, parce que c'est vraiment trop long à faire tourner sinon...
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com