Au sujet de l’héritage mettant en jeu les entités-types CONTACT, CLIENT et FOURNISSEUR, et les problèmes que cela vous pose au stade SQL, avez-vous utilisé le code SQL généré par JMerise ? Si oui, avez-vous lu ce que j’ai écrit à ce propos ?
Envoyé par
fsmrel
Dans « Paramètres & Configuration » > « Configuration des paramètres » > « Contraintes MCD », paramètre « Importer tous les attributs (non clés primaires) de l’entité mère » : je ne sais pas quelle est l’option par défaut : case cochée ? décochée ? Pour les novices, il est évident que la case doit être décochée, sinon avec le MCD ci-dessus, le MLD devient :
Concernant le contenu du panier
La présence de l’attribut DatePanierProduit dans l’association AJOUTE signifie que dans le même panier, deux produits différents P1 et P2 peuvent avoir des valeurs différentes pour l’attribut DatePanierProduit. Est-ce bien ce que vous voulez ? Par exemple, ci-dessous, selon la table AJOUTE, dans le panier 1, pour le produit 1 et le produit 2 les dates sont respectivement le '2018-08-07' et le '2018-08-08' :
PRODUIT {idProduit codeProduit Nom Tarif} PANIER {idPanier idContact}
1 P1 Produit 1 10 1 128
2 P2 Produit 2 20
AJOUTE {idProduit idPanier Quantite MontantTotal DatePanierProduit}
1 1 15 150 2018-08-07
2 1 4 80 2018-08-08
1 2 5 50 2018-08-07
Plutôt que de stocker « en dur » la valeur pour la colonne MontantTotal (une erreur de saisie est toujours possible), il sera préférable de mettre en oeuvre une fonction effectuant le calcul MontantTotal = Tarif X Quantite.
Exemple :
----------------------------------------------------------------------------
-- Calcul du montant total d’un article dans le panier: Tarif * Quantite
----------------------------------------------------------------------------
GO
CREATE FUNCTION CalcMtPanier(@leProduit INT, @laQuantite INT)
RETURNS INT
AS
BEGIN
RETURN (@laQuantite * (SELECT tarif FROM PRODUIT WHERE idProduit = @leProduit))
END
GO
Les tables (notez la colonne « calculée » MontantTotal) :
CREATE TABLE PRODUIT
(
idProduit INT IDENTITY NOT NULL
, codeProduit VARCHAR(8) NOT NULL
, Nom VARCHAR(48) NOT NULL
, Tarif INT NOT NULL
, CONSTRAINT PRODUIT_PK PRIMARY KEY (idProduit)
, CONSTRAINT PRODUIT_CODE_AK UNIQUE (codeProduit)
) ;
CREATE TABLE CONTACT
(
idContact INT IDENTITY NOT NULL
, NumeroContact VARCHAR(8) NOT NULL
, NomContact VARCHAR(48) NOT NULL
, Email VARCHAR(64) NOT NULL
, CONSTRAINT CONTACT_PK PRIMARY KEY (idContact)
, CONSTRAINT CONTACT_NUMERO_AK UNIQUE (NumeroContact)
) ;
CREATE TABLE CLIENT
(
idContact INT NOT NULL
, CONSTRAINT ARTICLE_PK PRIMARY KEY (idContact)
, CONSTRAINT CLIENT_CONTACT_FK FOREIGN KEY (idContact)
REFERENCES CONTACT (idContact) ON DELETE CASCADE
) ;
CREATE TABLE PANIER
(
idPanier INT IDENTITY NOT NULL
, idContact INT NOT NULL
, CONSTRAINT PANIER_PK PRIMARY KEY (idPanier)
, CONSTRAINT PANIER_CLIENT_FK FOREIGN KEY (idContact)
REFERENCES CLIENT (idContact) ON DELETE NO ACTION
) ;
CREATE TABLE AJOUTE
(
idProduit INT NOT NULL
, idPanier INT NOT NULL
, Quantite INT NOT NULL
, MontantTotal AS dbo.CalcMtPanier(idProduit, Quantite) ---- Appel à la fonction CalcMtPanier
, DatePanierProduit DATE NOT NULL
, CONSTRAINT AJOUTE_PK PRIMARY KEY (idPanier, idProduit)
, CONSTRAINT AJOUTE_PANIER_FK FOREIGN KEY (idPanier)
REFERENCES PANIER (idPanier) ON DELETE CASCADE
, CONSTRAINT AJOUTE_PRODUIT_FK FOREIGN KEY (idProduit)
REFERENCES PRODUIT (idProduit) ON DELETE NO ACTION
) ;
Un jeu de test :
INSERT INTO PRODUIT (codeProduit, Nom, Tarif) VALUES ('P1', 'Produit 1', 10) ;
INSERT INTO PRODUIT (codeProduit, Nom, Tarif) VALUES ('P2', 'Produit 2', 20) ;
INSERT INTO CONTACT (NumeroContact, NomContact, Email) VALUES ('K1', 'Contact 1', 'Cont1@machin.org') ;
INSERT INTO CONTACT (NumeroContact, NomContact, Email) VALUES ('K2', 'Contact 2', 'Cont1@machin.org') ;
INSERT INTO CLIENT (idContact) SELECT idContact FROM CONTACT ;
INSERT INTO PANIER (idContact) VALUES (1) ;
INSERT INTO PANIER (idContact) VALUES (2) ;
INSERT INTO AJOUTE (idProduit, idPanier, Quantite, DatePanierProduit) VALUES (1, 1, 15, '2018-08-07') ;
INSERT INTO AJOUTE (idProduit, idPanier, Quantite, DatePanierProduit) VALUES (2, 1, 4, '2018-08-08') ;
INSERT INTO AJOUTE (idProduit, idPanier, Quantite, DatePanierProduit) VALUES (1, 2, 5, '2018-08-07') ;
SELECT * FROM AJOUTE ;
=>
idProduit idPanier Quantite MontantTotal DatePanierProduit
1 1 15 150 2018-08-07
2 1 4 80 2018-08-08
1 2 5 50 2018-08-07
Entité-type RESERVATION
Vous ne prévoyez pas d’attribut pour la quantité réservée ?
Partager