Salut tout le monde
j'ai 4 tables :
- tb_contrat {num_contrat, date_effet, PMD, code_tarif}
- tb_tarif {code_tarif, PU_PMD}
- tb_energie {num_facture, num_contrat, code_STEP}
- tb_STEP {code_STEP, nom_STEP}
à chaque STEP (ouvrage) est associé un contrat de fourniture d'énergie électrique, et pour chaque facture on doit être sûr qu'on ramène les bonnes informations correspondantes au contrat en vigueur selon la date de la facture. Donc la date de la facture doit correspondre au contrat approprié. Ce qui revient à dire qu'une facture est régie par un seul contrat même si l'ouvrage (STEP) a plusieurs contrats.
Par exemple :
contrat 1 : numéro 628526 date effet 10/01/2007
contrat 2 : numéro 628526 date effet 15/07/2010
contrat 3 : numéro 628526 date effet 13/09/2014
facture 1 : 05/02/2007 ---> contrat 1
facture 2 : 09/04/2009 ---> contrat 2
facture 3 : 11/09/2010 ---> contrat 2
facture 4 : 20/11/2012 ---> contrat 2
facture 5 : 08/12/2014 ---> contrat 3
mon idée est de chercher la max(date_effet) de la table des contrats pour l'ouvrage en question puis de le comparer à la date de la facture, si date_facture > date_effet alors c'est le bon contrat sinon éliminer le dernier contrat et rechercher le max puis comparer jusqu'à satisfaction de la condition ....
Toute autre idée est la bienvenue.
un bout de code pour commencer :
le résultat est erroné puisque j'ai à la sortie plusieurs lignes à la place d'une seule comme je le souhaite.
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 select s.nom_step, (select code_tarif from tb_contrat where e.date_mois > (select max(date_effet) from tb_contrat inner join tb_step on (tb_step.code_step = tb_contrat.code_step) where s.code_step = tb_step.code_step)) , e.num_facture, e.date_mois, c.pmd from tb_contrat c inner join tb_step s on (c.code_step = s.code_step) inner join tb_energie e on (s.code_step = e.code_step) inner join tb_tarif t on (c.code_tarif = t.code_tarif) where ( (s.code_step = 8) and (e.date_mois = :date_facture) )
Merci par avance.
Partager