Envoyé par
devdev
Si dans 3 mois,l'administration supprime un régime fiscal, je ne peux pas supprimer mon régime de ma table, car il est lié aux factures précédentes.
Il est opportun de mettre en oeuvre un historique des régimes. Exemple de MCD avec Looping, gracieusement proposé par le professeur Patrick Bergougnoux (merci Paprick !) :
Le régime applicable à une facture est connu grâce à la date de celle-ci, car elle est dans l’intervalle <regimeDateDebut,regimeDateFin> défini dans l’entité-type REGIME. Notez la clé alternative {regimeCode,regimeDateDebut} mise en oeuvre pour REGIME.
Un jeu d’essai. Les instructions "CREATE TABLE" ci-dessous sont celles qui ont été produites par Looping :
CREATE TABLE REGIME(
regimeId INT IDENTITY,
regimeCode CHAR(8) NOT NULL,
regimeDateDebut DATE NOT NULL,
regimeDateFin DATE NOT NULL,
regimeStatut CHAR(8) NOT NULL,
regimeLibelle VARCHAR(48) NOT NULL,
CONSTRAINT REGIME_PK PRIMARY KEY(regimeId),
CONSTRAINT REGIME_1_AK UNIQUE(regimeCode, regimeDateDebut)
);
INSERT INTO REGIME (regimeCode, regimeDateDebut, regimeDateFin, regimeStatut, regimeLibelle)
VALUES
('reg01', '1970-01-01', '1995-12-31', 's01', 'regime 1')
, ('reg01', '1996-01-01', '2017-12-31', 's02', 'regime 1 revu')
, ('reg01', '2018-01-01', '9999-12-31', 's02', 'regime 1 encore revu')
, ('reg02', '1970-01-01', '2015-07-13', 's05a', 'regime 5 supprimé')
, ('reg02', '2015-07-14', '9999-12-31', 's05b', 'regime 5')
;
SELECT regimeCode, regimeDateDebut, regimeDateFin, regimeStatut, regimeLibelle
FROM REGIME
;
=>
regimeCode regimeDateDebut regimeDateFin regimeStatut regimeLibelle
reg01 1970-01-01 1995-12-31 s01 regime 1
reg01 1996-01-01 2017-12-31 s02 regime 1 revu
reg01 2018-01-01 9999-12-31 s02 regime 1 encore revu
reg02 1970-01-01 2015-07-13 s05a regime 5 supprimé
reg02 2015-07-14 9999-12-31 s05b regime 5
CREATE TABLE FACTURE(
factureId INT IDENTITY,
factureNumero CHAR(16) NOT NULL,
factureDate DATE NOT NULL,
etc VARCHAR(48) NOT NULL,
regimeId INT NOT NULL,
CONSTRAINT FACTURE_PK PRIMARY KEY(factureId),
CONSTRAINT FACTURE_AK UNIQUE(factureNumero),
CONSTRAINT FACTURE_REGIME_FK FOREIGN KEY(regimeId) REFERENCES REGIME(regimeId)
);
INSERT INTO FACTURE (factureNumero, factureDate, regimeId, etc)
VALUES
(
'fac012', '1990-02-20'
, (SELECT regimeId
FROM REGIME
WHERE regimeCode = 'reg02'
AND regimeDateDebut <= '1990-02-20'
AND regimeDateFin>= '1990-02-20')
, 'etc. blabla'
) ;
INSERT INTO FACTURE (factureNumero, factureDate, regimeId, etc)
VALUES
(
'fac125', '2021-01-15'
, (SELECT regimeId
FROM REGIME
WHERE regimeCode = 'reg02'
AND regimeDateDebut <= '2021-01-15'
AND regimeDateFin>= '2021-01-15')
, 'etc. blabla'
) ;
SELECT factureNumero, factureDate, regimeCode, regimeStatut, regimeLibelle
FROM FACTURE as x
JOIN REGIME as y on x.regimeId= y.regimeId ;
=>
factureNumero factureDate regimeCode regimeStatut regimeLibelle
fac012 1990-02-20 reg02 s05a regime 5 supprimé
fac125 2021-01-15 reg02 s05b regime 5
Vous noterez que les régimes en vigueur ont une date fin égale à « l’infini ».
Si le libellé d’un régime ne change pas dans le temps, alors pour des raisons de 2NF (deuxième forme normale), c’est-à-dire pour éviter les redondances, il faudra mettre en oeuvre une table de ces libellés.
Partager