IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Maintenance de camions


Sujet :

Schéma

  1. #21
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Vous avez raison pour la date 9999-12-31. C'est une façon élégante pour contourner le problème Ça me va Et la date 9999-12-31 pourrait être automatiquement affecté par défaut dans la colonne dateDesinstallation lorsque le Moteur est installé dans un Camion.
      1  0

  2. #22
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Envoyé par ordigil
    Il faut garder à l'esprit qu'un camion aura une Partie Maintenance et une Partie Réparations.

    Hum... Ce sujet n’a jamais été mis sur le tapis : différons, et concentrons-nous sur les affectations !

    Oui car mon problème dans la base de donné est la façon de gérer les relations entre Camion, Moteur, Transmission, Différentiel. Pour le reste ça sera plus facile pour moi de le réaliser.
      0  0

  3. #23
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par ordigil Voir le message
    mon problème dans la base de données est la façon de gérer les relations entre Camion, Moteur, Transmission, Différentiel. Pour le reste ça sera plus facile pour moi de le réaliser.
    Bien ! Allons-y pour les moteurs et les camions.


    Citation Envoyé par ordigil Voir le message
    Le choix de l'emplacement pour les Moteurs seront soit dans Camion, soit Entrepôt, soit Vendu. Si Vendu, on ne s'en occupe plus, il peut disparaître de ma Base de Données.
    Si le moteur disparaît de la base de données une fois vendu, vous aurez peut-être des problèmes pour repasser le film à l’envers : ça ne coûte pas cher de conserver l’information « vendu », et dans ce qui suit, histoire d’avancer, je vais considérer que c’est le cas.

    Pour résoudre le problème du distinguo CAMION / ENTREPÔT / VENDU, je mets dans le même pot ENTREPÔT et VENDU, et appelons par exemple LOCAL ce pot commun (renommez à votre guise). Suite à cela, on procède à une généralisation des tables CAMION (qui a ses attributs spécifiques) et LOCAL (qui a ses attributs spécifiques) au moyen d’une table LOCALISATION (renommez-la à votre guise) : cela permet d’avoir une interface commune vis-à-vis des affectations des moteurs, sans savoir ce qu’il y a derrière LOCALISATION, sauf nécessité bien sûr. Je mets en place des attributs au petit bonheur (comme disait Félix, « que j’avais ramassé, il était tout en pleurs sur le bord du fossé »...), à vous de mettre les bons attributs.

    Regardons ce que cela donne avec le diagramme suivant :



    Passons au code SQL :

    CREATE TABLE LOCALISATION 
    (
            LocalisationId         INT  IDENTITY   NOT NULL
          , LocalisationNote       VARCHAR(64)     NOT NULL DEFAULT ''
        , CONSTRAINT LOCALISATION_PK PRIMARY KEY (LocalisationId)
    );
    
    CREATE TABLE CAMION 
    (
            LocalisationId        INT             NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
        , CONSTRAINT CAMION_PK PRIMARY KEY (LocalisationId)
        , CONSTRAINT CAMION_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    
    CREATE TABLE LOCAL 
    (
            LocalisationId        INT             NOT NULL
          , LocalCode             CHAR(5)         NOT NULL
          , LocalNom              VARCHAR(48)     NOT NULL
        , CONSTRAINT LOCAL_PK PRIMARY KEY (LocalisationId)
        , CONSTRAINT LOCAL_AK UNIQUE (LocalCode)
        , CONSTRAINT LOCAL_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    
    CREATE TABLE MOTEUR 
    (
            MoteurId              INT  IDENTITY   NOT NULL
          , MoteurNumero          VARCHAR(25)     NOT NULL
          , MoteurDateAchat       DATE            NOT NULL
        , CONSTRAINT MOTEUR_PK PRIMARY KEY (MoteurId)
        , CONSTRAINT MOTEUR_AK UNIQUE (MoteurNumero)
    );
    
    CREATE TABLE MOTEUR_AFFECTATION 
    (
            MoteurId                    INT             NOT NULL
          , MoteurAffectationId         INT  IDENTITY   NOT NULL
          , MoteurInstallationDate      DATE            NOT NULL
          , MoteurDesInstallationDate   DATE            NOT NULL  DEFAULT '9999-12-31'
          , LocalisationId              INT             NOT NULL
        , CONSTRAINT MOTEUR_AFFECTATION_PK PRIMARY KEY (MoteurId, MoteurAffectationId)
        , CONSTRAINT MOTEUR_AFFECTATION_MOTEUR_FK FOREIGN KEY (MoteurId) 
                     REFERENCES  MOTEUR (MoteurId)
        , CONSTRAINT MOTEUR_AFFECTATION_MOTEUR_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
        , CONSTRAINT MOTEUR_AFFECTATION_CHECK01 CHECK (MoteurDesInstallationDate > MoteurInstallationDate)
    );
    
    Est-ce jusque-là vous êtes d’accord avec moi ? Avez-vous des contre-indications ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  4. #24
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut Triggers
    Passons aux triggers. Je propose ici de surveiller les inserts dans la table MOTEUR_AFFECTATION, mais il faudra s’occuper aussi des updates (modification des dates). Pour le trigger qui suit, j’ai utilisé l’option INSTEAD, mais dans la série ceinture, bretelles et pingle à nourrice, on peut remplacer par AFTER.

    Il s’agit ici de s’assurer que :

    (1) Pour un moteur donné, deux périodes d’affectation ne se chevauchent pas ;

    (2) Pour un camion donné, qu’il n’ait pas deux moteurs en même temps.

    CREATE TRIGGER MoteurDateRecouvrement_TR ON MOTEUR_AFFECTATION INSTEAD OF INSERT
    AS
    BEGIN
    SELECT  ''   
     FROM    INSERTED AS x JOIN MOTEUR_AFFECTATION AS y ON x.MoteurId = y.MoteurId 
             AND (x.MoteurInstallationDate < y.MoteurInstallationDate  AND x.MoteurDesInstallationDate >= y.MoteurInstallationDate 
              OR  x.MoteurInstallationDate >= y.MoteurInstallationDate AND x.MoteurInstallationDate <= y.MoteurDesInstallationDate)
    ;
     IF @@Rowcount > 0
          BEGIN 
             SELECT 'Affectation de moteur(s) : recouvrement de période !' AS Engueulade, * FROM INSERTED
    --         RAISERROR ('Affectation de moteur(s) : recouvrement de période !',16,1)  -- state = 16 pour bloquer  
             RAISERROR ('Affectation de moteur(s) : recouvrement de période !',0,1)  -- state = 0 pour les tests 
             RETURN
          END
    
    --  Un camion, un seul moteur à la fois. Les entrepôts ne sont pas concernés
    
    SELECT  y.LocalisationId   
     FROM    INSERTED AS x JOIN MOTEUR_AFFECTATION AS y ON x.LocalisationId = y.LocalisationId 
                           JOIN CAMION AS z ON  x.LocalisationId = z.LocalisationId
             AND (x.MoteurInstallationDate < y.MoteurInstallationDate  AND x.MoteurDesInstallationDate >= y.MoteurInstallationDate 
              OR  x.MoteurInstallationDate >= y.MoteurInstallationDate AND x.MoteurInstallationDate <= y.MoteurDesInstallationDate)
    ;
     IF @@Rowcount > 0
          BEGIN 
             SELECT 'Un camion, un seul moteur à la fois !' AS Engueulade, * FROM INSERTED
    --         RAISERROR ('Un camion, un seul moteur à la fois !',16,1)  -- state = 16 pour bloquer 
             RAISERROR ('Un camion, un seul moteur à la fois !',0,1)  -- state = 0 pour les tests
             RETURN
          END
    
     INSERT INTO MOTEUR_AFFECTATION 
                 SELECT   MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId 
                 FROM    INSERTED
    END
    GO
    
    Il faudra que vous procédiez à des tests exhaustifs, histoire de vérifier que je suis dans les clous quant aux règles de gestion des données...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  5. #25
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Quelques inserts.

    Pour chaque camion, on insère d’abord dans LOCALISATION et on laisse SQL Server se charger d’y incrémenter LocalisationId. On récupère alors la valeur correspondante à l’aide de la fonction MAX pour insérer dans la table CAMION, en fonction du numéro d’immatriculation (ou autre clé candidate si existe).

    Pour chaque local, même principe.

    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat) 
        SELECT MAX(LocalisationId), 'immat01', '2012-07-01' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat)
        SELECT MAX(LocalisationId), 'immat02', '2015-07-05' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO LOCAL (LocalisationId, LocalCode, LocalNom)
        SELECT MAX(LocalisationId), 'loc01', 'Entrepôt Tartempion' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat)
        SELECT MAX(LocalisationId), 'immat03', '2016-04-01' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO LOCAL (LocalisationId, LocalCode, LocalNom) 
        SELECT MAX(LocalisationId), 'loc02', 'Vendu' FROM LOCALISATION ;
    
    Au résultat :

    SELECT * FROM CAMION ;
    
    LocalisationId    CamionImmat    CamionDateAchat
    1                 immat01        2012-07-01
    2                 immat02        2015-07-05
    4                 immat03        2016-04-01
    
    SELECT * FROM LOCAL ;
    
    LocalisationId    LocalCode    LocalNom
    3                 loc01        Entrepôt Tartempion
    5                 loc02        Vendu
    
    Les moteurs :

    INSERT INTO MOTEUR (MoteurNumero, MoteurDateAchat) VALUES ('s01', '2011-01-01') ;
    INSERT INTO MOTEUR (MoteurNumero, MoteurDateAchat) VALUES ('s02', '2011-04-01') ;
    INSERT INTO MOTEUR (MoteurNumero, MoteurDateAchat) VALUES ('s03', '2012-04-01') ;
    
    SELECT * FROM MOTEUR ;
    
    MoteurId    MoteurNumero    MoteurDateAchat
    1           s01             2011-01-01
    2           s02             2011-04-01
    3           s03             2012-04-01
    

    Affectations successives d'un moteur à des camions et à des entrepôts

    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2011-01-02', '2015-07-19'
            , (SELECT LocalisationId 
               FROM LOCAL WHERE LocalCode = 'loc01')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's01'
    ;
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2015-07-20', '2016-12-08'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's01'
    ;
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2016-12-09', '2017-04-01'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat02')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's01'
    ;
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2017-04-02', '2017-12-06'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat03')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's01'
    ;
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId)  
        SELECT MoteurId, '2017-12-07', '9999-12-31'
            , (SELECT LocalisationId 
               FROM LOCAL WHERE LocalCode = 'loc02')
        FROM   MOTEUR 
        WHERE  MoteurNumero = 's01'
    ;
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2012-07-02', '2013-01-02'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's02'
    ;
    
    -- Insert légal (un entrepôt n'est pas un camion et peut accueillir plusieurs moteurs en même temps)
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2017-05-01', '2017-05-02'
            , (SELECT LocalisationId 
               FROM LOCAL WHERE LocalCode = 'loc02')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's02'
    ;
    
    ------------------------------------------------------------
    -- Tentative d'infraction (recouvrement des périodes)
    ------------------------------------------------------------
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
    --    SELECT MoteurId, '2015-07-18', '2015-07-19'
    --    SELECT MoteurId, '2015-07-18', '9999-12-31'
    --    SELECT MoteurId, '2017-12-31', '2017-12-31'
    --    SELECT MoteurId, '2017-12-31', '2018-01-01'
        SELECT MoteurId, '2018-01-01', '2018-01-02'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat03')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's01'
    ;
    =>
    
    Engueulade                                            MoteurId    MoteurAffectationId    MoteurInstallationDate    MoteurDesInstallationDate    LocalisationId
    Affectation de moteur(s) : recouvrement de période !  1           0                      2018-01-01                2018-01-02                   4
    

    ------------------------------------------------------------------
    -- Tentative d'infraction (plus d'un moteur pour un camion)
    ------------------------------------------------------------------
    
    INSERT INTO MOTEUR_AFFECTATION (MoteurId, MoteurInstallationDate, MoteurDesInstallationDate, LocalisationId) 
        SELECT MoteurId, '2015-07-18', '2015-07-20'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumero = 's02'
    ;
    
    =>
    
    Engueulade                             MoteurId    MoteurAffectationId    MoteurInstallationDate    MoteurDesInstallationDate    LocalisationId
    Un camion, un seul moteur à la fois !  2           0                      2015-07-18                2015-07-20                   1
    

    Table MOTEUR_AFFECTATION :

     
    MoteurId    MoteurAffectationId    MoteurInstallationDate    MoteurDesInstallationDate    LocalisationId
    1           1                      2011-01-02                2015-07-19                   3
    1           2                      2015-07-20                2016-12-08                   1
    1           3                      2016-12-09                2017-04-01                   2
    1           4                      2017-04-02                2017-12-06                   4
    1           5                      2017-12-07                9999-12-31                   5
    2           6                      2012-07-02                2013-01-02                   1
    2           7                      2017-05-01                2017-05-02                   5
    

    Une vue pour présenter les liens entre les moteurs, les camions ou les entrepôts, tout en masquant les attributs artificiels (MoteurId, LocalisationId) :

    GO
    CREATE VIEW MOTEUR_LOCALISATION (Numero_moteur, Achat_moteur, Date_installation, Date_désinstallation, Type_localisation, immat_camion_ou_inventaire, entrepot_ou_date_achat_camion)
    AS
    SELECT MoteurNumero, MoteurDateAchat, MoteurInstallationDate, MoteurDesInstallationDate, 'Camion ', CamionImmat, CAST(CamionDateAchat AS VARCHAR(10))
    FROM   MOTEUR AS x JOIN MOTEUR_AFFECTATION AS y ON x.MoteurId = y.MoteurId
                       JOIN CAMION AS z ON y.LocalisationId = z.LocalisationId
    UNION
    SELECT MoteurNumero, MoteurDateAchat, MoteurInstallationDate, MoteurDesInstallationDate, 'Entrepôt/vendu ', LocalCode, LocalNom
    FROM   MOTEUR AS x JOIN MOTEUR_AFFECTATION AS y ON x.MoteurId = y.MoteurId
                       JOIN LOCAL AS z ON y.LocalisationId = z.LocalisationId
     ;
     GO
    
     SELECT * FROM MOTEUR_LOCALISATION 
     ORDER BY Numero_moteur, Date_installation ;
    
    =>

    Numero_moteur    Achat_moteur    Date_installation    Date_désinstallation    Type_localisation    immat_camion_ou_inventaire    entrepot_ou_date_achat_camion
    s01              2011-01-01      2011-01-02           2015-07-19              Entrepôt/vendu       loc01                         Entrepôt Tartempion
    s01              2011-01-01      2015-07-20           2016-12-08              Camion               immat01                       2012-07-01
    s0               2011-01-01      2016-12-09           2017-04-01              Camion               immat02                       2015-07-05
    s01              2011-01-01      2017-04-02           2017-12-06              Camion               immat03                       2016-04-01
    s01              2011-01-01      2017-12-07           9999-12-31              Entrepôt/vendu       loc02                         Vendu
    s02              2011-04-01      2012-07-02           2013-01-02              Camion               immat01                       2012-07-01
    s02              2011-04-01      2017-05-01           2017-05-02              Entrepôt/vendu       loc02                         Vendu
    
    Pensez-vous qu’on commence à voir le bout du tunnel ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  6. #26
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    oh là, je n'imaginais pas ça aussi compliqué lollllll. J'ai fait des petites bases de données et créé l'interface avec visual basic mais là oufffff je ne sais pas comment je vais faire En plus je devrai utiliser C#.... Bon vous avez tout à fait saisi la façon dont je veux que la base de données fonctionne. Et vous avez raison pour '' Si le moteur disparaît de la base de données une fois vendu, vous aurez peut-être des problèmes pour repasser le film à l’envers : ça ne coûte pas cher de conserver l’information « vendu », et dans ce qui suit, histoire d’avancer, je vais considérer que c’est le cas. '' Je préférais conserver aussi, on ne sait jamais, ça pourrait servir à nouveau. Bon assez compliqué pour mes compétences et là on a seulement réglé le cas Moteurs-Camions. Il y a aussi les cas Transmissions-Camions et Différentiels-Camions à régler. Est-ce que je devrai refaire la même chose 3 fois en substituant Moteur par Transmissions et par Différentiels ? Est-ce que je vais répéter 3 fois le même code ???? Je m'excuse, c'est plus compliqué que j'avais initialement prévu alors je suis un peu perdu.
    Lorsque je regarde tous ce que vous avez développé, ça semble concorder avec ce que je veux. J'espère que je n'aurai pas trop de problèmes à chainer tout ça avec le restant de ma base de données
    Je crois que je vais avoir d'énormes problèmes mais une chose à la fois.
      0  0

  7. #27
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    SELECT * FROM CAMION ;

    SELECT * FROM LOCAL ;

    LocalisationId CamionImmat CamionDateAchat
    1 immat01 2012-07-01
    2 immat02 2015-07-05
    4 immat03 2016-04-01

    LocalisationId LocalCode LocalNom
    3 loc01 Entrepôt Tartempion
    5 loc02 Vendu


      0  0

  8. #28
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Wowww Vous avez tout fait et tout testez hehehe
    Pour les moteurs ça semble fonctionner à merveille, vous êtes un AS

    J'essayais avec PowerShell et je n'y arrivais pas mais à l'aide de MSSM ça fonctionne à merveille.

    J'ai installé SQL Server sur un PC et je fais tout à partir de mon Laptop. J'ai installé MSSM sur mon laptop. Le but est de simuler en temps réelle la création, l'administration, etc. de la base de données. Je ne vois pas pourquoi ça ne passe pas avec PowerShell mais ça passe très bien avec MSSM. C'est un petit détail car de toute façon j'utiliserai MSSM pour l'administration. Je n'aurai pas un accès physique au Server SQL, seulement à distance par internet. Vous m'êtes vraiment d'un grand secours car je n'imaginais pas cette partie de ma base de données aussi compliquée.
      2  0

  9. #29
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par ordigil Voir le message
    je n'imaginais pas cette partie de ma base de données aussi compliquée.
    On pourrait faire beaucoup plus simple, en ne contrôlant rien du tout !

    Sinon, du point de vue du diagramme ça ne va pas bien loin : 5 tables si on ne traite que des moteurs, et guère plus si on traite des transmissions et des différentiels (voire encore d’autres composants...)


    Citation Envoyé par ordigil Voir le message
    Il y a aussi les cas Transmissions-Camions et Différentiels-Camions à régler. Est-ce que je devrai refaire la même chose 3 fois en substituant Moteur par Transmissions et par Différentiels ? Est-ce que je vais répéter 3 fois le même code ????
    Ça serait ballot d’avoir 3 fois le même code ! On va tâcher de n’ajouter que ce qui est nécessaire.

    Généralisons, et mettons en oeuvre une table COMPOSANT (ou PIECE, ou CHOSE, ou ELEMENT, ou tout autre nom vous convenant) : de même que LOCALISATION sert d’interface pour CAMION et LOCAL, COMPOSANT peut servir d’interface pour MOTEUR, TRANSMISSION et DIFFERENTIEL (qui sont par définition des spécialisations de COMPOSANT) :




    Vous observerez qu’on a factorisé les attributs communs aux 3 types de composants : Fabriquant, Modèle, Date achat (liste non limitative), ainsi au lieu de les avoir dans chaque spécialisation, c'est-à-dire 3 fois, on ne les a qu’une seule fois, à savoir dans COMPOSANT. Par contre, chaque spécialisation conserve son propre attribut Numéro de série, en effet le numéro de série d’un moteur est un identifiant naturel pour la table MOTEUR, même chose pour les tables TRANSMISSION et DIFFERENTIEL, et l’on n’est pas prémuni contre les doublons de numéros en factorisant dans COMPOSANT. Et puis, sémantiquement parlant, peut-on comparer des numéros de série hétérogènes ? Par ailleurs, à titre d’exemple, j’ai factorisé l’attribut Modèle, mais là aussi, peut-on comparer des modèles hétérogènes ? A vous de voir si ce que j’ai fait vous convient, ou si vous préférez rapatrier cette donnée dans les tables où elle était à l’origine, c'est-à-dire dans les spécialisations.

    La nouvelle table COMPOSANT_TYPE contiendra une ligne par type de composant : moteur, transmission, différentiel, c'est-à-dire par type de composant. Elle sert essentiellement à paramétrer le nombre maximum de composants d’un type donné pouvant équiper un camion ; l’attribut ComposantQteMax sert à cela. Aujourd’hui, ComposantQteMax = 1 pour les moteurs, 1 pour les transmissions, 2 pour les différentiels, mais (sauf à diminuer...) un changement de valeur n’affecte pas la base de données. Quoi qu’il en soit, le trigger MoteurDateRecouvrement_TR (rebaptisé COMPOSANT_RECOUVREMENT_TR) est à aménager pour garantir les contrôles.

    La table COMPOSANT est en relation avec la table COMPOSANT_TYPE, donc on sait quel est le type du composant auquel on s’intéresse : moteur, transmission, différentiel. C’est une redondance, car par jointure avec les tables spécialisées, on peut retrouver cette méta-information. On devra s’assurer que si l’attribut ComposantTypeId fait référence à "moteur" (table COMPOSANT_TYPE), il y aura bien un lien entre COMPOSANT et MOTEUR et zéro lien avec TRANSMISSION ou DIFFERENTIEL (un petit trigger de contrôle s’impose ), même principe pour les deux autres spécialisations.


    Pour aborder (effleurer, sans plus !) la remarque d’escartefigue :

    Citation Envoyé par escartefigue Voir le message
    les camions ont plusieurs transmissions : des longitudinales et autant de latérales qu'il y a de demi-essieux moteurs. Par exemple pour un camion porteur double essieu arrière, il y a
    - une longi qui va de la boite de vitesse au 1er différentiel arrière
    - une longi qui va de la BV jusqu'au 2ème différentiel arrière
    - 4 latérales (2 par différentiel arrière) qui vont d'un différentiel vers chacune des roues de l'essieu
    Rien n’empêche de spécialiser à son tour TRANSMISSION, en LONGITUDINALE et LATERALE, et de se servir de ComposantQteMax pour compter plus finement, TRANSMISSION servant alors d’interface pour ces spécialisations (ce qui suppose la mise en oeuvre des éléments constitutifs des camions, mais je ne souhaite pas m’écarter du sujet qui nous préoccupe...)



    Notez que toujours grâce à la spécialisation, vous pouvez facilement mettre en oeuvre des spécialisations supplémentaires, en plus des 3 traitées jusqu’ici, à savoir MOTEUR, TRANSMISSION et DIFFERENTIEL.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  10. #30
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Il s’agit maintenant d’effectuer des tests de non-régression, vérifier que pour moteurs ça continue à tourner (si je puis dire...) Pour les transmissions et les différentiels, on verra ça plus tard, mais vous pouvez commencer à secouer la base...


    Les tables :

    CREATE TABLE LOCALISATION 
    (
            LocalisationId         INT  IDENTITY   NOT NULL
          , LocalisationNote       VARCHAR(64)     NOT NULL DEFAULT ''
        , CONSTRAINT LOCALISATION_PK PRIMARY KEY (LocalisationId)
    );
    
    CREATE TABLE CAMION 
    (
            LocalisationId        INT             NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
        , CONSTRAINT CAMION_PK PRIMARY KEY (LocalisationId)
        , CONSTRAINT CAMION_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    
    CREATE TABLE LOCAL 
    (
            LocalisationId        INT             NOT NULL
          , LocalCode             CHAR(5)         NOT NULL
          , LocalNom              VARCHAR(48)     NOT NULL
        , CONSTRAINT LOCAL_PK PRIMARY KEY (LocalisationId)
        , CONSTRAINT LOCAL_AK UNIQUE (LocalCode)
        , CONSTRAINT LOCAL_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    
    CREATE TABLE COMPOSANT_TYPE 
    (
            ComposantTypeId          INT  IDENTITY   NOT NULL
          , ComposantTypeLibelle     VARCHAR(24)     NOT NULL
          , ComposantQteMax          INT             NOT NULL
        , CONSTRAINT COMPOSANT_TYPE_PK PRIMARY KEY (ComposantTypeId)
    ) ;
    
    CREATE TABLE COMPOSANT 
    (
            ComposantId              INT  IDENTITY   NOT NULL
          , ComposantTypeId          INT             NOT NULL
          , ComposantDateAchat       DATE            NOT NULL      
          , Fabriquant               VARCHAR(48)     NOT NULL
          , Modele                   VARCHAR(48)     NOT NULL
        , CONSTRAINT COMPOSANT_PK PRIMARY KEY (ComposantId)
       , CONSTRAINT COMPOSANT_TYPE_FK FOREIGN KEY (ComposantTypeId) REFERENCES COMPOSANT_TYPE (ComposantTypeId)
    );
    
    CREATE TABLE MOTEUR 
    (
            ComposantId              INT             NOT NULL
          , MoteurNumeroSerie        VARCHAR(25)     NOT NULL
          , MaxHorsePower            INT             NOT NULL
          , CONSTRAINT MOTEUR_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT MOTEUR_AK UNIQUE (MoteurNumeroSerie)
        , CONSTRAINT MOTEUR_COMPOSANT_FK FOREIGN KEY (ComposantId) REFERENCES COMPOSANT (ComposantId)	
    );
    
    ----------------------------------------------------------
    -- Pour y voir plus clair, en rassemblant les morceaux 
    ----------------------------------------------------------
    GO
    CREATE VIEW MOTEUR_COMPOSANT_V (ComposantId, NumeroSerie, DateAchat, Fabriquant, Modele, MaxHorsePower)
    AS
    SELECT x.ComposantId, MoteurNumeroSerie, ComposantDateAchat, Fabriquant, Modele, MaxHorsePower 
    FROM   COMPOSANT AS x JOIN MOTEUR AS y ON x.ComposantId = y.ComposantId 
    ;
    GO
    
    -- =>
    
    Moteur    ComposantId    NumeroSerie    DateAchat    Fabriquant    Modele     MaxHorsePower
              1              s01            2011-01-01   Perkins       modèle 1   40
              2              s02            2011-04-01   Vendeuvre     modèle 17  20
              3              s03            2012-04-01   Renault       modèle t   30
    
    
    CREATE TABLE TRANSMISSION 
    (
            ComposantId              INT             NOT NULL
          , TransmissionNumeroSerie  VARCHAR(25)     NOT NULL
          , TransmissionVitesses     INT             NOT NULL
        , CONSTRAINT TRANSMISSION_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT TRANSMISSION_AK UNIQUE (TransmissionNumeroSerie)
        , CONSTRAINT TRANSMISSION_COMPOSANT_FK FOREIGN KEY (ComposantId) REFERENCES COMPOSANT (ComposantId)	
    );
    
    CREATE TABLE DIFFERENTIEL 
    (
            ComposantId              INT             NOT NULL
          , DifferentielNumeroSerie  VARCHAR(25)     NOT NULL
          , DifferentielRatio        INT             NOT NULL
        , CONSTRAINT DIFFERENTIEL_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT DIFFERENTIEL_AK UNIQUE (DifferentielNumeroSerie)
        , CONSTRAINT DIFFERENTIEL_COMPOSANT_FK FOREIGN KEY (ComposantId) REFERENCES COMPOSANT (ComposantId)	
    );
    
    CREATE TABLE COMPOSANT_AFFECTATION 
    (
            ComposantId                     INT             NOT NULL
          , ComposantAffectationId          INT  IDENTITY   NOT NULL
          , ComposantInstallationDate       DATE            NOT NULL
          , ComposantDesInstallationDate    DATE            NOT NULL  DEFAULT '9999-12-31'
          , LocalisationId                  INT             NOT NULL
        , CONSTRAINT COMPOSANT_AFFECTATION_PK PRIMARY KEY (ComposantId, ComposantAffectationId)
        , CONSTRAINT COMPOSANT_AFFECTATION_COMPOSANT_FK FOREIGN KEY (ComposantId) 
                     REFERENCES  COMPOSANT (ComposantId)
        , CONSTRAINT COMPOSANT_AFFECTATION_MOTEUR_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
        , CONSTRAINT COMPOSANT_AFFECTATION_CHECK01 CHECK (ComposantDesInstallationDate > ComposantInstallationDate)
    );
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  11. #31
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Les triggers :

    Le trigger permettant de s’assurer de la cohérence de l’association entre les tables COMPOSANT et COMPOSANT_TYPE d’une part et de l’association entre les tables COMPOSANT et MOTEUR, COMPOSANT et TRANSMISSION, COMPOSANT et DIFFERENTIEL d’autre part reste à programmer.

    Le trigger MoteurDateRecouvrement_TR est rebaptisé en COMPOSANT_RECOUVREMENT_TR. Concernant le nombre maximum de moteurs (de transmissions, de différentiels) pour un camion au même instant, j’ai donc fait jouer l’attribut ComposantQteMax. J’ai testé pour les moteurs : ça a l’air de fonctionner. La programmation est un peu lourde, on essaiera d’alléger.

    GO
    CREATE TRIGGER COMPOSANT_RECOUVREMENT_TR ON COMPOSANT_AFFECTATION INSTEAD OF INSERT
    AS
    BEGIN
    SELECT  ''   
     FROM    INSERTED AS x JOIN COMPOSANT_AFFECTATION AS y ON x.ComposantId = y.ComposantId 
             AND (x.ComposantInstallationDate < y.ComposantInstallationDate  AND x.ComposantDesInstallationDate >= y.ComposantInstallationDate 
              OR  x.ComposantInstallationDate >= y.ComposantInstallationDate AND x.ComposantInstallationDate <= y.ComposantDesInstallationDate)
    ;
     IF @@Rowcount > 0
          BEGIN 
             SELECT 'Affectation de composant(s) : recouvrement de période !' AS Engueulade, * FROM INSERTED
    --         RAISERROR ('Affectation de composant(s) : recouvrement de période !',16,1)  -- state = 16 pour bloquer  
             RAISERROR ('Affectation de composant(s) : recouvrement de période !',0,1)  -- state = 0 pour les tests 
             RETURN
          END
    
    -- Un camion, au plus un moteur, une transmission, 2 différentiels. Les entrepôts ne sont pas concernés 
    
    DECLARE @Engueulade AS VARCHAR(64) ;
    DECLARE @N  AS INT ;
    DECLARE @T  AS VARCHAR(16) ;
    
    DECLARE @Temp TABLE
    (
            ComposantQteMax INT 
          , ComposantNom  VARCHAR(16)
    );
    
    INSERT INTO @Temp 
    SELECT ComposantQteMax, ComposantTypeLibelle  
     FROM    INSERTED AS x JOIN COMPOSANT_AFFECTATION AS y ON x.LocalisationId = y.LocalisationId 
                           JOIN CAMION AS z ON  x.LocalisationId = z.LocalisationId
                           JOIN COMPOSANT AS t ON y.ComposantId = t.ComposantId
                           JOIN COMPOSANT_TYPE AS u ON t.ComposantTypeId = u.ComposantTypeId
             AND (x.ComposantInstallationDate < y.ComposantInstallationDate  AND x.ComposantDesInstallationDate >= y.ComposantInstallationDate 
              OR  x.ComposantInstallationDate >= y.ComposantInstallationDate AND x.ComposantInstallationDate <= y.ComposantDesInstallationDate)
    ;
    
    SET @N = (select ComposantQteMax from @Temp) ;
    SET @T = (select ComposantNom from @Temp) ;
    
    -- SELECT '@N = ', @N, '@@Rowcount = ', @@Rowcount, '@T = ', @T  ;
    
    IF @@Rowcount >= @N
          BEGIN
    	     SET @Engueulade = 'Un camion, un seul composant (' + @T + ') à la fois !' ;   
             SELECT @Engueulade AS Engueulade, * FROM INSERTED
    --         RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer 
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests
             RETURN
          END
    
    -- Tout va bien
    
     INSERT INTO COMPOSANT_AFFECTATION 
                 SELECT   ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId 
                 FROM    INSERTED
    END
    GO
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  12. #32
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Je reprends ici les inserts d’hier, concernant toujours les camions, mais adaptés au nouveau modèle. Reste à en fournir pour les transmissions et les différentiels.

    Les tentatives d’infraction son encore bloquées. A vous de tester plus à fond...



    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat) 
        SELECT MAX(LocalisationId), 'immat01', '2012-07-01' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat)
        SELECT MAX(LocalisationId), 'immat02', '2015-07-05' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO LOCAL (LocalisationId, LocalCode, LocalNom)
        SELECT MAX(LocalisationId), 'loc01', 'Entrepôt Tartempion' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat)
        SELECT MAX(LocalisationId), 'immat03', '2016-04-01' FROM LOCALISATION ;
    
    INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ;
    INSERT INTO LOCAL (LocalisationId, LocalCode, LocalNom) 
        SELECT MAX(LocalisationId), 'loc02', 'Vendu' FROM LOCALISATION ;
    
    SELECT * FROM CAMION ;
    
    SELECT * FROM LOCAL ;
    
    ---------------------------------------------
    -- Types de composants
    ---------------------------------------------
    
    INSERT INTO COMPOSANT_TYPE (ComposantTypeLibelle, ComposantQteMax) VALUES ('moteur', 1) ;        -- un seul moteur par camion
    INSERT INTO COMPOSANT_TYPE (ComposantTypeLibelle, ComposantQteMax) VALUES ('transmission', 1) ;  -- une seule transmission par camion
    INSERT INTO COMPOSANT_TYPE (ComposantTypeLibelle, ComposantQteMax) VALUES ('differentiel', 2) ;  -- 2 différentiels au plus par camion
    
    ----------------------------------------------
    -- Moteurs
    ----------------------------------------------
    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, '2011-01-01', 'Perkins', 'modèle 1'  
        FROM COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'moteur' ;
    INSERT INTO MOTEUR (ComposantId, MoteurNumeroSerie, MaxHorsePower)
        SELECT MAX(ComposantId), 's01', 40 
        FROM COMPOSANT ;
    
    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, '2011-04-01', 'Vendeuvre', 'modèle 17'  
        FROM COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'moteur' ;
    INSERT INTO MOTEUR (ComposantId, MoteurNumeroSerie, MaxHorsePower)
        SELECT MAX(ComposantId), 's02', 20 
        FROM COMPOSANT ;
    
    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, '2012-04-01', 'Renault', 'modèle t'  
        FROM COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'moteur' ;
    INSERT INTO MOTEUR (ComposantId, MoteurNumeroSerie, MaxHorsePower)
        SELECT MAX(ComposantId), 's03', 30 
        FROM COMPOSANT ;
    
    
    SELECT '' AS Moteur, * FROM MOTEUR_COMPOSANT_V ;
    
    
    ---------------------------------------------------------------------------------
    -- Affectations successives d'un moteur à des camions et à des entrepôts
    ---------------------------------------------------------------------------------
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2011-01-02', '2015-07-19'
            , (SELECT LocalisationId 
               FROM LOCAL WHERE LocalCode = 'loc01')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2015-07-20', '2016-12-08'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2016-12-09', '2017-04-01'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat02')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2017-04-02', '2017-12-06'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat03')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId)  
        SELECT ComposantId, '2017-12-07', '9999-12-31'
    --    SELECT ComposantId, '2017-04-02', '2017-12-31'
            , (SELECT LocalisationId 
               FROM LOCAL WHERE LocalCode = 'loc02')
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's01'
    ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2012-07-02', '2013-01-02'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's02'
    ;
    
    -- Insert légal (un entrepôt n'est pas un camion et peut accueillir plusieurs moteurs en même temps)
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2017-05-01', '2017-05-02'
            , (SELECT LocalisationId 
               FROM LOCAL WHERE LocalCode = 'loc02')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's02'
    ;
    
    --------------------------------------------------------
    -- Tentatives d'infraction (recouvrement des périodes)
    --------------------------------------------------------
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
    --    SELECT ComposantId, '2015-07-18', '2015-07-19'
    --    SELECT ComposantId, '2015-07-18', '9999-12-31'
    --    SELECT ComposantId, '2017-12-31', '2017-12-31'
    --    SELECT ComposantId, '2017-12-31', '2018-01-01'
        SELECT ComposantId, '2018-01-01', '2018-01-02'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat03')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    SELECT * FROM COMPOSANT_AFFECTATION ;
    
    ------------------------------------------------------------------
    -- Tentatives d'infraction (plus d'un moteur pour un camion)
    ------------------------------------------------------------------
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2015-07-18', '2015-07-20'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's02'
    ;
    SELECT * FROM COMPOSANT_AFFECTATION ;
    
    GO
    CREATE VIEW MOTEUR_LOCALISATION (Numero_moteur, Achat_moteur, Date_installation, Date_désinstallation, Type_localisation, immat_camion_ou_inventaire, entrepot_ou_date_achat_camion)
    AS
    SELECT MoteurNumeroSerie, ComposantDateAchat, ComposantInstallationDate, ComposantDesInstallationDate, 'Camion ', CamionImmat, CAST(CamionDateAchat AS VARCHAR(10))
    FROM   MOTEUR AS x JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId
                       JOIN COMPOSANT_AFFECTATION AS z ON y.ComposantId = z.ComposantId
                       JOIN CAMION AS t ON z.LocalisationId = t.LocalisationId
    UNION
    SELECT MoteurNumeroSerie, ComposantDateAchat, ComposantInstallationDate, ComposantDesInstallationDate, 'Entrepôt/vendu ', LocalCode, LocalNom
    FROM   MOTEUR AS x JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId
                       JOIN COMPOSANT_AFFECTATION AS z ON y.ComposantId = z.ComposantId
                       JOIN LOCAL AS t ON z.LocalisationId = t.LocalisationId
     ;
     GO
     SELECT * FROM MOTEUR_LOCALISATION 
     ORDER BY Numero_moteur, Date_installation ;
     -- ORDER BY immat_camion_ou_inventaire, Numero_moteur, Date_installation desc ;
    
    =>

    Numero_moteur    Achat_moteur    Date_installation    Date_désinstallation    Type_localisation    immat_camion_ou_inventaire    entrepot_ou_date_achat_camion
    s01              2011-01-01      2011-01-02           2015-07-19              Entrepôt/vendu       loc01                         Entrepôt Tartempion
    s01              2011-01-01      2015-07-20           2016-12-08              Camion               immat01                       2012-07-01
    s01              2011-01-01      2016-12-09           2017-04-01              Camion               immat02                       2015-07-05
    s01              2011-01-01      2017-04-02           2017-12-06              Camion               immat03                       2016-04-01
    s01              2011-01-01      2017-12-07           9999-12-31              Entrepôt/vendu       loc02                         Vendu
    s02              2011-04-01      2012-07-02           2013-01-02              Camion               immat01                       2012-07-01
    s02              2011-04-01      2017-05-01           2017-05-02              Entrepôt/vendu       loc02                         Vendu
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      2  0

  13. #33
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Bonjour ordigil,

    Citation Envoyé par ordigil Voir le message
    Wowww Vous avez tout fait et tout testé hehehe
    Pour les moteurs ça semble fonctionner à merveille
    Après l’effort, le réconfort...
    N’oubliez pas que pour les médailles en chocolat qui font toujours plaisir, si vous avez deux minutes, c’est ici.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      1  0

  14. #34
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Envoyé par escartefigue

    les camions ont plusieurs transmissions : des longitudinales et autant de latérales qu'il y a de demi-essieux moteurs. Par exemple pour un camion porteur double essieu arrière, il y a
    - une longi qui va de la boite de vitesse au 1er différentiel arrière
    - une longi qui va de la BV jusqu'au 2ème différentiel arrière
    - 4 latérales (2 par différentiel arrière) qui vont d'un différentiel vers chacune des roues de l'essieu


    Ça il faut oublier ça. '' Un Camion type n'a qu'une Seule et Unique Transmission. Bien sûr qu'il y a des Camions qui pourraient avoir une Transmission Auxiliaire ou même deux Transmissions Auxiliaires, mais ça on ne s'en occupe pas, ça n'arrivera jamais chez moi………… '' escartefigure devait parler '' d'Arbres de Transmission '' et non pas de ''Transmission''. Alors dans un camion, il y a 1 Moteur, 1 Transmission et 1 ou 2 Différentiels. Bien sûr qu'il y a des Camions avec 3 Différentiels mais cela ne me concerne pas non plus alors on se limite à 1 ou 2 Différentiels. Donc 1 Camion = 1 Moteur, 1 Transmission, 1 ou 2 Différentiels.


    Et en passant, c'est un cours complet que vous me donner, je suis tellement reconnaissant car cette partie de ma base de donner jai beaucoup de difficulté à visualiser le résultat final alors difficile pour moi de le développer. En fait, je développais toujours mon interface graphique pour accéder à mes bases de données au début de mes projets même si ça semble être travailler à l'envers mais au moins je pouvais visualiser en temps réel le développement. Merci beaucoup pour votre aide car â me servira beaucoup dans le futur.
      0  0

  15. #35
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Lorsque je parle de Camions, ce sont des camions comme celui-là dont je parle.


    Pièce jointe 400303
      1  0

  16. #36
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Bonjour ordigil,



    Après l’effort, le réconfort...
    N’oubliez pas que pour les médailles en chocolat qui font toujours plaisir, si vous avez deux minutes, c’est ici.
    J'espère que j'ai fait ce qu'il fallait faire sur votre profile. Y a-t-il une façon pour vous de vérifier ? Votre aide est vraiment précieuse et vous êtes un très bon professeur hehehe
      1  0

  17. #37
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Pour un beau camion, c’est un beau camion le camion tout bleu ! Il impose le respect...


    Citation Envoyé par ordigil Voir le message
    J'espère que j'ai fait ce qu'il fallait faire sur votre profile. Y a-t-il une façon pour vous de vérifier ?
    J’aurais dû recevoir de la part de DVP un message par clic sur médaille, mais silence radio... Ils ont peut-être un trigger qui n’a pas fait son boulot ? En tout cas le nombre total de médailles (159) est supérieur à celui qu’ils comptabilisent (150)... Et s'il n'y avait que ça, voyez ici ce qui arrive au pauvre Jeannot45 (le 27/07/2018)... Ah ! les triggers, on va en faire une chanson (de toutes façons, chez nous tout se termine par des chansons !)
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      1  0

  18. #38
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par ordigil Voir le message
    Envoyé par escartefigue

    les camions ont plusieurs transmissions : des longitudinales et autant de latérales qu'il y a de demi-essieux moteurs. Par exemple pour un camion porteur double essieu arrière, il y a
    - une longi qui va de la boite de vitesse au 1er différentiel arrière
    - une longi qui va de la BV jusqu'au 2ème différentiel arrière
    - 4 latérales (2 par différentiel arrière) qui vont d'un différentiel vers chacune des roues de l'essieu


    Ça il faut oublier ça. '' Un Camion type n'a qu'une Seule et Unique Transmission. Bien sûr qu'il y a des Camions qui pourraient avoir une Transmission Auxiliaire ou même deux Transmissions Auxiliaires, mais ça on ne s'en occupe pas, ça n'arrivera jamais chez moi………… '' escartefigure devait parler '' d'Arbres de Transmission '' et non pas de ''Transmission''. Alors dans un camion, il y a 1 Moteur, 1 Transmission et 1 ou 2 Différentiels. Bien sûr qu'il y a des Camions avec 3 Différentiels mais cela ne me concerne pas non plus alors on se limite à 1 ou 2 Différentiels. Donc 1 Camion = 1 Moteur, 1 Transmission, 1 ou 2 Différentiels.
    Sur l'aspect strictement Merisien, FsmRel vous a donné tous les éléments, je n'ai donc rien à ajouter
    Par contre, sur l'aspect à la fois sémantique et mécanique, il convient d'être précis, sans quoi le résultat obtenu risque de ne pas correspondre au besoin.

    La transmission se compose
    • d'une transmission primaire : c'est l'ensemble des pièces mécaniques qui transmettent le mouvement moteur au vilebrequin. Il peut s'agir d'une chaine, d'une courroie, d'une cascade de pignons
    • d'un système d'embrayage : c'est le dispositif qui permet d'accoupler / découpler le mouvement moteur avec la boite de vitesses
    • d'une boite de vitesses (+ réducteur éventuel) : qui permet de modifier le régime de rotation des roues pour un même régime moteur afin de choisir le couple le plus adapté aux conditions de roulage
    • d'une transmission secondaire : c'est l'ensemble des pièces mécaniques qui transmettent le mouvement de la boite de vitesse aux roues. Il peut s'agir de transmissions à joints homocinétiques (automobiles) de transmissions à joints de cardans et renvoi d'angle (véhicules industriels : camions, grues, tractopelles, quelques modèles de motos), de transmissions par chaine ou par courroie (motos).
      Les différentiels font partie intégrante de la transmission secondaire.

    A ma connaissance, la transmission primaire est unique et invariante pour un type de moteur (quelque soit le véhicule dans lequel ce moteur est implanté) : tous les moteurs d'un même type auront la même transmission primaire. Inutile donc de modéliser une entité type spécifique, un simple attribut dans l'ET moteur suffit.
    Pour les autres organes, êtes vous certains qu'un même type de véhicule (au sens où vous référencerez les types dans votre BDD), utilise toujours la même combinaison embrayage+BV ? sinon, il faut gérer séparément embrayage et BV (à la place de "transmission")
    Exemples :
    - deux véhicules d'un même type peuvent ils avoir l'un une boite courte l'autre une boite longue
    - deux véhicules d'un même type peuvent ils avoir l'un un embrayage standard, l'autre un embrayage renforcé

    Compte tenu de ce qui précède, l'utilisation du terme "transmission" me semble inadéquat dans votre MCD

    Note : pour citer les propos d'un autre contributeur, vous pouvez utiliser le bouton "répondre avec citation" puis enlever la partie du texte cité qui ne vous intéresse pas
      1  0

  19. #39
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Lorsque l'on parle de transmissions, on parle de ce que l'on voit sur les deux photo incluses et uniquement de ce que l'on voit sur ces deux photos. Alors fsmrel a très bien compris ce que je voulais et il a très bien fait cette partie de ma base de données. Par contre je vais encore avoir besoin de quelques conseils car cette partie de la base de données est beaucoup plus complexe que j'avais imaginé à l'origine. Est-ce que je peux garder ce fils de discussion ouvert pour quelque temps puisque j'aurai encore besoin d'aide pour relier d'autres tables à cette partie de ma base de données ?

    Pièce jointe 401155Pièce jointe 401156
      0  0

  20. #40
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 907
    Points
    30 907
    Billets dans le blog
    16
    Par défaut
    Bonsoir ordigil,

    Personne ne fermera cette discussion, donc on reste à l'écoute, autrement dit, personne ne viendra nous brouiller l'écoute...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.
      1  0

Discussions similaires

  1. Ajout dans une table et relation avec d'autres
    Par climz dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 15h32
  2. Création table et relations
    Par ptitdragon_eric dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/09/2005, 13h37
  3. table de relation
    Par tanjonaravelson dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/06/2005, 18h20
  4. Table de relation et sélection via jointure
    Par 73672 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 09/11/2004, 09h33
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo