Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Modélisation
Modélisation Le forum qui vous aide à résoudre vos questions relatives à la modélisation (tables et relations) de votre base de données sous Access. Pour les états et les formulaires, postez dans le forum IHM.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/12/2010, 17h39   #1
Invité régulier
 
Homme
Analyste de gestion
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Analyste de gestion
Secteur : Santé

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
Par défaut Requête : appliquer le bon tarif selon la date

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... (snif), mais j'ai beau tourner le problème dans tous les sens, je n'arrive pas à monter une requête pour coller le bon tarif en face de l'acte en fonction de la date de réalisation de cet acte.

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
kerseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 18h27   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 534
Points : 7 534
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 18h30   #3
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
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:
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.
Crées une requête R2 :
- 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.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 20h45   #4
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Une solution en partant de ta requête de base.

1ère table = tblActe
2ème table = tblActeTarif
Code :
1
2
3
4
5
SELECT tblActe.[code acte], tblActe.[date acte], tblActeTarif.[date effet], tblActeTarif.Tarif
FROM tblActe INNER JOIN tblActeTarif ON tblActe.[code acte] = tblActeTarif.[code acte]
WHERE (tblActeTarif.[date effet])=(SELECT Max(SR1.[date effet]) FROM tblActeTarif As SR1 
                                WHERE SR1.[code acte]=tblActe.[code acte] 
                                  And SR1.[date effet]<=tblActe.[date acte]);
J'ai utilisé une sous-requête comme critère du champ date effet.
Code :
1
2
3
SELECT Max(SR1.[date effet]) FROM tblActeTarif As SR1 
WHERE SR1.[code acte]=tblActe.[code acte] 
  And SR1.[date effet]<=tblActe.[date acte]
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 09h37   #5
Invité régulier
 
Homme
Analyste de gestion
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Analyste de gestion
Secteur : Santé

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
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
kerseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 12h45   #6
Invité régulier
 
Homme
Analyste de gestion
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Analyste de gestion
Secteur : Santé

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
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
kerseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 13h11   #7
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,
Citation:
Envoyé par kerseb Voir le message
... Access n'arrive plus à décompter les enregistrements...
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 13h18   #8
Invité régulier
 
Homme
Analyste de gestion
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Analyste de gestion
Secteur : Santé

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 5
Points : 5
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...
kerseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h50.


 
 
 
 
Partenaires

Hébergement Web