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. #61
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    D’accord pour la signification des attributs de la table FUEL_CONSUMPTION.

    A propos des colonnes calculées de la table FUEL_CONSUMPTION : pas de problème.


    Citation Envoyé par fsmrel Voir le message
    Je suppose que pour un camion on a au moins et au plus une ligne FUEL_CONSUMPTION et réciproquement (c’est-à-dire une bijection). C’est bien ça ? Même question concernant MAINTENANCE, REPAIR, TRUCK_EQUIPMENT.
    Je réitère ma question, car de votre réponse dépend la suite de la modélisation !


    Citation Envoyé par ordigil Voir le message
    comment je fais pour que la mise en page soit préservée lorsque je poste sur le forum ?
    S’il s’agit de remplacer la balise CODE, alors la balise PRE convient (en tout cas, c’est celle que j’utilise). Pour une indentation maîtrisée, remplacer les tabulations par des points.


    Citation Envoyé par ordigil Voir le message
    Petite question, quelles sont les tables que je cacherai à l'utilisateur final dans l'interface web ?
    Ça va être un peu difficile à gérer pour la personne qui n'y connait rien en informatique.
    Scénario #1 : L'utilisateur achète un nouveau camion qui a déjà 1 Moteur, 1 Transmission et 2 Différentiels
    Quelles sont toutes les étapes par ordres numériques pour l'ajouter à la base de données ?
    Je ne suis pas sûr d’avoir compris votre question... Quoi qu’il en soit, en passant par l’interface WEB, je constate que l’utilisateur accède directement aux tables, alors que la règle générale est de passer par des formulaires, quand même plus conviviaux...

    Si on a de façon invariante un seul moteur, une seule transmission et au plus deux différentiels, la table COMPOSANT_TYPE n’a pas à être construite, elle doit préexister. L’utilisateur n’a rien à saisir.

    Pour la déclarer (j’ai ajouté la contrainte COMPOSANT_TYPE_AK que j’avais oubliée) :

    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)
        , CONSTRAINT COMPOSANT_TYPE_AK UNIQUE (ComposantTypeLibelle) 
    ) ;
    
    Je rappelle que les instructions pour créer les 3 lignes de cette table sont les suivantes (cf. post #32) :

    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 ('différentiel', 2) ;  -- 2 différentiels au plus par camion
    
    Si vous utilisiez un formulaire, l’utilisateur pourrait visualiser les types de composants au moyen d’une combo (ergonomie...)

    Je rappelle que, d’une manière générale, l’utilisateur n’a pas à voir les clés primaires, donc s’il veut visualiser, c’est au moyen des clés naturelles (ComposantTypeLibelle en l’occurrence).
    (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.
      3  0

  2. #62
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Pour en venir à l’achat d’un camion, avec sa transmission et ses deux différentiels :

    Il faut évidemment commencer par créer le camion. On sait que CAMION est une spécialisation de LOCALISATION, on doit donc d’abord créer une ligne dans la table LOCALISATION (cf. le post #25) :

     INSERT INTO LOCALISATION (LocalisationNote) VALUES ('') ; 
    Dans un 2e temps, on crée une ligne dans la table CAMION :

    INSERT INTO CAMION (LocalisationId, CamionImmat, CamionDateAchat) 
        SELECT MAX(LocalisationId), 'immat01', '2012-07-01' FROM LOCALISATION ;
    
    Dans un 3e temps, si besoin, ajouter une ligne dans la table FUEL_CONSUMPTION :

    INSERT INTO FUEL_CONSUMPTION (CamionId, LitersFuel, MileAgeKm)
        SELECT  CamionId, 10, 20
        FROM    CAMION WHERE CamionImmat = 'immat01'
    

    Dans un 4e temps, on crée une ligne dans la table COMPOSANT pour le moteur puisqu’un moteur est un composant (à ce stade, la table COMPOSANT_TYPE est censée exister et être constituée) :

    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, ''2012-07-01', 'Perkins', 'modèle 1'  
        FROM   COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'moteur' ;
    
    Si on veut avoir comme date d’achat du moteur la date d’achat du camion, l’INSERT précédent peut être remplacé par celui-ci :

    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
          SELECT ComposantTypeId, (SELECT CamionDateAchat FROM CAMION WHERE CamionImmat = 'immat01'), 'Perkins', 'modèle 1'  
          FROM   COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'moteur' ;
    
    Dans un 5e temps, on crée une ligne dans la table MOTEUR :

    INSERT INTO MOTEUR (ComposantId, MoteurNumeroSerie, MaxHorsePower)
        SELECT MAX(ComposantId), 's01', 40 
        FROM   COMPOSANT ;
    
    Dans un 6e temps, on affecte le moteur au camion :

    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, ''2012-07-01', '9999-12-31'
            , (SELECT CamionId 
               FROM   CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    Toutes ces opérations sont reprises du post #25.

    Si on veut avoir comme date d’installation du moteur la date d’achat du camion, l’INSERT précédent peut être remplacé par celui-ci :

    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
          SELECT ComposantId, (SELECT CamionDateAchat FROM CAMION WHERE CamionImmat = 'immat01'), '9999-12-31' 
            , (SELECT CamionId 
               FROM   CAMION WHERE CamionImmat = 'immat01')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 's01'
    ;
    
    Pour la transmission, on procède comme pour le moteur :

    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, ''2012-07-01', 'Leclerc', 'modèle 17'  
        FROM   COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'transmission' ;
    
    INSERT INTO TRANSMISSION (ComposantId, TransmissionNumeroSerie, TransmissionVitesses)
        SELECT MAX(ComposantId), 'tr017', 3 
        FROM   COMPOSANT ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2012-07-01', '9999-12-31'
            , (SELECT CamionId 
               FROM   CAMION WHERE CamionImmat = 'immat01')
        FROM   TRANSMISSION
        WHERE  TransmissionNumeroSerie = 'tr017'
    ;
    
    Avec à chaque fois la possibilité de remplacer la date d’installation « en dur » par la date d’achat du camion, comme dans les exemples qui précèdent.

    Pour le 1er différentiel :

    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, (SELECT CamionDateAchat FROM CAMION WHERE CamionImmat = 'immat01'),  'Naudin', 'diff. extra' 
        FROM   COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'différentiel' ;
    
    INSERT INTO DIFFERENTIEL (ComposantId, DifferentielNumeroSerie, DifferentielRatio)
        SELECT MAX(ComposantId), 'dif043', 1 
        FROM   COMPOSANT ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, (SELECT CamionDateAchat FROM CAMION WHERE CamionImmat = 'immat01'), '9999-12-31'
              , (SELECT CamionId 
                 FROM CAMION WHERE CamionImmat = 'immat01')
        FROM   DIFFERENTIEL
        WHERE  DifferentielNumeroSerie = 'dif043'
    ;
    
    2e différentiel

    INSERT INTO COMPOSANT (ComposantTypeId, ComposantDateAchat, Fabriquant, Modele)
        SELECT ComposantTypeId, (SELECT CamionDateAchat FROM CAMION WHERE CamionImmat = 'immat01'),  'Volfoni', 'diff. super' 
        FROM   COMPOSANT_TYPE WHERE ComposantTypeLibelle = 'différentiel' ;
    
    INSERT INTO DIFFERENTIEL (ComposantId, DifferentielNumeroSerie, DifferentielRatio)
        SELECT MAX(ComposantId), 'dif044', 2 
        FROM   COMPOSANT ;
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, (SELECT CamionDateAchat FROM CAMION WHERE CamionImmat = 'immat01'), '9999-12-31'
               , (SELECT CamionId 
                  FROM   CAMION WHERE CamionImmat = 'immat01')
        FROM   DIFFERENTIEL
        WHERE  DifferentielNumeroSerie = 'dif044'
    ;
    
    (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.
      3  0

  3. #63
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    J’ai modifié le trigger ainsi :

    
    CREATE TRIGGER COMPOSANT_RECOUVREMENT_TR ON COMPOSANT_AFFECTATION INSTEAD OF INSERT
    AS
    BEGIN
    
    SELECT '=============== nouvelle entrée ======================' ; 
     
    DECLARE @Engueulade AS VARCHAR(64) ;
    DECLARE @MaxAutorises  AS INT ;
    DECLARE @Type  AS VARCHAR(16) ;
    DECLARE @NbDoublons AS INT ;
    declare @nbTuples  as int ;
    DECLARE @inserted TABLE
    (
            CamionId                        INT
          , CamionImmat                     VARCHAR(48) 
          , ComposantId                     INT
          , ComposantTypeId                 INT
          , ComposantTypeLibelle            VARCHAR(48)
          , ComposantQteMax                 INT	   
          , ComposantInstallationDate       DATE
          , ComposantDesInstallationDate    DATE
    );
    
    SELECT '' as INSERTED,  * FROM INSERTED ;
    
    INSERT INTO @inserted (CamionId, CamionImmat, ComposantId, ComposantTypeId, ComposantTypeLibelle, ComposantQteMax, ComposantInstallationDate, ComposantDesInstallationDate)   
        SELECT x.LocalisationId, t.CamionImmat, x.ComposantId, y.ComposantTypeId, z.ComposantTypeLibelle, z.ComposantQteMax, x.ComposantInstallationDate, x.ComposantDesInstallationDate     
        FROM   INSERTED AS x JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId
                             JOIN COMPOSANT_TYPE AS z ON y.ComposantTypeId = z.ComposantTypeId
                             JOIN CAMION AS t ON x.LocalisationId = t.CamionId
    ;
    SELECT '' as inserted, * from @inserted ;
    
    -------------------------------------------------------------------------------------------------
    -- 1ere partie : 
    --
    -- contrôle de la bilocation. Un composant (moteur, transmission, différentiel)
    -- ne peut pas être au même instant sur deux camions à la fois, sauf le jour où on désinstalle 
    -- le composant pour l'installer sur un autre camion.
    ----------------------------------------------------------------------------------------------------
    
    SELECT  'Vérifier si le composant ComposantId = ', x.ComposantId,  ' provoque un recouvrement de période'   
     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)
             AND NOT EXISTS (SELECT * FROM LOCAL as w where y.LocalisationId = w.LocalisationId)
    ;
     
    SET @nbTuples = @@Rowcount ;
    
    SELECT '' AS nbtuples, @nbTuples ;
    
    IF @nbTuples > 0 
          BEGIN 
             SELECT 'Affectation de composant(s) : recouvrement de période !' AS Engueulons, * 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
    
    ---------------------------------------------------------------------------------------------------------------------
    -- 2e partie
    --
    -- Un camion a au plus un moteur, une transmissions,2 différentiels. Les entrepôts ne sont pas concernés
    ----------------------------------------------------------------------------------------------------------------------
    
    SET @MaxAutorises = (select ComposantQteMax from @inserted) ;
    
    SET @Type = (SELECT ComposantTypeLibelle from @inserted) ;
    
    SELECT  '' AS Recherche_doublons, y.LocalisationId, z.ComposantTypeId     
    FROM    @inserted AS x JOIN COMPOSANT_AFFECTATION AS y ON x.CamionId = y.LocalisationId
                            JOIN COMPOSANT AS z ON y.ComposantId = z.ComposantId AND x.ComposantTypeId = z.ComposantTypeId
    WHERE (x.ComposantInstallationDate < y.ComposantInstallationDate  AND x.ComposantDesInstallationDate >= y.ComposantInstallationDate
           OR  x.ComposantInstallationDate >= y.ComposantInstallationDate AND x.ComposantInstallationDate < y.ComposantDesInstallationDate)
    ;
    
    SET @NbDoublons = @@Rowcount ;
    
    SELECT '@MaxAutorises = ', @MaxAutorises, '@NbDoublons = ', @NbDoublons, '@Type = ' + @Type  ;
     
    if @NbDoublons > 0 AND @NbDoublons >= @MaxAutorises
          BEGIN
             SET @Engueulade = 'Un camion, ' + cast(@MaxAutorises as varchar(2))  + ' composant(s) (' + @Type + ') au maximum !' ;     
             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

  4. #64
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    J’ai jeté un coup d’œil aux écrans.

    Toutes les clés artificielles, CamionId, etc. doivent disparaître des écrans.

    La table LOCALISATION pourra disparaître des écrans elle aussi, je vous concocterai une vue qui pourra être mise à jour et ventilera les données dans CAMION et LOCALISATION, même chose pour LOCAL et LOCALISATION.


    En ce qui concerne l’écran CAMION, pourquoi imposer la saisie de la date de vente ? Si l’utilisateur ne saisit rien, on valorise avec 9999-12-31.

    LOCALISATON : si l’utilisateur ne saisit rien pour LocalisationNote, on valorise par avec ''

    Ecran COMPOSANT_AFFECTATION : si l’utilisateur ne saisit rien, pour la date de désinstallation, on valorise avec 9999-12-31.
    Je vous goupillerai une vue COMPOSANT_MOTEUR, une vue COMPOSANT_TRANSMISSION et une vue COMPOSANT_DIFFERENTIEL, tout ça remplaçant COMPOSANT, MOTEUR, TRANSMISSION, DIFFERENTIEL.

    Vous m’en faites faire du boulot...
    (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.
      3  0

  5. #65
    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 fsmrel, vraiment un gros merci pour l'aide et l'enseignement
    "D’accord pour la signification des attributs de la table FUEL_CONSUMPTION."
    "A propos des colonnes calculées de la table FUEL_CONSUMPTION : pas de problème."

    Ah, j'ai fait quelque chose de bien ???



    Bijection :

    Pièce jointe 413278
    Donc Pièce jointe 413281



    À vrai dire, je préfère les miles au gallons que les bijections

    Sérieux maintenant. La consommation de carburant n'est pas une constante, elle varie à tous les mois, toutes les semaines, tous les jours, tous les heures, toutes les minutes,
    toutes les secondes, tous les millième de secondes…. et plusieurs facteurs sont en cause... Règle générale à chaque 2 semaines ou à chaque fin de mois, pour chaque Camion, l'usager entrera le nombre de litres de gasoil consommé et la distance parcourue dans la table Fuel_Consumption. Mes deux formules dans les colonnes calculées enregistreront dans la table Fuel_Consumption le nombre de litre/100Km et le nombre de miles/gallons impérial. Alors au 2 semaines ou à la fin de chaque mois, la consommation de gasoil sera différente pour chacun des camions ou il pourrait arrivé qu'elle soit identique, qui sait… Mais j'opterais plus qu'elle soit similaire mais non identique. Cette table est très importante pour : évaluer la conduite d'un chauffeur, calculer le profit, avoir l'état général du véhicule, prévenir d'un éventuel problème d'un camion avant qu'il ne tombe en panne sur la route, etc... Je ne sait pas si ça répond à votre question…

    "Même question concernant MAINTENANCE, REPAIR, TRUCK_EQUIPMENT."

    "MAINTENANCE"
    Tous les Camions auront nécessairement des maintenances. Graissage au 2 semaines en moyenne et un changement d'huile au 40 000 Kilomètres. Mais ça peut arriver dépendamment de la disponibilité qu'un camion ait un graissage à toutes les semaines et que le même camion le mois suivant reçoive son graissage après 3 semaines. Il peut arriver qu'un camion est un changement d'huile à 37 000 Km et un autre changement d'huile à 42 000 Km et un autre changement d'huile à 38750 Km. Donc la maintenance va toujours varier dans le temps et dans le Kilométrage pour chacun des camions et aussi dans le type de maintenance. On peut inclure dans la maintenance un changement de filtre à air si après vérification il est sale, ça ne sera jamais à la même période ni au même Kilométrage. Donc tous les camions auront des maintenances mais les dates, le kilométrage et le type de maintenance seront généralement toujours différents.

    "REPAIRS"
    On répare ce qui est endommagé, donc un roulement à bille, un joint d'étanchéité qui fuit, un pare-brise endommagé, une crevaison, un joint universel abimé, une crevaison, etc, toujours différents pour chacun des camions et toujours à des dates et à des Kilométrages différents.

    Maintenance = Prévention
    Réparation = Comme le nom l'indique, on répare ce qui est brisé ou trop usé.


    "Truck_Equipment"
    Certains moteurs ont 2 filtreurs à gasoil d'autres seulement 1. Certain camions ont 2 filtreurs pour l'habitacle, d'autres seulement 1. etc. Si on parle de 1 camion en particulier, il aura toujours le même nombre de filtreurs et toujours les mêmes numéros de filtreurs. Le but de cette table est d'entrer pour chaque camion les numéros de pièces qui le concerne pour référence dans le futur et ne changeront pour ainsi dire jamais, à moins qu'on change de marque de différentiels, ou de moteur, ou etc. Donc je vais chez le concessionnaire chercher les filtreurs à gasoil et les filtreurs à l'huile pour un camion en particulier, je regarde la table Truck_Equipment en lien avec ce camion pour donner au concessionnaires les bons numéros de filtreurs à gasoil et à l'huile, etc que j'ai besoin pour ce camion. Et ainsi de suite. Alors certains camions auront les mêmes filtreurs, d'autres différents. Mais en principe ce sera toujours les mêmes pour un camion donné. Il peut arriver que 2 ou 3 ou 4 camions aient tous les mêmes filtreurs à l'huile mais des filtreurs à gasoil différents et des filtreurs à air différents. Deux camions identiques et de la même année de fabrication peuvent avoir des moteurs de marques différentes alors les filtreurs à l'huile et filtreurs à gasoil seront différents. J'ai 2 camions de la même année, même modèle, mais un camion a un moteur Detroit et l'autre a un moteur Cummins. À l'exception des moteurs ils sont identiques. Deux jumeaux.

    Désolé si mes réponses sont longues, je ne suis pas un expert pour les explications abrégées. J'espère que mes explications sont toutefois claires et que vous comprenez.
      0  0

  6. #66
    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
    S’il s’agit de remplacer la balise CODE, alors la balise PRE convient (en tout cas, c’est celle que j’utilise). Pour une indentation maîtrisée, remplacer les tabulations par des points.

    Pour cette question, un administrateur m'a répondu en privée.
    J'adore ce site.


    Lorsque cette base de données sera terminée et fonctionnelle, j'essayerai de m'impliquer pour la francisation des documents et des cours rédigés en langue anglaise afin que tous puisse apprécier ce site.

    Je n'utilise jamais de tabulation dans mes codes, j'ai réassigné ma touche Tab à 4 espaces ce qui est un standard je pense.

    Merci pour la balise PRE que j'ignorais aussi.
      0  0

  7. #67
    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
    "Je ne suis pas sûr d’avoir compris votre question... Quoi qu’il en soit, en passant par l’interface WEB, je constate que l’utilisateur accède directement aux tables"

    Oui il en est ainsi pour l'instant puisque je suis le codeur et l'utilisateur afin de développer le code PHP que je récupérerai pour les formulaires de l'interface WEB finale. Pour l'instant je garde tous car c'est plus facile pour moi de me retrouver avec vos codes d'insertion.

    "Toutes les clés artificielles, CamionId, etc. doivent disparaître des écrans."

    Oui, vous me dictez et j'exécute pour la version finale que je vous présenterai. Tous ça va disparaître d'un clic de souris


    "En ce qui concerne l’écran CAMION, pourquoi imposer la saisie de la date de vente ? Si l’utilisateur ne saisit rien, on valorise avec 9999-12-31."

    Elle ne sera pas imposée, puisque justement on valorise avec 9999--12-31. Elle ne s'affichera que dans le formulaire "Vente" J'avais fait une petite erreur dans le code de cette page et je ne trouvais pas mon erreur alors j'ai simplement "recharger" une copie de sauvegarde fonctionnelle de cette page sur le serveur WEB.

    Toute page codée en PHP peut être appeler et affichée dans une autre page développée en PHP ou en HTML ou en n'importe quoi. Ou toute partie de code PHP d'une page peut être sauvegarder en fichier PHP et appeler dans une autre page quelle soit en HTML ou en PHP. Ou on peut faire un copié d'une partie de code PHP d'une page codée en PHP et l'insérer dans une autre page développée en HTML ou en PHP… Le code PHP peut cohabité avec le code HTML et java script sur une même page. C'est amusant. Ce que l'on développe en PHP, peut être réutilisé pour Windows, Linux, etc. On a seulement besoin d'appeler un fichier PHP à l'intérieur de notre code et BINGO, ça fonctionne.


    "Je vous goupillerai une vue COMPOSANT_MOTEUR, une vue COMPOSANT_TRANSMISSION et une vue COMPOSANT_DIFFERENTIEL, tout ça remplaçant COMPOSANT, MOTEUR, TRANSMISSION, DIFFERENTIEL."

    Vous êtes un père pour moi vous savez


    "Vous m’en faites faire du boulot... "

    Oh là là, j'essaie de vous tenir occupé pour ne pas que vous tombiez dans le vice et pour ne pas que vous rouilliez. C'est comme une thérapie à distance.



    Merci sincèrement mon ami pour l'aide que vous m'apportez si généreusement, vous ne pouvez imaginez toute la gratitude que j'ai à votre égards.

    J'avais imaginez un modèle de base de données complètement différent du votre et je conçois toujours tout dans ma tête. Normalement ce qui fonctionne dans ma tête fonctionne aussi dans la réalité, que cette réalité soit virtuelle ou réelle. Je fais du reverse engineering en mécanique et en électronique depuis que j'ai environ 10-12 ans. Encore aujourd'hui alors que la totalité des techniciens en mécanique utilisent un laptop branché à l'ordinateur d'un véhicule pour le troubleshooting et après avoir changé et facturé au client la quasi totalité des senseurs équipant un moteur pour découvrir à la fin qu'un fil était cassé, moi je m'assoie avec un café, et j'imagine comment les ingénieurs qui ont conçu le moteur voulaient que le moteur fonctionne et pourquoi il ne fonctionne pas comme les ingénieurs l'ont créé. Un moteur à combustion interne, qu'il date de 1925 ou de 2018, il fonctionne tous les deux encore de la même manière, il n'y a pas de secret, il n'y a que les matériaux qui ont changés et une partie de la mécanique à été remplacée par de l'électronique, mais un injecteur, disons pour ne nommer que ce composant, qu'il soit entièrement mécanique ou qu'il ait une partie mécanique et une partie électrique contrôlée par un ordinateur, le principe de fonctionnement est encore le même et sera toujours le même. Donc pour revenir à la base de données, votre modèle est tellement différent de ce que j'avais imaginé à l'origine, que je dois comprendre votre raisonnement pour en comprendre le fonctionnement. Il faut dire que je n'ai aucune expertise dans les bases de donnée. J'ai toujours développé mes bases de donnée en commençant pas la fin. hehehe C'est à dire que je récoltais toutes données que j'avais besoin et je dessinais un interface à l'aide de Paint, de Gimp, ou avec un crayon sur une feuille de papier et j'imaginais entrer des données réelles dans ce dessin et je visionnais tous le fonctionnement dans ma tête et je créais les tables et les relations de la façon que j'imaginais et ça donnais le même résultats que ce qui était écrit dans les livres sur les bases de données. Mais le fonctionnement et la logique que vous développez dans cette base de données, je ne les visualise pas dans ma tête alors il y a 50% que je ne comprend pas. Pour comprendre je dois comprendre le résultat final. Et merci mille fois de tout commenter ce que vous faites car je pourrai relire à volonté. Le problème lorsqu'on est fanatique du reverse engineering, c'est que l'on part toujours d'un produit terminé et fonctionnel et on termine par le schéma de principe de fonctionnement exactement l'inverse de celui qui a créé le produit… Je suis désolé que vous mettiez autant de votre temps dans ce projet, mais en même temps puisque vous couvrez beaucoup de matière, si des gens qui débutent dans la conception de base de données se donnent la peine de venir sur notre forum, ils auront vraiment une bonne base pour comprendre le principe des bases de données. Encore merci fsmrel.

    En passant j'ai tout traduit en anglais vos scripts et noms des tables et des colonnes dans "Trucks_Management. je ne sais pas si vous avez pleinement accès ou même si ça fonctionne car je dois aussi faire les scripts des Inserts en anglais hahaha. J'espère que je n'ai pas fait d'erreurs. Je n'ai pas eu le temps de vérifier. Et maintenant je vais devoir traduire et apporter vos dernières modifications.

    "Vous m’en faites faire du boulot... "
      0  0

  8. #68
    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, en fait dans la version anglaise de la base de donnée, 'TruckVIN' remplace 'CamionImmat' tel que discuté, j'ai apporter la correction en faisant la traduction. 'CamionImmat' se nomme maintenant 'TruckPlate'
      0  0

  9. #69
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Ave,

    Quelques observations.


    Citation Envoyé par ordigil Voir le message

    Certes, mais je répète, qu’en est-il de MAINTENANCE, REPAIR, TRUCK_EQUIPMENT par rapport à CAMION ?


    Table CAMION :

    J’ai intégré CamionVIN.

    A quoi correspond CamionNumber ? Est-ce une clé alternative ? (je fais comme si)
    A quoi correspond DateMfg ?

    On ne supprime pas physiquement un camion de la base de données : la suppression est implicite dès que la date de vente est renseignée (différente du 9999-12-31). L’utilisateur peut alors consulter, mais c’est tout. Comme l’utilisateur n’aura accès qu’à la vue (CAMION_LOCALISATION_V), j’ai prévu un trigger empêchant la suppression par cette vue. Sous le capot, vous avez quand même la possibilité de le faire, ne serait-ce que pour vos propres tests. On peut aussi prévoir l’utilisation d’une instruction GRANT (je connais bien avec DB2, mais pas avec SQL Server...)

    Concernant les updates par vue : l’utilisateur peut modifier ce qu’il veut, sauf CamionId (ce qui est normal ), et le VIN, puisque celui-ci est réputé invariant. Si vous estimez que l’utilisateur doit pouvoir modifier le VIN, suite par exemple à une erreur de saisie, je modifierai le trigger pour rendre la modification possible. Votre avis ?
    Dans l’état actuel, on ne peut modifier (par UPDATE de la vue) qu’un camion à la fois, sinon il faudra que je trouve le temps de gérer un curseur dans le trigger. Si la contrainte imposée (un camion à la fois) convient, on reste comme ça...



    Table LOCAL :

    J’ai adopté la même stratégie que pour la table CAMION.

    Je prévois de mettre en œuvre les vues nécessaires, y-compris pour des tables comme FUEL_CONSUMPTION, afin de rendre invisibles tous les attributs participant aux clés primaires (l’attribut HuileDateChangement faisant exception car ici l’utilisateur est partie prenante pour la date).

    Essayez de secouer les vues CAMION_LOCALISATION_V et LOCAL_LOCALISATION_V en les mettant à jour.

    Lundi j’attaquerai les vues COMPOSANT_TRANSMISSION, COMPOSANT_DIFFERENTIEL. Ça prend du temps car on doit pouvoir les mettre à jour...
    (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. #70
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    J’ai complété la structure de la table CAMION :


     
    -----------------------------------------------------------
    -- Les camions
    -----------------------------------------------------------
    
    CREATE TABLE CAMION 
    (
            CamionId              INT             NOT NULL
          , CamionVIN             VARCHAR(24)     NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
          , CamionDateVente       DATE            NOT NULL DEFAULT '9999-12-31'
          , CamionDateMfg         DATE            NOT NULL DEFAULT '9999-12-31'
          , CamionManufacturer    VARCHAR(32)     NOT NULL
          , CamionModel           VARCHAR(32)     NOT NULL
          , CamionNumber          INT             NOT NULL
          , CamionColor           VARCHAR(16)     NOT NULL DEFAULT ''
        , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
        , CONSTRAINT CAMION_VIN_AK UNIQUE (CamionVIN)
        , CONSTRAINT CAMION_Immat_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_Number_AK UNIQUE (CamionNumber)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (CamionId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    

    La vue CAMION_LOCALISATION_V pour consulter et mettre à jour CAMION et LOCALISATION (dans sa relation avec CAMION) :

    CREATE VIEW CAMION_LOCALISATION_V (VIN, Immat, DateAchat, DateSold, DateMfg, Manufacturer, Model, Number, Color, Note)
    AS
    SELECT CamionVIN, CamionImmat, CamionDateAchat, CamionDateVente, CamionDateMfg, CamionManufacturer, CamionModel, CamionNumber, CamionColor, LocalisationNote
    FROM   CAMION AS x JOIN LOCALISATION AS y ON x.CamionId = y.LocalisationId  
    ;
    

    Triggers pour contrôler les mises à jour de la vue CAMION_LOCALISATION_V :

    -----------------------------------------------------
    -- Camions, trigger pour INSERT
    -----------------------------------------------------
    CREATE TRIGGER CAMION_LOCALISATION_INSERT_TR ON CAMION_LOCALISATION_V INSTEAD OF INSERT
    AS
    INSERT INTO LOCALISATION (LocalisationNote)
        SELECT COALESCE(Note, '') FROM INSERTED ;
    
    INSERT INTO CAMION (CamionId, CamionVIN, CamionImmat, CamionDateAchat, CamionDateVente, CamionDateMfg, CamionManufacturer, CamionModel, CamionNumber, CamionColor)
        SELECT (SELECT MAX(LocalisationId) FROM LOCALISATION) 
               , VIN, Immat, DateAchat, COALESCE(DateSold, cast('9999-12-31' as date)), COALESCE(DateMfg, cast('9999-12-31' as date)), Manufacturer, Model, Number, COALESCE(Color, '')
        FROM   INSERTED ; 
    
    -----------------------------------------------------
    -- Camions, trigger pour UPDATE
    -----------------------------------------------------
    GO
    CREATE TRIGGER CAMION_LOCALISATION_UPDATE_TR ON CAMION_LOCALISATION_V INSTEAD OF UPDATE
    AS
    
    DECLARE @CamionVIN as varchar(24) ;
    DECLARE @LocalisationId AS INT ;
    
    select '' as LOCALISATION_CAMION_UPDATE_TR, * from INSERTED 
    
    set @CamionVIN = (select VIN from INSERTED) ;
    set @LocalisationId = (select CamionId from camion where CamionVIN = @CamionVIN) ;
    
    IF UPDATE(Immat) OR UPDATE(DateAchat) OR UPDATE(DateSold) OR UPDATE(DateMfg)
       OR UPDATE(Manufacturer) OR UPDATE(Model) OR UPDATE(Number) OR UPDATE(Color)
        UPDATE CAMION
    --        SET CamionImmat = (SELECT Immat FROM INSERTED)
     --         , CamionDateAchat = (SELECT DateAchat FROM INSERTED)
            SET 
               CamionDateAchat = (SELECT DateAchat FROM INSERTED)
              , CamionDateVente = (SELECT DateSold FROM INSERTED)
              , CamionDateMfg = (SELECT DateMfg FROM INSERTED)
              , CamionManufacturer = (SELECT Manufacturer FROM INSERTED)
              , CamionModel = (SELECT Model FROM INSERTED)
              , CamionNumber = (SELECT Number FROM INSERTED)
              , CamionColor = (SELECT Color FROM INSERTED)
    
        WHERE EXISTS (SELECT *
                      FROM   INSERTED 
                      WHERE  VIN = CAMION.CamionVIN) 		;
    
    IF UPDATE(Note)
        UPDATE LOCALISATION
            SET LocalisationNote = (SELECT Note FROM INSERTED)
        WHERE LocalisationId = @LocalisationId   
    ;
    
    -------------------------------------------------------------------------------------------------
    -- Camions, trigger pour suppression : on interdit la suppression, on ne fait donc rien
    -------------------------------------------------------------------------------------------------
    GO
    CREATE TRIGGER CAMION_LOCALISATION_DELETE_TR ON CAMION_LOCALISATION_V INSTEAD OF DELETE
    AS
    DECLARE @suppr AS CHAR(1) ;
    GO
    

    Vue LOCAL_LOCALISATION_V pour consulter et mettre à jour la table LOCAL et la table LOCALISATION (dans sa relation avec LOCAL) :

    CREATE VIEW LOCAL_LOCALISATION_V (LocalCode, LocalNom, Note)
    AS
    SELECT LocalCode, LocalNom, LocalisationNote
    FROM   LOCAL AS x JOIN LOCALISATION AS y ON x.LocalisationId = y.LocalisationId  
    ;
    GO
    

    Triggers pour contrôler les mises à jour de la vue LOCAL_LOCALISATION_V :

    CREATE TRIGGER LOCAL_LOCALISATION_INSERT_TR ON LOCAL_LOCALISATION_V INSTEAD OF INSERT
    AS
    INSERT INTO LOCALISATION (LocalisationNote)
        SELECT COALESCE(Note, '') FROM INSERTED ;
    
    INSERT INTO LOCAL (LocalisationId, LocalCode, LocalNom)
        SELECT (SELECT MAX(LocalisationId) FROM LOCALISATION) 
               , LocalCode, LocalNom
        FROM   INSERTED ; 
    GO
    
    -----------------------------------------------------
    -- Locaux, trigger pour UPDATE
    -----------------------------------------------------
    GO
    CREATE TRIGGER LOCAL_LOCALISATION_UPDATE_TR ON LOCAL_LOCALISATION_V INSTEAD OF UPDATE
    AS
    
    DECLARE @LocalCode as varchar(24) ;
    DECLARE @LocalisationId AS INT ;
    
    SELECT '' as LOCAL_UPDATE_INSERTED, * FROM INSERTED
    
    set @LocalCode = (select LocalCode from INSERTED) ;
    set @LocalisationId = (select LocalisationId from LOCAL where LocalCode = @LocalCode) ;
    
    IF UPDATE(LocalNom)
        UPDATE LOCAL
            SET LocalNom = (SELECT LocalNom FROM INSERTED)
        WHERE EXISTS (SELECT *
                      FROM   INSERTED 
                      WHERE  LocalCode = LOCAL.LocalCode) 		;
    IF UPDATE(Note)
        UPDATE LOCALISATION
            SET LocalisationNote = (SELECT Note FROM INSERTED)
        WHERE LocalisationId = @LocalisationId   
    ;
    GO
    
    -------------------------------------------------------------------------------------------------
    -- Locaux, trigger pour suppression : on interdit la suppression, on ne fait donc rien
    -------------------------------------------------------------------------------------------------
    GO
    CREATE TRIGGER LOCAL_LOCALISATION_DELETE_TR ON LOCAL_LOCALISATION_V INSTEAD OF DELETE
    AS
    DECLARE @suppr AS CHAR(1) ;
    GO
    
    Ainsi, l’utilisateur n’a plus à avoir accès directement aux tables LOCALISATION, CAMION et LOCAL, il utilisera les vues (qu’il faudrait lui présenter avec un nom simplifié...)
    (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.
      3  0

  11. #71
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Mise à jour des vues CAMION_LOCALISATION_V et LOCAL_LOCALISATION_V :


    -------------------------------------------------------------------------------------
    -- DateSold, DateMfg, Color, Note : valeurs par défaut
    -------------------------------------------------------------------------------------
    
    INSERT INTO  CAMION_LOCALISATION_V (VIN, Immat, DateAchat, Manufacturer, Model, Number)
        SELECT 'vin01', 'immat01', '2012-07-01', 'Leclerc', 'Modèle Bozo',  314
    ;
    -------------------------------------------------------------------------------------
    -- DateSold, DateMfg : valeurs par défaut
    -------------------------------------------------------------------------------------
    
    INSERT INTO  CAMION_LOCALISATION_V (VIN, Immat, DateAchat, Manufacturer, Model, Number, Color, Note)
        SELECT 'vin02', 'immat02', '2015-07-05', 'Leclerc', 'Modèle Mac Pherson',  324 , 'fraise', 'Mon beau camion à moi'	
    ;
    
    INSERT INTO LOCAL_LOCALISATION_V (LocalCode, LocalNom) 
        SELECT 'loc01', 'Entrepôt Tartempion' ;
    
    INSERT INTO  CAMION_LOCALISATION_V (VIN, Immat, DateAchat, Manufacturer, Model, Number, Color, Note)
        SELECT 'vin03', 'immat03', '2016-04-01', 'Leclerc', 'Petit Pierre',  330 , 'jaune', 'difficile à vendre !'
    ;
    
    INSERT INTO LOCAL_LOCALISATION_V (LocalCode, LocalNom) 
        SELECT 'loc02', 'Vendu' ;
    
    INSERT INTO  CAMION_LOCALISATION_V (VIN, Immat, DateAchat, Manufacturer, Model, Number, Note)
        SELECT 'C1', 'immatC1', '2010-09-01', 'Brassens', 'l''Auvergnat',  351, 'Ça roule !'	
    ;
    INSERT INTO  CAMION_LOCALISATION_V (VIN, Immat, DateAchat, Manufacturer, Model, Number, Color)
        SELECT 'C2', 'immatC2', '2010-12-06', 'Brassens', 'Marquise',  352, 'Bleu'
    ;
    
    UPDATE CAMION_LOCALISATION_V 
        SET Color = 'framboise', Note = 'note 41' 
    	WHERE VIN = 'vin01' ;
    	
    UPDATE LOCAL_LOCALISATION_V
        SET LocalNom = 'Ancien entrepôt Tartempion', Note = 'Ce fut dur...'
        WHERE LocalCode = 'loc01' ;
    
    --------------------------------------
    -- on ne supprime pas les camions
    -- Le DELETE sera  inopérant !
    --
    -------------------------------------
    DELETE FROM CAMION_LOCALISATION_V ;
    
    --------------------------------------
    -- Quelques SELECT 
    --------------------------------------
    
    SELECT '' as CAMION, * FROM CAMION ;
    
    SELECT '' as LOCAL, * FROM LOCAL ;
    
    select '' as localisation, * FROM LOCALISATION
     
    SELECT '' as CAMION_LOCALISATION_V, * FROM CAMION_LOCALISATION_V ;
    
    SELECT '' AS LOCAL_LOCALISATION_V, * FROM LOCAL_LOCALISATION_V ;
    
    
    (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.
      3  0

  12. #72
    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 Bonjour fsmrel
    Je vais répondre à une question à la fois ou donner une observation à la fois.

    1- La seule base de donnée que je ne modifie pas est celle que vous avez crée vous-même c'est à dire "TEST". Donc celle-là c'est votre espace personnel de référence. Il pourrait arriver que j'introduise des erreurs dans "DZINDZIO_TRUCK_MANAGEMENT". Donc je lis les scripts de création ou de mise à jours des tables ainsi que les Triggers que vous écrivez et j'essaie d'adapter dans "DZINDZIO_TRUCKS_MANAGEMENT". Je ne veux pas défaire à mesure que vous faites ou introduire des erreurs et vous faire chercher ou perdre votre temps. Si je m'aperçois que j'ai introduit des erreurs, je peux toujours recopier une table de "TEST" dans "DZINDZIO_TRUCK_MANAGEMENT

    2-

    -----------------------------------------------------------
    -- Les camions
    -----------------------------------------------------------

    Votre version :

    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
    CREATE TABLE CAMION 
    (
            CamionId              INT             NOT NULL
          , CamionVIN             VARCHAR(24)     NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
          , CamionDateVente       DATE            NOT NULL DEFAULT '9999-12-31'
          , CamionDateMfg         DATE            NOT NULL DEFAULT '9999-12-31'
          , CamionManufacturer    VARCHAR(32)     NOT NULL
          , CamionModel           VARCHAR(32)     NOT NULL
          , CamionNumber          INT             NOT NULL
          , CamionColor           VARCHAR(16)     NOT NULL DEFAULT ''
        , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
        , CONSTRAINT CAMION_VIN_AK UNIQUE (CamionVIN)
        , CONSTRAINT CAMION_Immat_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_Number_AK UNIQUE (CamionNumber)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (CamionId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    Ce qui suit, ce n'est pas un caprice et ce n'est pas moi qui l'impose mais c'est la réalité sur le terrain.

    Les colonnes qui ne changeront jamais, qui seront toujours uniques et qui seront toujours NOT NULL sont :
    CamionId et CamionVIN

    Les colonnes qui ne changeront jamais, qui ne seront jamais uniques et qui ne seront pas toujours NOT NULL sont :
    CamionDateVente, CamionManufacturer, CamionModel, CamionColor DEFAULT 'White'

    Les colonnes qui pourraient changer, qui ne seront jamais uniques et qui ne seront pas toujours NOT NULL sont :
    CamionImmat, CamionNumber, CamionDateMfg, CamionDateAchat,

    Si SQL Serveur voit une différence entre NULL et NOT NULL DEFAULT '', l'utilisateur, il n'en voit pas.
    Je ne peux pas imposer à l'utilisateur de mettre des valeurs dans les colonnes s'il ne connait pas ces valeurs lors de la création d'un camion dans la base de données.
    Je ne peux pas toujours mettre des valeurs par défaut dans les colonnes excepté NOT NULL DEFAULT '' l'utilisateur va être confus ou s'il oublie de corriger les valeur par défaut, lorsqu'il interrogera la base de données, il y aura des camions manquant. Exemple : L'utilisateur veux afficher tous les camions fabriqués en 2010. Si je mets par défaut la valeur 9999-12-31 et que l'utilisateur ne fait pas attention à cette valeur et qu'il pense qu'il l'a lui-même entrée, ce camion ne s'affichera pas dans sa recherche pour 2010.
    Et oui tout ça va arriver car je connais l'utilisateur depuis 15 ans

    Ici :

    A- J'ai des camions qui n'ont plus d'immatriculation car je les garde pour les pièces seulement
    B- J'ai des camions qui en cours de route ont des numéros d'Immatriculation qui ont changés
    C- Logiquement si un camion est vendu, il n'a plus de numéro car je mets son numéro sur un nouveau camion et il n'a plus d'immatriculation (Ce sont des valeurs que je ne connais pas car il y a un nouveau propriétaire du camion)
    D- En cours de route il arrive que j'échange les numéros entre les camions
    E- J'ai des camions qui n'ont plus de numéro car ces camions sont à vendre et leur numéro sont réutilisés pour d'autre camions

    1- Logiquement, comment puis-je acheter un camion le 20 sept 2018 si ce camion est fabriqué le 31 décembre 9999 ?
    2- Comment puis-je avoir une valeur NOT NULL dans la colonne CamionImmat si le camion n'a pas d'immatriculation ?
    3- Comment puis-je avoir une valeur NOT NULL dans la colonne CamionNumber si ce camion n'a pas de numéro ?
    4- Comment puis-je avoir CAMION_Immat_AK UNIQUE (CamionImatt) si j'ai deux camions ou plus qui n'ont pas d'immatriculation ?
    5- Comment puis-je avoir CAMION_Number_AK UNIQUE (CamionNumber) si j'ai deux camions avec le même numéro ou si des camions n'ont pas de numéro ?


    Ma version :

    Code sql : 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
    20
    21
     
    CREATE TABLE CAMION 
    (
            CamionId    INT    NOT NULL
          , CamionVIN    VARCHAR(24)    NOT NULL
          , CamionDateMfg    DATE    NOT NULL DEFAULT ''
          , CamionManufacturer    VARCHAR(32)    NOT NULL DEFAULT ''
          , CamionModel    VARCHAR(32)    NOT NULL DEFAULT ''
          , CamionColor    VARCHAR(16)     NOT NULL DEFAULT 'White'
          ,GVWR    INT    NOT NULL DEFAULT ''
          ,FRGAWR    INT    NOT NULL DEFAULT '12000'
          ,2NDGAWR    INT    NOT NULL DEFAULT '20000'
          ,3RDGAWR    INT    NOT NULL DEFAULT '20000'
          , CamionDateAchat    DATE    NOT NULL  DEFAULT ''
          , CamionNumber    INT    NOT NULL DEFAULT ''
          , CamionImmat    VARCHAR(16)    NOT NULL DEFAULT ''
          , CamionDateVente    DATE    NOT NULL DEFAULT '9999-12-31'
        , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
        , CONSTRAINT CAMION_VIN_AK UNIQUE (CamionVIN)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (CamionId) 
                     REFERENCES  LOCALISATION (LocalisationId)

    GVWR (Gross Vehicle Weight Rating) Poids nominal brut du véhicule c'est à dire le poids maximal que peut supporter le camion en incluant le poids du camion lui-même,
    le poids du gasoil dans les réservoirs, le poids du chauffeur, le poids des passagers et le poids de la cargaison.
    GAWR (gross axle weight rating) Poids maximum que peuvent supporter les essieux

    Donc:

    FRGAWR : Poids maximum que peut supporter l'essieux directeur
    2NDGAWR : Poids maximum que peut supporter le premier essieu motrice
    3RDGAWR : Poids maximum que peut supporter le deuxième essieu motrice

    À noter que le FRGAWR est compter pour le premier essieu

    Ne me détestez pas J'ai besoin de vous mais je ne veux pas que vous perdiez votre temps à toujours devoir modifier vos scripts.
      0  0

  13. #73
    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 êtes un lapin, je n'ai pas le temps de répondre à toutes vos questions avant que vous développez le code. Je trouve triste que vous écrivez du code et que vous devez corriger par la suite si je ne me suis pas bien exprimé ou que je change les tables ou que je n'ai pas eu le temps de vous répondre
    Vous êtes une personne très généreuse mais je suis un peu mal à l'aise lorsque par ma faute vous devez recommencer ou corriger. Je déteste les Triggers mais l'humour que vous mettez dans les Inserts m'encourage à tout lire et à tout analyser
    Je continue de lire vos question et de répondre.
      0  0

  14. #74
    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
    "Certes, mais je répète, qu’en est-il de MAINTENANCE, REPAIRS, TRUCK_EQUIPMENT par rapport à CAMION ?"

    J'ai répondu à cette question hier

    [QUOTE]

    Votre question était :

    "Même question concernant MAINTENANCE, REPAIRS, TRUCK_EQUIPMENT."


    Ma réponse était:


    "MAINTENANCE"
    Tous les Camions auront nécessairement des maintenances. Graissage au 2 semaines en moyenne et un changement d'huile au 40 000 Kilomètres. Mais ça peut arriver dépendamment de la disponibilité qu'un camion ait un graissage à toutes les semaines et que le même camion le mois suivant reçoive son graissage après 3 semaines. Il peut arriver qu'un camion est un changement d'huile à 37 000 Km et un autre changement d'huile à 42 000 Km et un autre changement d'huile à 38750 Km. Donc la maintenance va toujours varier dans le temps et dans le Kilométrage pour chacun des camions et aussi dans le type de maintenance. On peut inclure dans la maintenance un changement de filtre à air si après vérification il est sale, ça ne sera jamais à la même période ni au même Kilométrage. Donc tous les camions auront des maintenances mais les dates, le kilométrage et le type de maintenance seront généralement toujours différents.

    "REPAIRS"
    Tous les camions auront des réparations. On répare ce qui est endommagé, donc un roulement à bille, un joint d'étanchéité qui fuit, un pare-brise endommagé, une crevaison, un joint universel abimé, une crevaison, etc, toujours différents pour chacun des camions et toujours à des dates et à des Kilométrages différents.

    Maintenance = Prévention
    Réparation = Comme le nom l'indique, on répare ce qui est brisé ou trop usé.


    "Truck_Equipment"
    Certains moteurs ont 2 filtreurs à gasoil d'autres seulement 1. Certain camions ont 2 filtreurs pour l'habitacle, d'autres seulement 1. etc. Si on parle de 1 camion en particulier, il aura toujours le même nombre de filtreurs et toujours les mêmes numéros de filtreurs. Le but de cette table est d'entrer pour chaque camion les numéros de pièces qui le concerne pour référence dans le futur et ne changeront pour ainsi dire jamais pour un camion donné, à moins qu'on change de marque de différentiels, ou de moteur, ou etc. Donc je vais chez le concessionnaire chercher les filtreurs à gasoil et les filtreurs à l'huile pour un camion en particulier, je regarde la table Truck_Equipment en lien avec ce camion pour donner au concessionnaires les bons numéros de filtreurs à gasoil et à l'huile, etc que j'ai besoin pour ce camion. Et ainsi de suite. Alors certains camions auront les mêmes filtreurs, d'autres différents. Mais en principe ce sera toujours les mêmes pour un camion donné. Il peut arriver que 2 ou 3 ou 4 camions aient tous les mêmes filtreurs à l'huile mais des filtreurs à gasoil différents et des filtreurs à air différents. Deux camions identiques et de la même année de fabrication peuvent avoir des moteurs de marques différentes alors les filtreurs à l'huile et filtreurs à gasoil seront différents. J'ai 2 camions de la même année, même modèle, mais un camion a un moteur Detroit et l'autre a un moteur Cummins. À l'exception des moteurs ils sont identiques. Deux jumeaux.

    Je ne sait pas comment vous expliquer autrement. Désolé si je ne saisie pas votre question ou si ma réponse n'est pas claire.
      0  0

  15. #75
    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 :

    Table CAMION :

    J’ai intégré CamionVIN.

    A quoi correspond CamionNumber ? Est-ce une clé alternative ? (je fais comme si)
    A quoi correspond DateMfg ?


    Ma réponse :

    CamionNumber est un numéro d'unité que la compagnie où un camion a un contrat décide de donner à un camion. Ce numéro est apposé sur les portières du camion et sert à identifier ce camion dans cette compagnie. J'ai des camions qui parcourent de courtes distances avec une remorque de 53 pieds et d'autres camions qui parcourent de plus longues distances avec deux remorques de 53 pieds. Nous appelons l'ensemble camion avec deux remorques de 53 pieds un train routier car il a une longueur totale d'environ 131 pieds ( 40 mètres ) et pèse 65 000 kilo. Donc les camions utilisés en trains routiers travaillent très dur. C'est le numéro d'unité qui est attitré pour faire des trains routiers, tous mes camions ne font pas du train routier, il faut un permis spécial de circulation. Donc lorsque j'achète un nouveau camion, il remplace un camion qui fait du train routier et le camion qui fait du train routier va servir pour les courtes distances. À ce moment nous devons prendre le numéro du camion qui était attitré pour faire du train routier et le donner au nouveau camion puisque le permis spéciale de circulation est donné au numéro du camion et non au camion lui-même. Compliqué ??? Alors le vieux camion lui il peut avoir un nouveau numéro donné par la compagnie ou prendre le numéro d'un autre camion plus vieux que nous vendons alors il garde l'ancienneté dans la compagnie.


    DateMFG on écrit "mfg date" est un abréviation anglaise qui désigne "Manufacturing date" ou "Date of manufacture". En français "Date de fabrication" Donc TruckDateMFG = "Date de fabrication du camion"


    CamionNumber = Peut changer alors pas fiable comme clé pour identifier le camion dans la base de donnée. Mais il va être presque toujours utilisé pour les requêtes aussi longtemps que le numéro ne change pas. Donc pas fiable comme référence absolue...

    DateMFG Quelque fois un camion neuf fabriqué disons en décembre 2018 va être vendu pour un camion 2019 puisque c'est un modèle 2019 fabriqué en 2018. Alors si j'achète ce camion mais que je ne l'ai pas encore en ma possession, je vais inscrire dans la base de données 2019 mais lorsque j'aurai en ma possession le camion et que je regarderai le "mfg date" apposé sur le cadre d'une portière, il indiquera 2018 alors je ferai la correction dans la base de données. C'est arrivé pour un camion acheté il y a 3 mois. Mon patron à acheté à distance ce camion sans l'avoir vu, le camion était à 2300 kilomètres. Alors le camion a été immatriculé à distance et il a eu son numéro d'unité et il a travaillé 2 mois sans venir ici à notre garage. Alors c'était un camion 2015 mais fabriqué en décembre 2014 alors mon patron aurait entré 2015 dans la base de données et ensuite il aurait corrigé pour 2014. Donc DateMFG peut changer. Pas fiable comme référence absolue…


    CamionVIN Abréviation anglaise "Vehicle Identification Number" en français "Numéro d'identification du véhicule" c'est à dire son "Numéro de série". Ce numéro est la référence absolue du véhicule et ne changera jamais. Une fois que ce numéro est apposé sur un véhicule, le manufacturier n'utilisera plus jamais ce numéro de série pour aucun autre véhicule et aucun autre manufacturier ne l'utilisera car c'est un numéro qui est composé de 15 à 18 chiffres et lettres. Chaque manufacturier code différemment leur numéros de série.
      0  0

  16. #76
    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
    "l’utilisateur peut modifier ce qu’il veut, sauf CamionId (ce qui est normal ), et le VIN, puisque celui-ci est réputé invariant."

    Ça c'est le seul "HIC" si lors de la création du camion, l'utilisateur saisit un VIN erroné et qu'il ne peut pas le corriger. Ça va arriver…Ça va arriver…

    Une solution pourrait être de forcer l'utilisateur à saisir le VIN deux fois et un script comparerait les deux VIN comme on le fait lors de la création d'un compte utilisateur. On nous demande d'entrer deux fois notre adresse email et deux fois notre mot de passe et si les deux adresses email ou les deux mots de passe sont différents nous devons corriger avant de pouvoir valider. De cette façon on a la quasi certitude que le VIN ne sera pas erroné donc rien à corriger...

    Puisque PHP s'exécute côté serveur, je pense qu'il est judicieux d'utiliser JavaScript sur le formulaire. PHP et JavaScript peuvent cohabiter sur le même formulaire alors ça donnerait quelque chose du genre :

    Code javascript : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <script language="JavaScript">
     
    // Script de vérification d'égalité entre deux champs
     
    function validation(f) {
      if (f.VIN1.value == '' || f.VIN2.value == '') {
        alert('La saisie des champs VIN est obligatoire');
        f.VIN1.focus();
        return false;
        }
      else if (f.VIN1.value != f.VIN2.value) {
        alert('Les VIN ne correspondent pas!');
        f.VIN1.focus();
        return false;
        }
      else if (f.VIN1.value == f.VIN2.value) {
        return true;
        }
      else {
        f.VIN1.focus();
        return false;
        }
      }
    </script>
     
    <form method="post" onSubmit="return validation(this)" >
    Entrez le VIN:
    <input name="VIN1" type="text" value=""><br />
    Entrez le VIN à nouveau:
    <input name="VIN2" type="text" value="">
    <input type="submit">
    </form>




    Donc pour faire un test j'ai écrit ceci et j'ai sauvegardé dans le fichier test.html et essayer dans Internet Explorer

    Code html : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <!DOCTYPE html>
    <html>
      <head>
        <title></title>
      </head>
     
      <body>
     
     <h3>Il est tres important de saisir le VIN sans erreur car il est impossible de le modifier.<br>
     Pour s'en assurer, vous devez saisir deux fois le VIN</h3><br />
     
     <script>
     
    // Script de vérification d'égalité entre deux champs
     
    function validation(f) {
      if (f.VIN1.value == '' || f.VIN2.value == '') {
        alert('La saisie des champs VIN est obligatoire');
        f.VIN1.focus();
        return false;
        }
      else if (f.VIN1.value != f.VIN2.value) {
        alert('Les VIN ne correspondent pas!');
        f.VIN1.focus();
        return false;
        }
      else if (f.VIN1.value == f.VIN2.value) {
        alert('Good boy, vous avez tout compris! Je vous donnes deux lapins et trois fourmis');
        return true;
        }
      else {
        f.VIN1.focus();
        return false;
        }
      }
    </script>
     
     
    <form method="post" onSubmit="return validation(this)" >
    Entrez le VIN dans la boite de saisie:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="VIN1" type="text" value=""><br /><br />
    Entrez le VIN de nouveau pour confirmer:
    <input name="VIN2" type="text" value="">
    <input type="submit">
    </form>
     
      </body>
    </html>
    Est-ce que ça vous va ou vous préférez votre méthode ?
      0  0

  17. #77
    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
    "Dans l’état actuel, on ne peut modifier (par UPDATE de la vue) qu’un camion à la fois,"

    C'est parfait comme ça, on ne change rien pour cette partie, on change les paramètres pour un camion à la fois.
      0  0

  18. #78
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir ordigil,

    Bon, j’ai trouvé une paire d’heures...


    Citation Envoyé par ordigil Voir le message
    Ça c'est le seul "HIC" si lors de la création du camion, l'utilisateur saisit un VIN erroné et qu'il ne peut pas le corriger. Ça va arriver…Ça va arriver…
    Bon... Après tout l’utilisateur étant maître des données naturelles, on pourrait l’autoriser à modifier le VIN. De toute façon ça n’a pas d’incidence sur la base de données elle-même. Mais votre idée de double saisie est de toute façon pertinente.
    A vous de décider de la politique ès matière. On laisse l’utilisateur modifier le VIN ? (Evitez de répondre par émoticône... ^^)


    Citation Envoyé par ordigil Voir le message
    je suis un peu mal à l'aise lorsque par ma faute vous devez recommencer ou corriger
    Ne vous faites pas de souci, j’ai passé près de 40 ans à auditer, corriger, soigner des bases de données malades, et vous me donnez l’occasion de ne pas perdre le contact, ça me rappelle le bon temps ! D’autant qu’il s’agit plutôt ici de bien modéliser.


    Citation Envoyé par ordigil Voir le message
    Ce qui suit, ce n'est pas un caprice et ce n'est pas moi qui l'impose mais c'est la réalité sur le terrain.
    Et c’est cette réalité qui donne lieu aux règles de gestion des données dont j’ai besoin !


    Citation Envoyé par ordigil Voir le message
    Je déteste les Triggers
    Confidence pour confidence, moi aussi quand je suis obligé d’en passer par eux, les détourner de leur rôle premier, quand les SGBD ne sont pas conformes à la norme SQL (pire, quand celle-ci n’est pas conforme à la théorie relationnelle). Ainsi, le contrôle de recouvrement des périodes devrait faire l’objet, conformément à la norme, de l’instruction CREATE ASSERTION (ou de contraintes mettant plus d’une table en jeu au stade du CREATE TABLE). De même, la mise à jour des vues comportant des jointures devrait être possible, conformément à la norme, mais avec Microsoft SQL Server je suis obligé de mettre la main dans le cambouis des triggers.

    Au sujet des triggers, il faudra que je pose des questions dans le forum SQL Server quant au verrouillage pendant les mises à jour des vues.


    Citation Envoyé par ordigil Voir le message
    Ma réponse était:
    Jusqu’à maintenant, j’ignorais que l’émoticône utilisée valait confirmation... Mais entre temps j’ai eu la réponse à ma question en consultant DZINDZIO_TRUCK_MANAGEMENT, et sa réponse est sans équivoque :
    Cela dit, quand je le pourrai, j’effectuerai une plongée dans les structures en cause.


    Citation Envoyé par ordigil Voir le message
    Je ne sait pas comment vous expliquer autrement
    Les mots « oui » ou « non » en bon français eurent suffi...


    Citation Envoyé par ordigil Voir le message
    Si je m'aperçois que j'ai introduit des erreurs, je peux toujours recopier une table de "TEST" dans "DZINDZIO_TRUCK_MANAGEMENT
    Tout baigne. (En passant, ma base de données de test est 'Temp').


    Citation Envoyé par ordigil Voir le message
    A - J'ai des camions qui n'ont plus d'immatriculation car je les garde pour les pièces seulement
    D’accord. Je vais supprimer la contrainte de clé candidate et pallier par trigger, avec la règle d’unicité suivante :

    Chaque valeur de numéro d’immatriculation est unique, mais cette contrainte ne s’applique pas pour les immatriculations dont la valeur est ''.


    Citation Envoyé par ordigil Voir le message
    B - J'ai des camions qui en cours de route ont des numéros d'Immatriculation qui ont changé
    Ce qui n’invalide pas la règle d’unicité.


    Citation Envoyé par ordigil Voir le message
    C- Logiquement si un camion est vendu, il n'a plus de numéro car je mets son numéro sur un nouveau camion et il n'a plus d'immatriculation (Ce sont des valeurs que je ne connais pas car il y a un nouveau propriétaire du camion)
    D- En cours de route il arrive que j'échange les numéros entre les camions
    E- J'ai des camions qui n'ont plus de numéro car ces camions sont à vendre et leur numéro sont réutilisés pour d'autre camions
    D’accord. Je vais supprimer la contrainte de clé candidate {CamionNumber} et pallier par trigger, avec la règle d’unicité suivante :

    Chaque valeur de numéro de camion est unique (CamionNumber), mais cette contrainte ne s’applique pas pour les numéros dont la valeur est 0 (0 donnera lieu par ailleurs à valeur par défaut).


    Citation Envoyé par ordigil Voir le message
    1- Logiquement, comment puis-je acheter un camion le 20 sept 2018 si ce camion est fabriqué le 31 décembre 9999 ?
    Maintenant que je sais à quoi correspond CamionDateMfg, pas de problème. Il faut bien voir que si dans la table CAMION, on peut avoir CamionDateMfg = '9999-12-31' (qu’on peut tout aussi bien remplacer par '1900-01-01' qui est la borne inférieure chez Microsoft SQL Server), on peut présenter l’information à l’utilisateur en remplaçant '9999-12-31' par ce qu’on veut. Par exemple :

    SELECT VIN, Immat, DateAchat, (CASE  DateSold WHEN '9999-12-31' THEN '' END) AS DateSold
          , (CASE  DateMfg WHEN '9999-12-31' THEN '' END) AS DateMfg, Manufacturer, Model, Number, Color, Note 
    FROM   CAMION_LOCALISATION_V
    WHERE  VIN = 'vin01' 
    
    =>

    VIN    Immat    DateAchat    DateSold    DateMfg    Manufacturer    Model         Number    Color      Note
    vin01  immat01  2012-07-01                          Leclerc         Modèle Bozo   314       framboise  note 41
    
    Si le camion 'vin01' passe à l’état courte distance :

    UPDATE CAMION_LOCALISATION_V SET Number = 0 WHERE VIN = 'vin01' ;
    
    Alors la requête suivante pourra afficher '' (ou autre chose si vous préférez) au lieu de 0 :

    SELECT VIN, Immat, DateAchat, (CASE  DateSold WHEN '9999-12-31' THEN '' END) AS DateSold
          , (CASE  DateMfg WHEN '9999-12-31' THEN '' END) AS DateMfg, Manufacturer
         , Model, (CASE Number WHEN 0 THEN '' END) AS Number, Color, Note 
    FROM   CAMION_LOCALISATION_V
    WHERE  VIN = 'vin01' 
    ;
    
    =>

    VIN    Immat    DateAchat    DateSold    DateMfg    Manufacturer    Model         Number    Color      Note
    vin01  immat01  2012-07-01                          Leclerc         Modèle Bozo             framboise  note 41
    
    (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

  19. #79
    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 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Remarque préliminaire concernant NULL.

    NULL n’est pas une valeur, mais une marque. Soit A une colonne de la table T : on ne peut donc pas écrire « A = NULL » mais « A IS NULL ». Ceci n’est pas bien gênant, ce qui l’est beaucoup plus, c’est que NULL nous embarque dans une logique ternaire qui est pour nous source d’erreurs ; NULL inhibe l’optimiseur des SGBD relationnels, il invalide les théorèmes calés sur la logique binaire, voyez par exemple la remarque de Date à propos du théorème de Heath, fondamental en modélisation, même si 99,9% des concepteurs n’en ont jamais entendu parler...

    Pour ma part, NULL m’a assez fait planter et j’ai préféré me résoudre à rester en logique binaire, avec par exemple les valeurs par défaut, du genre dates à '9999-112-31'. Le tout est que cela reste transparent pour l’utilisateur.


    Citation Envoyé par ordigil Voir le message
    CamionNumber = Peut changer alors pas fiable comme clé pour identifier le camion dans la base de donnée. Mais il va être presque toujours utilisé pour les requêtes aussi longtemps que le numéro ne change pas. Donc pas fiable comme référence absolue...
    D’accord. Mais s’il n’identifie pas il est sujet à la contrainte d’unicité évoquée dans mon message précédent :

    Citation Envoyé par fsmrel
    Je vais supprimer la contrainte de clé candidate {CamionNumber} et pallier par trigger, avec la règle d’unicité suivante :

    Chaque valeur de numéro de camion est unique (CamionNumber), mais cette contrainte ne s’applique pas pour les numéros dont la valeur est 0 (0 donnera lieu par ailleurs à valeur par défaut).


    Citation Envoyé par ordigil Voir le message
    lorsque j'achète un nouveau camion, il remplace un camion qui fait du train routier et le camion qui fait du train routier va servir pour les courtes distances. À ce moment nous devons prendre le numéro du camion qui était attitré pour faire du train routier et le donner au nouveau camion puisque le permis spéciale de circulation est donné au numéro du camion et non au camion lui-même. Compliqué ??? Alors le vieux camion lui il peut avoir un nouveau numéro donné par la compagnie ou prendre le numéro d'un autre camion plus vieux que nous vendons alors il garde l'ancienneté dans la compagnie.
    Prenons le cas du camion C1 faisant du train routier avec CamionNumber = N1. A un moment donné, C1 cesse de faire du train routier et passe en mode courte distance : si j’ai bien compris, la règle est donc que C1 ne pourra pas conserver CamionNumber = N1. D’accord, on pourra remplacer N1 par N2, ou le supprimer, cf. mon précédent message, où l’on efface le CamionNumber pour vin01.
    (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

  20. #80
    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 :

    Dans un 6e temps, on affecte le moteur au camion :

    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId)
    SELECT ComposantId, ''2012-07-01', '9999-12-31'
    , (SELECT CamionId
    FROM CAMION WHERE CamionImmat = 'immat01')
    FROM MOTEUR
    WHERE MoteurNumeroSerie = 's01'
    ;

    Il est très important de prendre en considération partout dans la base de données que la valeur de CamionImmat et CamionNumber peuvent changer et vont changer comme je vous ai expliquer. Donc CamionImmat et CamionNumber doivent être considérés comme des caractéristiques secondaires changeantes au même titre que CamionColor ou CamionPropre, CamionPasPropre, CamionGasoilPlein, CamionGasoilVide...
    CamionVIN lui il ne changera jamais même si un terroriste fait exploser le camion. CamionVIN demeure éternellement dans la base de données du manufacturier du camion et même si j'apportais le camion réduit en poudre au manufacturier et lui disait, voilà, le camion il n'existe plus, vous pouvez réutiliser le VIN de ce camion pour un autre camion à présent. Il n'en changerait rien, le manufacturier me dirait : un VIN ne peut être attribué qu'au camion d'origine, le fait que le camion n'existe plus ne change en rien la relation entre ce camion et son VIN.

    Il y a cependant un "HIC"

    Bien que CamionID et CamionVIN seront les deux clés pour identifier formellement un camion, je ne peux pas obliger l'utilisateur à utiliser le CamionVIN lorsqu'il interrogera la base de donnée. Ça ne ferait aucun sens d'obliger quelqu'un à se souvenir de 18 chiffres pour chaque camion. Donc dans les requêtes, je vais utiliser le CamionNumber puisque qu'il contient un maximum de 5 chiffres et ça l'utilisateur les connait tous par cœur et si je lui demande : Hey le camion numéro 25437 est quel modèle et en quelle année a-t-il été fabriqué ? Il me répondra de mémoire : Ah ce camion a été fabriqué par Freightliner en 2015 et le modèle est un Cascadia et je l'ai acheté usagé en 2018, si tu veux son VIN et son numéro d'immatriculation, je devrai aller à mon office pour regarder dans le cahier concernant ce camion car je ne m'en souviens pas. Par contre je me souviens que l'an dernier c'était un International modèle 9200 fabriqué en 2010 qui portait le numéro 25437 mais maintenant ce camion n'a plus de numéro car le moteur est sauté et je ne le réparerai pas, je vais le vendre tel quel pour les pièces...
      0  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