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

  1. #781
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut Bonjour fsmrel :-)

    Est-ce que ça ça pourrait aller ???

    USE [DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST]
    GO
    
    /****** Object:  Table [dbo].[MAINTENANCE]    Script Date: 2018-12-03 00:37:48 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[MAINTENANCE](
    	[MaintenanceId] [int] NOT NULL,
    	[CamionId] [int] NOT NULL,
    	[MaintenanceDate] [date] NOT NULL,
    	[MaintenanceMilleage] [int] NOT NULL,
     CONSTRAINT [PK_MAINTENANCE_1] PRIMARY KEY CLUSTERED 
    (
    	[MaintenanceId] ASC,
    	[CamionId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[MAINTENANCE]  WITH CHECK ADD  CONSTRAINT [MAINTENANCE_CAMION_FK] FOREIGN KEY([CamionId])
    REFERENCES [dbo].[CAMION] ([CamionId])
    GO
    
    ALTER TABLE [dbo].[MAINTENANCE] CHECK CONSTRAINT [MAINTENANCE_CAMION_FK]
    GO
    
    ALTER TABLE [dbo].[MAINTENANCE]  WITH CHECK ADD  CONSTRAINT [MAINTENANCE_MAINTENANCE_TYPE_FK] FOREIGN KEY([MaintenanceId])
    REFERENCES [dbo].[MAINTENANCE_TYPE] ([MaintenanceId])
    GO
    
    ALTER TABLE [dbo].[MAINTENANCE] CHECK CONSTRAINT [MAINTENANCE_MAINTENANCE_TYPE_FK]
    GO
    
    

    USE [DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST]
    GO
    
    /****** Object:  Table [dbo].[MAINTENANCE_TYPE]    Script Date: 2018-12-03 00:38:01 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[MAINTENANCE_TYPE](
    	[MaintenanceId] [int] IDENTITY(1,1) NOT NULL,
    	[MaintenanceType] [varchar](50) NOT NULL,
     CONSTRAINT [PK_MAINTENANCE_TYPE] PRIMARY KEY CLUSTERED 
    (
    	[MaintenanceId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    


    USE [DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST]
    GO
    
    /****** Object:  View [dbo].[MAINTENANCE_VIEW]    Script Date: 2018-12-03 00:38:23 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE VIEW [dbo].[MAINTENANCE_VIEW]
    AS
    SELECT        z.CamionVIN, z.CamionNumber, y.MaintenanceDate, y.MaintenanceMilleage, x.MaintenanceType
    FROM            dbo.CAMION AS z INNER JOIN
                             dbo.MAINTENANCE AS y ON y.CamionId = z.CamionId INNER JOIN
                             dbo.MAINTENANCE_TYPE AS x ON y.MaintenanceId = x.MaintenanceId
    GO
    
    

    USE [DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST]
    GO
    
    INSERT INTO [dbo].[MAINTENANCE]
               ([MaintenanceId]
               ,[CamionId]
               ,[MaintenanceDate]
               ,[MaintenanceMilleage])
         VALUES
               ( 2
               , 15
               ,'2018-12-01'
               ,342667)
               ,
               ( 3
               , 15
               ,'2018-12-02'
               ,342667)
               ,
               ( 6
               , 12
               ,'2018-12-01'
               ,342667)
    GO
    
    
    USE DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST
    
    GO
    
    SELECT * FROM MAINTENANCE ;
    SELECT * FROM MAINTENANCE_TYPE ;
    SELECT * FROM MAINTENANCE_VIEW ;
    -----SELECT * FROM CAMION ;
    SELECT MaintenanceId FROM MAINTENANCE
    WHERE CamionId = 15
    
    


    Je ne sais pas comment faire les Triggers INSERT ET UPDATE dans MAINTENANCE_VIEW et il resterait à inclure les changements d'huile dans MAINTENANCE_VIEW
    Images attachées Images attachées  

  2. #782
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Bonjour Ordigil,


    Je vais regarder la maintenance. Je vous préviens dès que j’ai quelque chose pouvant mieux tenir la route (avec un camion, je conviens que même dans la base de données il faut éviter de déraper et se retrouver dans la position du camion du post #415...)
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  3. #783
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    post #415, il me semble que ça fait des lunes ce post hahaha
    Avez-vous appris par cœur tous nos posts ????? J'avoue que j'ai de la difficulté à revenir en arrière pour retrouver quelque chose
    Vous êtes vraiment une personne attentive et ordonnée.


    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Je vais regarder la maintenance. Je vous préviens dès que j’ai quelque chose pouvant mieux tenir la route (avec un camion, je conviens que même dans la base de données il faut éviter de déraper et se retrouver dans la position du camion du post #415...)

  4. #784
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Bonjour Ordigil,


    Votre proposition de table MAINTENANCE est bien partie, mais il y a un défaut qui fera un jour ou l’autre rater un virage (cf. post #415...) : la table a pour clé primaire la paire {Maintenanceid, CamionId}, donc une fois que vous aurez changé les balais d’essuie-glace du camion C1, vous ne pourrez plus le faire par la suite pour ce malheureux camion... Pour que vous puissiez renouveler l’opération plus tard, la date devient partie prenante et vient se glisser dans la clé primaire. La structure de la table deviendrait donc celle-ci :

    CREATE TABLE MAINTENANCE
    (
            CamionId              INT             NOT NULL
          , MaintenanceDate       DATE            NOT NULL
          , MaintenanceId         INT             NOT NULL
          , MaintenanceMilleage   INT             NOT NULL
        , CONSTRAINT MAINTENANCE_PK PRIMARY KEY (CamionId, MaintenanceDate, MaintenanceId)
        , CONSTRAINT CAMION_MAINTENANCE_FK FOREIGN KEY (CamionId)
              REFERENCES (CamionId) ON DELETE CASCADE
        , CONSTRAINT CAMION_MAINTENANCE_TYPE_FK FOREIGN KEY (MaintenanceId)
              REFERENCES MAINTENANCE_TYPE (MaintenanceId)
    )
    
    Notez en passant la position des colonnes dans la clé : CamionId est en tête (performance oblige, l’élément le plus important pour les requêtes est quand même le camion (ou la date, vous me direz...)).

    Mais il y a maintenant un problème de redondance (dans les cercles, on parle de viol de la deuxième forme normale), et la redondance voilà l’ennemie. En effet, si le même jour vous effectuez N opérations sur le camion C1, vous serez obligé de répéter très exactement, mais fâcheusement, la valeur prise par MaintenanceMilleage, alors que, vous en serez d’accord, cette valeur ne dépend aucunement en fait du type maintenance (colonne MaintenanceId), ce que contredit hélas la clé primaire.

    Puisque MaintenanceId ne dépend que de la paire {CamionId, MaintenanceDate}, on normalise en séparant la table MAINTENANCE en deux, façon Salomon :

    (A) Une table, appelons-la CAMION_MILLEAGE, comportant les colonnes CamionId, MaintenanceMilleage (que j’ai renommée en CamionMilleage, mais vous n’êtes pas obligé d’en faire autant) et CamionMilleageDate. Pour la clé primaire de la table, je mets en oeuvre une colonne artificielle CamionMilleageId, tandis que la paire {CamionId, CamionMilleageDate} devient clé alternative :


    CREATE TABLE CAMION_MILLEAGE
    (
            CamionId              INT             NOT NULL
          , CamionMilleageId      INT  IDENTITY   NOT NULL
          , CamionMilleageDate    DATE            NOT NULL
          , CamionMilleage        INT             NOT NULL
        , CONSTRAINT CAMION_MILLEAGE_PK PRIMARY KEY (CamionId, CamionMilleageId)
        , CONSTRAINT CAMION_MILLEAGE_AK UNIQUE (CamionId, CamionMilleageDate)
        , CONSTRAINT CAMION_MILLEAGE_FK FOREIGN KEY (CamionId)
              REFERENCES CAMION (CamionId) ON DELETE CASCADE
    )
    

    (B) La table MAINTENANCE, débarrassée de la colonne MaintenanceMilleage, donc respectant la deuxième forme normale (et au-delà) :

    CREATE TABLE MAINTENANCE
    (
            CamionId              INT             NOT NULL
          , CamionMilleageId      INT             NOT NULL
          , MaintenanceTypeId     INT             NOT NULL
        , CONSTRAINT MAINTENANCE_PK PRIMARY KEY (CamionId, CamionMilleageId, MaintenanceTypeId)
        , CONSTRAINT CAMION_MAINTENANCE_FK FOREIGN KEY (CamionId, CamionMilleageId)
              REFERENCES CAMION_MILLEAGE (CamionId, CamionMilleageId) ON DELETE CASCADE
        , CONSTRAINT CAMION_MAINTENANCE_TYPE_FK FOREIGN KEY (MaintenanceTypeId)
              REFERENCES MAINTENANCE_TYPE (MaintenanceTypeId)
    )
    Notez que la table MAINTENANCE ne fait plus référence à la table CAMION, mais à la table CAMION_MILLEAGE.


    La structure de la vue (dont j’ai raccourci le nom, mais là encore si vous préférez un autre nom, pas de problème...) :

    CREATE VIEW MAINTENANCE_V (CamionVIN, CamionNumber, CamionMilleageDate, CamionMilleage, MaintenanceType)
    AS
    SELECT CamionVIN, CamionNumber, CamionMilleageDate, CamionMilleage, MaintenanceType
    FROM   CAMION AS x JOIN CAMION_MILLEAGE AS y on x.CamionId = y.Camionid
                       JOIN MAINTENANCE AS z ON y.Camionid = z.CamionId AND y.CamionMilleageId = z.CamionMilleageId
                       JOIN MAINTENANCE_TYPE AS t ON z.MaintenanceTypeId = t.MaintenanceTypeId
    
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  5. #785
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Citation Envoyé par ordigil Voir le message
    Je ne sais pas comment faire les Triggers INSERT ET UPDATE dans MAINTENANCE_VIEW et il resterait à inclure les changements d'huile dans MAINTENANCE_VIEW
    Bon, voici déjà un trigger pour les inserts dans la vue, à secouer énergiquement :

    CREATE TRIGGER MAINTENANCE_V_INSERT_TR ON MAINTENANCE_V INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @theTrigger as VARCHAR(64) = 'MAINTENANCE_V_INSERT_TR'
    DECLARE @EngueuladeIntro AS VARCHAR(128) = @theTrigger +  ' - Maintenance (insert) : ' ;
    DECLARE @Engueulade AS VARCHAR(512) ;
    DECLARE @CamionId AS INT ;
    DECLARE @CamionVIN AS VARCHAR(32) ;
    DECLARE @MaintenanceTypeId AS INT ;
    DECLARE @MaintenanceType AS VARCHAR(48) ;
    DECLARE @CamionMilleageDate AS CHAR(10) ;
    DECLARE @CamionMilleage AS INT ;
    DECLARE @CamionMilleageOld AS INT ;
    DECLARE @Erreur AS CHAR(1) ;
    DECLARE @ErreurVINmanquant AS CHAR(1) = 'N';
    DECLARE @ErreurVINinconnu AS CHAR(1) = 'N' ;
    DECLARE @ErreurTypeMaintenanceManquant AS CHAR(1) = 'N';
    DECLARE @ErreurTypeMaintenanceInconnu AS CHAR(1) = 'N' ;
    DECLARE @ErreurDateManquante AS CHAR(1) = 'N' ;
    DECLARE @ErreurDateInvalide AS CHAR(1) = 'N' ;
    DECLARE @ErreurMilleageManquant AS CHAR(1) = 'N' ;
    DECLARE @ErreurMilleageInvalide AS CHAR(1) = 'N' ;
    
    -------------------------------------------------
    -- Le camion faisant l'objet de la maintenance
    -- doit être connu dans la base de données,
    -- Même chose pour le type de maintenance;
    -- La date de la maintenance et le kilométrage
    -- doivent être fournis par Cézigue.
    ------------------------------------------------- 
    
    -------------------------------------------------------------------------------------------------
    -- Contrôles préliminaires 
    ------------------------------------------------------------------
    
    --------pour debug : -------------- SELECT @EngueuladeIntro as '@EngueuladeIntro'  ;
    -------pour debug : ------- SELECT (SELECT COUNT(*) from INSERTED) AS  'COUNT(*) from INSERTED' ;
    -------pour debug : ------- SELECT TOP 5 '' as INSERTED, * FROM INSERTED ;
    
    ----------------------------------------------------
    -- Des fois que INSERTED soit vide...
    ----------------------------------------------------
    
    IF (SELECT COUNT(*) from INSERTED) = 0
        BEGIN 
             SET @Engueulade = @EngueuladeIntro + 'VIN du camion et/ou type de maintenance manquants'
             SELECT @Engueulade AS Engueulons
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests         
             RETURN
        END
    
    ------------------------------------------------------------------------
    -- Dans cette version on n'a pas de curseur pour traiter du multi-lignes
    ------------------------------------------------------------------------
    
    IF (SELECT COUNT(*) FROM INSERTED) > 1
        BEGIN 
             SET @Engueulade = @EngueuladeIntro + 'une seule paire camion, type de mainenance à la fois SVP !'
             SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
             RETURN
        END
    
    -----------------------------------------------------
    -- INSERTED contient exactement une ligne
    -----------------------------------------------------
    
    SET @CamionVIN =  (SELECT CamionVIN FROM INSERTED) ;
    SET @CamionId =  (SELECT Camionid FROM CAMION WHERE CamionVIN = @CamionVIN) ;
    
    SET @MaintenanceType = (SELECT MaintenanceType FROM INSERTED) ;
    SET @MaintenanceTypeId = (SELECT MaintenanceTypeId FROM MAINTENANCE_TYPE WHERE MaintenanceType = @MaintenanceType) ;
    
    SET @CamionMilleageDate = (SELECT CamionMilleageDate FROM INSERTED) ;
    
    SET @CamionMilleage = (SELECT CamionMilleage FROM INSERTED) ;
    
    ---- pour debug ---- select @CamionVIN as '@CamionVIN'  
    ---- pour debug ---- select @CamionId as '@CamionId'  
    ---- pour debug ---- select @MaintenanceType as '@MaintenanceType'  
    ---- pour debug ---- select @MaintenanceTypeId as '@MaintenanceTypeId'  
    ---- pour debug ---- select @CamionMilleageDate as '@@CamionMilleageDate'  
    ---- pour debug ---- select @CamionMilleage as '@@CamionMilleage'  
    
    ------------------------------------------------
    -- contrôle du camion
    ------------------------------------------------ 
    IF @CamionVIN IS NULL
        BEGIN 
             SET @ErreurVINmanquant = 'Y' ;
             SET @Engueulade = @EngueuladeIntro + 'Le VIN du camion est absent !'
             SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
        END
    
    IF NOT @CamionVIN IS NULL
        BEGIN 
            IF  @CamionId IS NULL
                BEGIN
                    SET @ErreurVINinconnu = 'Y' ;
                    SET @Engueulade = @EngueuladeIntro + 'Le VIN du camion n''est pas connu.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
                END
        END
    
    ---------------------------------------------------
    -- Contrôle du type de maintenance
    ---------------------------------------------------
    
    iF @MaintenanceType IS NULL
        BEGIN
            SET @ErreurTypeMaintenanceManquant = 'Y' ;
            SET @Engueulade = @EngueuladeIntro + 'Le type de maintenance est absent.'
            SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------    RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
            RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    -------------RETURN
        END 
    
    IF NOT @CamionVIN IS NULL
        BEGIN 
            IF  @CamionId IS NULL
                BEGIN
                    SET @ErreurTypeMaintenanceInconnu = 'Y' ;
                    SET @Engueulade = @EngueuladeIntro + 'Le type de maintenance n''est pas connu.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
                END
        END
    
    ---------------------------------------------------
    -- Contrôle de la date
    ---------------------------------------------------
    IF @CamionMilleageDate IS NULL
        BEGIN 
             SET @ErreurDateManquante = 'Y' ;
             SET @Engueulade = @EngueuladeIntro + 'La date de la maintenance est absente !'
             SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
        END
    
    ----------------------------------------------------------------
    -- Si les contrôles se sont mal passés en ce qui concerne
    -- le camion, le type de maintenance et la date, on dégage.
    ----------------------------------------------------------------
    
    IF @ErreurVINmanquant = 'Y' OR @ErreurVINinconnu = 'Y' 
       OR @ErreurTypeMaintenanceManquant = 'Y' OR @ErreurTypeMaintenanceInconnu =  'Y'
       OR @ErreurDateManquante = 'Y' 
        BEGIN 
            SELECT 'y a d''l''erreur, on dégage.'
            RETURN
        END
    
    --------------------------------------------------------------------
    -- Jusque-là, les contrôles se sont bien passés, reste
    -- le cas du kilométrage.
    --
    -- Si pour le camion et la date de maintenance proposés
    -- on a déjà une ligne dans la table CAMION_MILLEAGE, on postule que 
    -- le même jour, le camion a eu droit à plus d'une maintenance,
    -- par exemple un contrôle de l'usure des pneus et un changement
    -- de balais des essuie-glace. Dans ces conditions, le kilométrage doit
    -- être le même.
    -- On postule encore qu'à deux dates différentes, le kilométrage
    -- peut être le même, c'est à dire qu'entre temps le camion
    -- n'a pas roulé.
    --------------------------------------------------------------------
    
    ---------------------------------------------------------
    -- On regarde si table CAMION_MILLEAGE contient
    -- déjà une ligne pour le camion et la date proposés.
    ----------------------------------------------------------
    
    SET @CamionMilleageOld =
        (SELECT DISTINCT CamionMilleage
        FROM    CAMION_MILLEAGE
        WHERE   CamionId = @CamionId AND CamionMilleageDate = @CamionMilleageDate)
    
    --------------------------------------------------------------------------
    -- Si @CamionMilleageOld est marqué NULL, c'est qu'il
    -- n'existe pas dans CAMION_MILLEAGE de ligne pour le camion 
    -- et la date proposés : on effectuera donc un INSERT. 
    -- Si @CamionMilleageOld n'est pas marqué NULL, c'est qu'il
    -- existe déjà dans CAMION_MILLEAGE au moins une ligne pour
    -- le camion et la date proposés : on n'a rien à faire.
    -- Toutefois, on vérifie (2e forme normale oblige !) que le
    -- kilométrage est le même s'il est présent. 
    --------------------------------------------------------------------------
    
    IF @CamionMilleageOld IS NULL
        BEGIN
            -------------------------------------------
            -- Ici, le kilométrage doit être présent
            -------------------------------------------
    
            IF @CamionMilleage IS NULL
                BEGIN 
                     SET @ErreurMilleageManquant = 'Y' ;
                     SET @Engueulade = @EngueuladeIntro + 'Camion '''+ @CamionVIN + ''', maintenace du ' + @CamionMilleageDate
                                       + ' : le kilométrage est absent !'
                     SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------              RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                     RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
                END
            ELSE
                BEGIN
                    -------------------------------------------
                    -- On insère dans CAMION_MILLEAGE
                    -------------------------------------------
                   INSERT INTO CAMION_MILLEAGE (CamionId, CamionMilleageDate, CamionMilleage)
                        SELECT @CamionId, @CamionMilleageDate, @CamionMilleage 
                END
        END
    
    IF @CamionMilleageOld <> @CamionMilleage
        BEGIN 
            ----------------------------------------------
            -- Ici, le kilométrage est en principe omis
            -- puisqu'il est connu. Mais s'il est fourni,
            -- il doit être égal à celui qui est présent 
            -- dans la table.
            --
            -- Quoi qu'il en soit, on a ce qu'il faut 
            -- dans la table, donc on n'a rien à faire.
            -----------------------------------------------
     
            SET @ErreurMilleageInvalide = 'Y' ;
            SET @Engueulade = @EngueuladeIntro + 'Camion '''+ @CamionVIN + ''', maintenance du ' + @CamionMilleageDate 
                              + ' : le kilométrage ''' + CAST(@CamionMilleage as varchar) + ''' différe de celui déjà connu, ''' 
                              + CAST(@CamionMilleageOld as varchar) + '''.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
        END
    
    ----------------------------------------------------------------
    -- Si les contrôles se sont mal passés en ce qui concerne
    -- le kilométrage, on dégage.
    ----------------------------------------------------------------
    
    IF @ErreurMilleageManquant = 'Y' OR  @ErreurMilleageInvalide = 'Y' 
        BEGIN 
            SELECT 'y a d''l''erreur, on dégage.'
            RETURN
        END
    
    --------------------------------------------------------------------
    -- Mise à jour de la table MAINTENANCE
    --------------------------------------------------------------------
    
    INSERT INTO MAINTENANCE (CamionId, CamionMilleageId, MaintenanceTypeId) 
        SELECT @CamionId, (SELECT MAX(CamionMilleageId) FROM CAMION_MILLEAGE), @MaintenanceTypeId
    
    END
    
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  6. #786
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Et tant qu’à faire, un petit jeu d’essai :

    ----------------------------------------------------
    -- créer des maintenance pour des camions
    ----------------------------------------------------
    
    BEGIN TRANSACTION ;
    
    DELETE FROM MAINTENANCE ;
    DELETE FROM CAMION_MILLEAGE ;
    
    --/*
    -------------------------------------------------------------------------
    --  camion VIN, type de maintenance et date de maintenance manquants
    -------------------------------------------------------------------------
    INSERT INTO MAINTENANCE_V (CamionMilleage)  
        SELECT 1000 
    --*/
    
    --/*
    -------------------------------------------------------------------
    --  camion VIN, type de maintenance et kilométrage  manquants
    -------------------------------------------------------------------
    INSERT INTO MAINTENANCE_V (CamionMilleageDate)  
        SELECT '2012-09-01' 
    --*/
    
    --/*
    -----------------------------------------------------
    -- kilométrage manquant
    -----------------------------------------------------
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, MaintenanceType)  
       SELECT 'vin01', '2012-09-01', 'Wipers' 
    --*/
    
    --/*
    ------------------------------------------------------------------------
    -- le 2e insert ci-dessous : kilométrage inutile et en + incohérent
    ------------------------------------------------------------------------
    
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, CamionMilleage, MaintenanceType)  
       SELECT 'vin03', '2012-09-01', 1000, 'Wipers' 
    
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, CamionMilleage, MaintenanceType)  
       SELECT 'vin03', '2012-09-01', 1001, 'brake adjustment' 
    --*/
    
    --/*
    -------------------------------------------------------------------
    --  données correctes
    -------------------------------------------------------------------
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, CamionMilleage, MaintenanceType)  
       SELECT 'vin01', '2012-09-01', 1000, 'Wipers' 
    
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, MaintenanceType)  
       SELECT 'vin01', '2012-09-01', 'Tires wear' 
    
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, CamionMilleage, MaintenanceType)  
       SELECT 'vin02', '2012-09-01', 1100, 'Wipers' 
    
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, CamionMilleage, MaintenanceType)  
       SELECT 'vin02', '2012-10-01', 2200, 'Wipers' 
    
    INSERT INTO MAINTENANCE_V (CamionVIN, CamionMilleageDate, MaintenanceType)  
       SELECT 'vin02', '2012-10-01', 'brake adjustment' 
    
    --*/
    
    
    SELECT '' AS CAMION_MILLEAGE, * FROM CAMION_MILLEAGE ;
    SELECT '' AS MAINTENANCE, * FROM MAINTENANCE ;
    SELECT  * FROM MAINTENANCE_V
    
    ROLLBACK ;
    

    Je regarderai le trigger pour les updates et la prise en compte de l’huile des composants. Ce mardi, ophtalmo, donc je serai improductif...

    Profitez-en pour décortiquer, désosser le trigger...
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  7. #787
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Je n'avais pas prévu de faire la même maintenance 2 fois le même jour sur un même camion mais oui, c'est une chose qui peut malheureusement arriver quoique si on doit effectuer deux fois un ajustement de frein dans la même journée, il y a un un problème mécanique et une réparation devra être effectuée et mentionné dans la table Reparation…

    J'effectue les corrections dans DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST pour la table Maintenance et la création de la table TABLE CAMION_MILLEAGE ainsi que la correction de la View. Et je vole vos triggers

    Je vais passer tout ça par sur le site WEB pour faire les tests

    Merci fsmrel



    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Votre proposition de table MAINTENANCE est bien partie, mais il y a un défaut qui fera un jour ou l’autre rater un virage (cf. post #415...) : la table a pour clé primaire la paire {Maintenanceid, CamionId}, donc une fois que vous aurez changé les balais d’essuie-glace du camion C1, vous ne pourrez plus le faire par la suite pour ce malheureux camion... Pour que vous puissiez renouveler l’opération plus tard, la date devient partie prenante et vient se glisser dans la clé primaire. La structure de la table deviendrait donc celle-ci :

    CREATE TABLE MAINTENANCE
    (
            CamionId              INT             NOT NULL
          , MaintenanceDate       DATE            NOT NULL
          , MaintenanceId         INT             NOT NULL
          , MaintenanceMilleage   INT             NOT NULL
        , CONSTRAINT MAINTENANCE_PK PRIMARY KEY (CamionId, MaintenanceDate, MaintenanceId)
        , CONSTRAINT CAMION_MAINTENANCE_FK FOREIGN KEY (CamionId)
              REFERENCES (CamionId) ON DELETE CASCADE
        , CONSTRAINT CAMION_MAINTENANCE_TYPE_FK FOREIGN KEY (MaintenanceId)
              REFERENCES MAINTENANCE_TYPE (MaintenanceId)
    )
    
    Notez en passant la position des colonnes dans la clé : CamionId est en tête (performance oblige, l’élément le plus important pour les requêtes est quand même le camion (ou la date, vous me direz...)).

    Mais il y a maintenant un problème de redondance (dans les cercles, on parle de viol de la deuxième forme normale), et la redondance voilà l’ennemie. En effet, si le même jour vous effectuez N opérations sur le camion C1, vous serez obligé de répéter très exactement, mais fâcheusement, la valeur prise par MaintenanceMilleage, alors que, vous en serez d’accord, cette valeur ne dépend aucunement en fait du type maintenance (colonne MaintenanceId), ce que contredit hélas la clé primaire.

    Puisque MaintenanceId ne dépend que de la paire {CamionId, MaintenanceDate}, on normalise en séparant la table MAINTENANCE en deux, façon Salomon :

    (A) Une table, appelons-la CAMION_MILLEAGE, comportant les colonnes CamionId, MaintenanceMilleage (que j’ai renommée en CamionMilleage, mais vous n’êtes pas obligé d’en faire autant) et CamionMilleageDate. Pour la clé primaire de la table, je mets en oeuvre une colonne artificielle CamionMilleageId, tandis que la paire {CamionId, CamionMilleageDate} devient clé alternative :


    CREATE TABLE CAMION_MILLEAGE
    (
            CamionId              INT             NOT NULL
          , CamionMilleageId      INT  IDENTITY   NOT NULL
          , CamionMilleageDate    DATE            NOT NULL
          , CamionMilleage        INT             NOT NULL
        , CONSTRAINT CAMION_MILLEAGE_PK PRIMARY KEY (CamionId, CamionMilleageId)
        , CONSTRAINT CAMION_MILLEAGE_AK UNIQUE (CamionId, CamionMilleageDate)
        , CONSTRAINT CAMION_MILLEAGE_FK FOREIGN KEY (CamionId)
              REFERENCES CAMION (CamionId) ON DELETE CASCADE
    )
    

    (B) La table MAINTENANCE, débarrassée de la colonne MaintenanceMilleage, donc respectant la deuxième forme normale (et au-delà) :

    CREATE TABLE MAINTENANCE
    (
            CamionId              INT             NOT NULL
          , CamionMilleageId      INT             NOT NULL
          , MaintenanceTypeId     INT             NOT NULL
        , CONSTRAINT MAINTENANCE_PK PRIMARY KEY (CamionId, CamionMilleageId, MaintenanceTypeId)
        , CONSTRAINT CAMION_MAINTENANCE_FK FOREIGN KEY (CamionId, CamionMilleageId)
              REFERENCES CAMION_MILLEAGE (CamionId, CamionMilleageId) ON DELETE CASCADE
        , CONSTRAINT CAMION_MAINTENANCE_TYPE_FK FOREIGN KEY (MaintenanceTypeId)
              REFERENCES MAINTENANCE_TYPE (MaintenanceTypeId)
    )
    Notez que la table MAINTENANCE ne fait plus référence à la table CAMION, mais à la table CAMION_MILLEAGE.


    La structure de la vue (dont j’ai raccourci le nom, mais là encore si vous préférez un autre nom, pas de problème...) :

    CREATE VIEW MAINTENANCE_V (CamionVIN, CamionNumber, CamionMilleageDate, CamionMilleage, MaintenanceType)
    AS
    SELECT CamionVIN, CamionNumber, CamionMilleageDate, CamionMilleage, MaintenanceType
    FROM   CAMION AS x JOIN CAMION_MILLEAGE AS y on x.CamionId = y.Camionid
                       JOIN MAINTENANCE AS z ON y.Camionid = z.CamionId AND y.CamionMilleageId = z.CamionMilleageId
                       JOIN MAINTENANCE_TYPE AS t ON z.MaintenanceTypeId = t.MaintenanceTypeId
    

  8. #788
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    C'est tout un trigger hahaha Très facile à comprendre en le lisant mais cependant je suis incapable d'en créer un LoL


    Citation Envoyé par fsmrel Voir le message
    Bon, voici déjà un trigger pour les inserts dans la vue, à secouer énergiquement :

    CREATE TRIGGER MAINTENANCE_V_INSERT_TR ON MAINTENANCE_V INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @theTrigger as VARCHAR(64) = 'MAINTENANCE_V_INSERT_TR'
    DECLARE @EngueuladeIntro AS VARCHAR(128) = @theTrigger +  ' - Maintenance (insert) : ' ;
    DECLARE @Engueulade AS VARCHAR(512) ;
    DECLARE @CamionId AS INT ;
    DECLARE @CamionVIN AS VARCHAR(32) ;
    DECLARE @MaintenanceTypeId AS INT ;
    DECLARE @MaintenanceType AS VARCHAR(48) ;
    DECLARE @CamionMilleageDate AS CHAR(10) ;
    DECLARE @CamionMilleage AS INT ;
    DECLARE @CamionMilleageOld AS INT ;
    DECLARE @Erreur AS CHAR(1) ;
    DECLARE @ErreurVINmanquant AS CHAR(1) = 'N';
    DECLARE @ErreurVINinconnu AS CHAR(1) = 'N' ;
    DECLARE @ErreurTypeMaintenanceManquant AS CHAR(1) = 'N';
    DECLARE @ErreurTypeMaintenanceInconnu AS CHAR(1) = 'N' ;
    DECLARE @ErreurDateManquante AS CHAR(1) = 'N' ;
    DECLARE @ErreurDateInvalide AS CHAR(1) = 'N' ;
    DECLARE @ErreurMilleageManquant AS CHAR(1) = 'N' ;
    DECLARE @ErreurMilleageInvalide AS CHAR(1) = 'N' ;
    
    -------------------------------------------------
    -- Le camion faisant l'objet de la maintenance
    -- doit être connu dans la base de données,
    -- Même chose pour le type de maintenance;
    -- La date de la maintenance et le kilométrage
    -- doivent être fournis par Cézigue.
    ------------------------------------------------- 
    
    -------------------------------------------------------------------------------------------------
    -- Contrôles préliminaires 
    ------------------------------------------------------------------
    
    --------pour debug : -------------- SELECT @EngueuladeIntro as '@EngueuladeIntro'  ;
    -------pour debug : ------- SELECT (SELECT COUNT(*) from INSERTED) AS  'COUNT(*) from INSERTED' ;
    -------pour debug : ------- SELECT TOP 5 '' as INSERTED, * FROM INSERTED ;
    
    ----------------------------------------------------
    -- Des fois que INSERTED soit vide...
    ----------------------------------------------------
    
    IF (SELECT COUNT(*) from INSERTED) = 0
        BEGIN 
             SET @Engueulade = @EngueuladeIntro + 'VIN du camion et/ou type de maintenance manquants'
             SELECT @Engueulade AS Engueulons
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests         
             RETURN
        END
    
    ------------------------------------------------------------------------
    -- Dans cette version on n'a pas de curseur pour traiter du multi-lignes
    ------------------------------------------------------------------------
    
    IF (SELECT COUNT(*) FROM INSERTED) > 1
        BEGIN 
             SET @Engueulade = @EngueuladeIntro + 'une seule paire camion, type de mainenance à la fois SVP !'
             SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
             RETURN
        END
    
    -----------------------------------------------------
    -- INSERTED contient exactement une ligne
    -----------------------------------------------------
    
    SET @CamionVIN =  (SELECT CamionVIN FROM INSERTED) ;
    SET @CamionId =  (SELECT Camionid FROM CAMION WHERE CamionVIN = @CamionVIN) ;
    
    SET @MaintenanceType = (SELECT MaintenanceType FROM INSERTED) ;
    SET @MaintenanceTypeId = (SELECT MaintenanceTypeId FROM MAINTENANCE_TYPE WHERE MaintenanceType = @MaintenanceType) ;
    
    SET @CamionMilleageDate = (SELECT CamionMilleageDate FROM INSERTED) ;
    
    SET @CamionMilleage = (SELECT CamionMilleage FROM INSERTED) ;
    
    ---- pour debug ---- select @CamionVIN as '@CamionVIN'  
    ---- pour debug ---- select @CamionId as '@CamionId'  
    ---- pour debug ---- select @MaintenanceType as '@MaintenanceType'  
    ---- pour debug ---- select @MaintenanceTypeId as '@MaintenanceTypeId'  
    ---- pour debug ---- select @CamionMilleageDate as '@@CamionMilleageDate'  
    ---- pour debug ---- select @CamionMilleage as '@@CamionMilleage'  
    
    ------------------------------------------------
    -- contrôle du camion
    ------------------------------------------------ 
    IF @CamionVIN IS NULL
        BEGIN 
             SET @ErreurVINmanquant = 'Y' ;
             SET @Engueulade = @EngueuladeIntro + 'Le VIN du camion est absent !'
             SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
        END
    
    IF NOT @CamionVIN IS NULL
        BEGIN 
            IF  @CamionId IS NULL
                BEGIN
                    SET @ErreurVINinconnu = 'Y' ;
                    SET @Engueulade = @EngueuladeIntro + 'Le VIN du camion n''est pas connu.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
                END
        END
    
    ---------------------------------------------------
    -- Contrôle du type de maintenance
    ---------------------------------------------------
    
    iF @MaintenanceType IS NULL
        BEGIN
            SET @ErreurTypeMaintenanceManquant = 'Y' ;
            SET @Engueulade = @EngueuladeIntro + 'Le type de maintenance est absent.'
            SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------    RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
            RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    -------------RETURN
        END 
    
    IF NOT @CamionVIN IS NULL
        BEGIN 
            IF  @CamionId IS NULL
                BEGIN
                    SET @ErreurTypeMaintenanceInconnu = 'Y' ;
                    SET @Engueulade = @EngueuladeIntro + 'Le type de maintenance n''est pas connu.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
                END
        END
    
    ---------------------------------------------------
    -- Contrôle de la date
    ---------------------------------------------------
    IF @CamionMilleageDate IS NULL
        BEGIN 
             SET @ErreurDateManquante = 'Y' ;
             SET @Engueulade = @EngueuladeIntro + 'La date de la maintenance est absente !'
             SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
        END
    
    ----------------------------------------------------------------
    -- Si les contrôles se sont mal passés en ce qui concerne
    -- le camion, le type de maintenance et la date, on dégage.
    ----------------------------------------------------------------
    
    IF @ErreurVINmanquant = 'Y' OR @ErreurVINinconnu = 'Y' 
       OR @ErreurTypeMaintenanceManquant = 'Y' OR @ErreurTypeMaintenanceInconnu =  'Y'
       OR @ErreurDateManquante = 'Y' 
        BEGIN 
            SELECT 'y a d''l''erreur, on dégage.'
            RETURN
        END
    
    --------------------------------------------------------------------
    -- Jusque-là, les contrôles se sont bien passés, reste
    -- le cas du kilométrage.
    --
    -- Si pour le camion et la date de maintenance proposés
    -- on a déjà une ligne dans la table CAMION_MILLEAGE, on postule que 
    -- le même jour, le camion a eu droit à plus d'une maintenance,
    -- par exemple un contrôle de l'usure des pneus et un changement
    -- de balais des essuie-glace. Dans ces conditions, le kilométrage doit
    -- être le même.
    -- On postule encore qu'à deux dates différentes, le kilométrage
    -- peut être le même, c'est à dire qu'entre temps le camion
    -- n'a pas roulé.
    --------------------------------------------------------------------
    
    ---------------------------------------------------------
    -- On regarde si table CAMION_MILLEAGE contient
    -- déjà une ligne pour le camion et la date proposés.
    ----------------------------------------------------------
    
    SET @CamionMilleageOld =
        (SELECT DISTINCT CamionMilleage
        FROM    CAMION_MILLEAGE
        WHERE   CamionId = @CamionId AND CamionMilleageDate = @CamionMilleageDate)
    
    --------------------------------------------------------------------------
    -- Si @CamionMilleageOld est marqué NULL, c'est qu'il
    -- n'existe pas dans CAMION_MILLEAGE de ligne pour le camion 
    -- et la date proposés : on effectuera donc un INSERT. 
    -- Si @CamionMilleageOld n'est pas marqué NULL, c'est qu'il
    -- existe déjà dans CAMION_MILLEAGE au moins une ligne pour
    -- le camion et la date proposés : on n'a rien à faire.
    -- Toutefois, on vérifie (2e forme normale oblige !) que le
    -- kilométrage est le même s'il est présent. 
    --------------------------------------------------------------------------
    
    IF @CamionMilleageOld IS NULL
        BEGIN
            -------------------------------------------
            -- Ici, le kilométrage doit être présent
            -------------------------------------------
    
            IF @CamionMilleage IS NULL
                BEGIN 
                     SET @ErreurMilleageManquant = 'Y' ;
                     SET @Engueulade = @EngueuladeIntro + 'Camion '''+ @CamionVIN + ''', maintenace du ' + @CamionMilleageDate
                                       + ' : le kilométrage est absent !'
                     SELECT TOP 5  @Engueulade AS Engueulons, * FROM INSERTED
     --------              RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                     RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
                END
            ELSE
                BEGIN
                    -------------------------------------------
                    -- On insère dans CAMION_MILLEAGE
                    -------------------------------------------
                   INSERT INTO CAMION_MILLEAGE (CamionId, CamionMilleageDate, CamionMilleage)
                        SELECT @CamionId, @CamionMilleageDate, @CamionMilleage 
                END
        END
    
    IF @CamionMilleageOld <> @CamionMilleage
        BEGIN 
            ----------------------------------------------
            -- Ici, le kilométrage est en principe omis
            -- puisqu'il est connu. Mais s'il est fourni,
            -- il doit être égal à celui qui est présent 
            -- dans la table.
            --
            -- Quoi qu'il en soit, on a ce qu'il faut 
            -- dans la table, donc on n'a rien à faire.
            -----------------------------------------------
     
            SET @ErreurMilleageInvalide = 'Y' ;
            SET @Engueulade = @EngueuladeIntro + 'Camion '''+ @CamionVIN + ''', maintenance du ' + @CamionMilleageDate 
                              + ' : le kilométrage ''' + CAST(@CamionMilleage as varchar) + ''' différe de celui déjà connu, ''' 
                              + CAST(@CamionMilleageOld as varchar) + '''.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
    --------------         RETURN
        END
    
    ----------------------------------------------------------------
    -- Si les contrôles se sont mal passés en ce qui concerne
    -- le kilométrage, on dégage.
    ----------------------------------------------------------------
    
    IF @ErreurMilleageManquant = 'Y' OR  @ErreurMilleageInvalide = 'Y' 
        BEGIN 
            SELECT 'y a d''l''erreur, on dégage.'
            RETURN
        END
    
    --------------------------------------------------------------------
    -- Mise à jour de la table MAINTENANCE
    --------------------------------------------------------------------
    
    INSERT INTO MAINTENANCE (CamionId, CamionMilleageId, MaintenanceTypeId) 
        SELECT @CamionId, (SELECT MAX(CamionMilleageId) FROM CAMION_MILLEAGE), @MaintenanceTypeId
    
    END
    

  9. #789
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Vous coûtez cher en wiper, j'espère que vous adoptez une conduite permettant d'économiser sur le gasoil pour compenser.

    Je vais être un peu occupé cette semaine car j'ai une transmission à réparer sur un loader (Chargeur sur roues)… Une petite bestiole de 30000 LBS...

  10. #790
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Ça fonctionne excepté que je veux être capable de d'insérer plusieurs MaintenanceType en une seule passe avec un combo box multiselect. Ce n'est pas très productif d'ouvrir le même formulaire 3 ou 4 fois pour le même camion lors d'une seule visite pour une maintenance… Disons dans le combo box multiselect l'utilisateur devrait pouvoir choisir Wiper, Grease et Brake Adjustment sur le même formulaire… J'ai créé le combo box multiselect sur le site WEB par contre nous devons pour l'instant ne choisir qu'un seul MaintenanceType à la fois.

  11. #791
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Bonne visite chez l'ophtalmo. Prenez soin de vous et prenez quelques jours de congés de cette base de données .

  12. #792
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Oups, On a pas de Triggers dans CAMION_HUILE_V

  13. #793
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Le Trigger Update de AXLE_AFFECTATION_CAMION ne fonctionne pas


  14. #794
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Bonjour Ordigil,


    Citation Envoyé par ordigil Voir le message
    Le Trigger Update de AXLE_AFFECTATION_CAMION ne fonctionne pas
    Plus précisément ?

    Bon, en attendant j’en avais un autre en réserve, et j’ai mis à jour DZINDZIO_TRUCKS_MANAGEMENT_TEMP en conséquence. Vous me direz si c’est mieux, pire ou pareil...
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  15. #795
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Merci, je l'essaie sur le champs



    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Plus précisément ?

    Bon, en attendant j’en avais un autre en réserve, et j’ai mis à jour DZINDZIO_TRUCKS_MANAGEMENT_TEMP en conséquence. Vous me direz si c’est mieux, pire ou pareil...

  16. #796
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Bonjour fsmrel


    Le nouveau trigger fonctionne pour les updates


    L'ancien trigger, il ne trouvait pas le Camion il me semble,,,


    Vous pouvez essayer le site WEB en avec la même adresse et les mêmes logins que la dernière fois

    La base de données commence vraiment à ressembler à ce qu'elle doit servir Mais tellement compliquée à concevoir Je n'aurais jamais été capable d'y arriver sans votre aide. Par contre avec le site WEB ça devient de plus en plus facile de s'y retrouver. Je pense que l'utilisateur final n'aura pas trop de difficulté à gérer ses camions avec le site WEB…. Mais je suis certain qu'on parviendra à créer une vue spécialement conçue pour l'insertion des nouveaux camions sans passer par 9 formulaires Une seule vue qui permettrait de créer le Camion, le Moteur, la Transmission, les Essieux et les Différentiels donc tous les composants seraient créés sur le même formulaire et on clic save et BINGO… Toutes les dates d'achat et d'installation des composants seraient celles de la fabrication et de l'achat du nouveau Camion. Mais pour l'instant le plus important c'est de mettre en oeuvre Maintenance et Repair. Dans MAINTENANCE on pourrait ajouter une colonne MaintenanceDetail ou MainteanceNote qui permettrait d'être plus spécifique Example :ClutchOilLevel, on pourrait détailler en Disant Ok aucun problème ou Ajouté un peu d'huile , pour CoolantLevel on pourrait écrire Ok, pas de problème ou Manquait 4 littres ou Légère fuite… L'utilisateur déciderait par lui-même ce qu'il écrirait… Peut-être même que l'idéal serait de créer 2 colonnes du genre MaintenanceNote1 et MaintenanceNote2...


    Dites-moi s'il y a des vues particulières que vous aimeriez que je rajoute sur le site WEB. J'essaie de ne conserver que les vues essentielles mais s'il y en a que vous voudriez voir apparaitre je les ajouterai.

    Encore un gros merci fsmrel d'être là à m'aider après toutes ces semaines.

    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Plus précisément ?

    Bon, en attendant j’en avais un autre en réserve, et j’ai mis à jour DZINDZIO_TRUCKS_MANAGEMENT_TEMP en conséquence. Vous me direz si c’est mieux, pire ou pareil...

  17. #797
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Vous savez fsmrel avec la majorité des produits développés pour un corps de métier, ça demande un certain temps de formation et d'adaptation car les produits sont des adaptations d'autres produits. À chaque fois que je visite un vendeur de pièces ou un concessionnaire, il y a toujours un problème, soit l'utilisateur à fait une erreur et il ne sait pas comment corriger l'erreur, soit l'usager ne trouve pas une fonction cachée mal documentée, soit une fonction est manquante, etc... Ce que vous faites, bien que le fonctionnement de la base de données brute est très loin de la façon de raisonner d'un vendeur ou d'un mécanicien, le résultat final lui, en passant par le site WEB, il fonctionne presque de la même façon que l'utilisateur raisonne. Lorsque tout sera terminé et fonctionnel, je suis convaincu que l'utilisateur va faire le tour des vendeurs de pièces et des concessionnaires et il va leur montrer sur son iPhone tout ce qu'il peut faire à distance avec cette base de données… Il va être vraiment très fier. Peu importe où il sera dans le monde, il pourra consulter la base de données avec une tablette, un cellulaire ou un Laptop et si voir la maintenance des camions a été effectuée. Il n'aura plus besoin de se promener avec des morceaux de papier pour les numéros de série, il va les avoir dans le creux de sa main 24 heures par jour. Pour l'instant, il n'est même pas intéressé par ce que nous faisons mais lorsque tout sera terminé et fonctionnel, je lui expliquerai ce que votre dur labeur permet de faire avec cette base de données et là, il va être stupéfait…, il va le montrer à tout le monde.


  18. #798
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2018
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2018
    Messages : 514
    Points : 256
    Points
    256

    Par défaut

    Bonjour fsmrel

    Si vous exécutez ceci vous remarquerez que nous avons un genre de petit problème !!!



    USE DZINDZIO_TRUCKS_MANAGEMENT_TEMP
    
    GO
    
    SELECT * FROM MOTEUR_AFFECTATION_CAMION ;
    SELECT * FROM CAMION_MOTEUR_V ; 
    SELECT * FROM CAMION_COMPOSITION_V2 ;
    

  19. #799
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Bonjour Ordigil,


    Citation Envoyé par ordigil Voir le message
    Si vous exécutez ceci vous remarquerez que nous avons un genre de petit problème !!!
    USE DZINDZIO_TRUCKS_MANAGEMENT_TEMP
    
    GO
    
    SELECT * FROM MOTEUR_AFFECTATION_CAMION ;
    SELECT * FROM CAMION_MOTEUR_V ; 
    SELECT * FROM CAMION_COMPOSITION_V2 ;
    
    Quel petit problème ? Après ma séance ophtalmo, je vois mal, mais je ne relève pas de problème de bilocation. Certes les camions tels post#156, post#414 sont souvent dépourvus de moteur, de transmission, voire d’essieux, mais ils servent à des tests portant sur les différentiels et leurs relations avec leur essieu.

    S’il y a quelque chose d’important, par exemple des contradictions, merci de les mettre en évidence...
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

  20. #800
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 544
    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 : 6 544
    Points : 23 036
    Points
    23 036
    Billets dans le blog
    16

    Par défaut

    Citation Envoyé par ordigil Voir le message
    Oups, On a pas de Triggers dans CAMION_HUILE_V
    Ça viendra... Je n’ai qu’une tête, deux bras, pas toujours deux yeux en état de marche, bref, humainement et métaphoriquement je suis qu’un old tandem dont la maintenance des phares (et des essuie-glace...) n’est pas négliger...

    Rappelez-moi quand même de temps en temps ce manque qu’il faudra combler...

    Par ailleurs, je dois réfléchir à l’harmonisation de CAMION_HUILE avec CAMION_MILLEAGE et MAINTENANCE, ne serait-ce qu’ajouter un attribut du genre HuileChangementId pour être en phase avec CamionMilleageId.
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)

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

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, 16h32
  2. Création table et relations
    Par ptitdragon_eric dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/09/2005, 14h37
  3. table de relation
    Par tanjonaravelson dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/06/2005, 19h20
  4. Table de relation et sélection via jointure
    Par 73672 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 09/11/2004, 10h33
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 16h16

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