Salve ordigil,
Je préfère continuer sur la lancée de la modélisation faite au cours de la discussion, donc compléter en faisant abstraction de cette table Maintenance (et autres que je ne connais pas), de toute façon illisible pour moi à l’écran, tant c’est écrit petit...
De ce que je comprends, il faut que l’on puisse suivre les changements d’huile pour chaque moteur, et savoir quel camion était équipé de ce moteur à ce moment-là.
C’est bien cela ?
Supposons que oui...
On définit un table HUILE_CHANGEMENT permettant de connaître les dates successives de changement d’huile pour les moteurs. Si on a besoin de se souvenir de la marque de l’huile nouvelle, on définit une table HUILE_MARQUE :
Bien noter que la clé primaire de la table HUILE_CHANGEMENT est la paire {ComposantId, HuileDateChangement}.
Table HUILE_MARQUE : présence d’une clé alternative à usage de l’utilisateur : {HuileMarqueCode}.
Déclaration des tables :
CREATE TABLE HUILE_MARQUE
(
HuileMarqueId INT IDENTITY NOT NULL
, HuileMarqueCode CHAR(8) NOT NULL
, HuileMarqueNom VARCHAR(48) NOT NULL
, CONSTRAINT HUILE_MARQUE_PK PRIMARY KEY (HuileMarqueId)
, CONSTRAINT HUILE_MARQUE_AK UNIQUE (HuileMarqueCode)
) ;
CREATE TABLE HUILE_CHANGEMENT
(
ComposantId INT NOT NULL
, HuileDateChangement DATE NOT NULL
, HuileMarqueId INT NOT NULL
, CONSTRAINT HUILE_CHANGEMENT_PK PRIMARY KEY (ComposantId, HuileDateChangement)
, CONSTRAINT HUILE_CHANGEMENT_FK FOREIGN KEY (ComposantId)
REFERENCES MOTEUR (ComposantId)
, CONSTRAINT HUILE_MOTEU_HUILE_MARQUE_FK FOREIGN KEY (HuileMarqueId)
REFERENCES HUILE_MARQUE (HuileMarqueId)
) ;
De mon côté, le diagramme complété est le suivant :
Créer des marques d’huile :
INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000001', 'Marque 1, de chez fsmrel, c’est dire !') ;
INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000002', 'Marque 2, excellente aussi pour la salade') ;
INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000003', 'Marque 3, "La bizarre"') ;
SELECT '' as HUILE_MARQUE, * FROM HUILE_MARQUE ;
Changements d’huile pour un moteur :
Le 2015-09-01, puis le 2017-09-17, le moteur de numéro de série 's01' change d’huile (et de marque d’huile), même chose le 2012-11-05 pour le moteur 's02' :
INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000001'), '2015-09-01'
FROM MOTEUR
WHERE MoteurNumeroSerie = 's01'
;
INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000003'), '2012-11-05'
FROM MOTEUR
WHERE MoteurNumeroSerie = 's02'
;
INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000001'), '2017-09-17'
FROM MOTEUR
WHERE MoteurNumeroSerie = 's01'
;
Pour faciliter la vue qu’a l’utilisateur des choses (noter le WHERE !) :
CREATE VIEW CAMION_HUILE_V (CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileMarqueNom)
AS
SELECT CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileMarqueNom
FROM CAMION AS x JOIN COMPOSANT_AFFECTATION AS y ON x.LocalisationId = y.LocalisationId
JOIN HUILE_CHANGEMENT AS z ON y.ComposantId = z.ComposantId
JOIN MOTEUR AS w ON z.ComposantId = w.ComposantId
JOIN HUILE_MARQUE AS t ON z.HuileMarqueId = t.HuileMarqueId
WHERE HuileDateChangement >= ComposantInstallationDate AND HuileDateChangement <= ComposantDesInstallationDate
;
Regardons :
SELECT * FROM CAMION_HUILE_V
;
=>
CamionImmat MoteurNumeroSerie HuileDateChangement HuileMarqueNom
immat01 s01 2015-09-01 Marque 1, de chez fsmrel, c’est dire !
immat01 s02 2012-11-05 Marque 3, "La bizarre"
immat03 s01 2017-09-17 Marque 1, de chez fsmrel, c’est dire !
Le camion de « VIN » 'immat01' a changé de moteur : précédent = 's02', avec changement d’huile le 2012-11-05 ; suivant = 's01', avec changement d’huile le 2015-09-01.
A vous de voir si nous sommes en phase...
Partager