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. #801
    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
    Ça fonctionne excepté que je veux être capable de d'insérer plusieurs MaintenanceType en une seule passe avec un combo box multiselect.
    Ça m’embarque dans une sordide histoire de curseurs...

    Je vais regarder ce que je peux faire, mais ça peut prendre un peu de temps...
    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

  2. #802
    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

    Nous avons 3 Camions qui ont le même moteur. Camion vin01, vin02 et vin03 ont tous le moteur numéro de séries01. Si les moteurs ont été désinstallés des camions comme on le voit dans MOTEUR_AFFECTATION_CAMION, ils ne doivent pas apparaitre dans CAMION_MOTEUR_V et dans CAMION_COMPOSITION_V2.


    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,




    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...

  3. #803
    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

    Ok, si c'est trop compliqué, on ne le fait pas… Pour l'instant on s'arrange pour que tout fonctionne. Si plus tard cet hiver ou au printemps vous voulez vous amuser à le faire, vous aurez amplement de temps.


    Citation Envoyé par fsmrel Voir le message
    Ça m’embarque dans une sordide histoire de curseurs...

    Je vais regarder ce que je peux faire, mais ça peut prendre un peu de temps...

  4. #804
    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 regarde tous vos triggers et je m'amuse à essayer d'en créer mais je n'y arrive pas . Mais je persévère


    Citation Envoyé par fsmrel Voir le message
    Ç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.

  5. #805
    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
    Nous avons 3 Camions qui ont le même moteur. Camion vin01, vin02 et vin03 ont tous le moteur numéro de séries01. Si les moteurs ont été désinstallés des camions comme on le voit dans MOTEUR_AFFECTATION_CAMION, ils ne doivent pas apparaitre dans CAMION_MOTEUR_V et dans CAMION_COMPOSITION_V2.
    Jawohl !

    J’ai mis en oeuvre une vue CAMION_MOTEUR_V2 qui est une restriction de CAMION_MOTEUR_V et qui permet de ne conserver que la dernière affectation d’un moteur donné :

    CREATE VIEW CAMION_MOTEUR_V2 (CamionVIN, CamionNumber, MoteurNumeroSerie, MoteurInstallationDate) 
    AS
    WITH t1 AS (
                 SELECT MoteurNumeroSerie, MAX(MoteurInstallationDate) AS MoteurInstallationDate 
                 FROM CAMION_MOTEUR_V GROUP BY MoteurNumeroSerie
               )
        SELECT CamionVIN, CamionNumber, t1.MoteurNumeroSerie, t1.MoteurInstallationDate 
        FROM   t1 JOIN MOTEUR AS y ON t1.MoteurNumeroSerie = y.MoteurNumeroSerie
                  JOIN  COMPOSANT_AFFECTATION AS z ON y.ComposantId = z.ComposantId 
                        AND t1.MoteurInstallationDate = z.ComposantInstallationDate
                  JOIN CAMION AS t ON z.LocalisationId = t.CamionId
    
    Toutes choses égales, j’ai mis aussi en oeuvre une vue CAMION_TRANSMISSION_V2 qui est une restriction de CAMION_TRANSMISSION_V et qui permet de ne conserver que la dernière affectation d’une transmission donnée.

    Ainsi, CAMION_COMPOSITION_V2 fait désormais référence à ces nouvelles vues en remplacement des anciennes.

    Je n’ai rien fait pour les essieux et les différentiels. Merci de tester.

    Je fonce dans ma musique, je vais être en retard...
    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. #806
    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

    WAHOOOOOO C'est parfait avec cette vue

    Merci fsmrel

    Lorsque je dis qu'il y a des choses qui ne fonctionnent pas, il n'y a pas urgence… Ça me permet de faire des recherches et de me creuser la tête. Je repasse toujours en revue pour essayer de trouver des failles dans les triggers ou des incohérences dans les résultats… C'est passionnant les bases de données avec vous…


    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Jawohl !

    J’ai mis en oeuvre une vue CAMION_MOTEUR_V2 qui est une restriction de CAMION_MOTEUR_V et qui permet de ne conserver que la dernière affectation d’un moteur donné :

    CREATE VIEW CAMION_MOTEUR_V2 (CamionVIN, CamionNumber, MoteurNumeroSerie, MoteurInstallationDate) 
    AS
    WITH t1 AS (
                 SELECT MoteurNumeroSerie, MAX(MoteurInstallationDate) AS MoteurInstallationDate 
                 FROM CAMION_MOTEUR_V GROUP BY MoteurNumeroSerie
               )
        SELECT CamionVIN, CamionNumber, t1.MoteurNumeroSerie, t1.MoteurInstallationDate 
        FROM   t1 JOIN MOTEUR AS y ON t1.MoteurNumeroSerie = y.MoteurNumeroSerie
                  JOIN  COMPOSANT_AFFECTATION AS z ON y.ComposantId = z.ComposantId 
                        AND t1.MoteurInstallationDate = z.ComposantInstallationDate
                  JOIN CAMION AS t ON z.LocalisationId = t.CamionId
    
    Toutes choses égales, j’ai mis aussi en oeuvre une vue CAMION_TRANSMISSION_V2 qui est une restriction de CAMION_TRANSMISSION_V et qui permet de ne conserver que la dernière affectation d’une transmission donnée.

    Ainsi, CAMION_COMPOSITION_V2 fait désormais référence à ces nouvelles vues en remplacement des anciennes.

    Je n’ai rien fait pour les essieux et les différentiels. Merci de tester.

    Je fonce dans ma musique, je vais être en retard...

  7. #807
    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

    J'ai ça pour l'instant. Puisque je ne fais pas de changement d'huile sur les Camions sans moteur et que c'est plus facile de gérer les Camions par leur 'CamionNumber' que par leur 'CamionVIN', j'entre uniquement 'CamionNumber', 'HuileDateChangement' et Kilométrage pour les insertions dans CAMION_HUILE_V. Pas besoin d'entrer 'MoteurNumeroSerie' non plus, le trigger le trouve par lui-même...
    Mais peut-être que ce n'est pas la façon de faire

    
    USE [DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST]
    GO
    /****** Object:  Trigger [dbo].[CAMION_HUILE_V_INSERT_TR]    Script Date: 2018-12-07 01:59:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    --------------------------------------------------------------------------
    ------ INSERT dans HUILE_CHANGEMENT à partir de CAMION_HUILE_V -----------
    --------------------------------------------------------------------------
    
    ALTER TRIGGER [dbo].[CAMION_HUILE_V_INSERT_TR]
    ON [dbo].[CAMION_HUILE_V]
    INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @LocalisationId AS INT ;
    DECLARE @CamionId AS INT ;
    DECLARE @ComposantId AS INT ;
    
    ---SET @LocalisationId = ( SELECT CamionId FROM CAMION AS x WHERE EXISTS ( SELECT '' FROM INSERTED AS u WHERE x.CamionVIN = u.CamionVIN )) ;
    
    SET @CamionId =
                        (
                         SELECT CamionId
                         FROM CAMION
                         AS x WHERE EXISTS
                        (SELECT '' FROM INSERTED
                         AS u WHERE (x.CamionNumber = u.CamionNumber
                      )))
    ;
    
    SET @LocalisationId = @CamionId
    ;
    
    SET @ComposantId = 
                       (
                        SELECT COMPOSANT.ComposantId
                          FROM COMPOSANT
                     FULL JOIN COMPOSANT_AFFECTATION
                            ON COMPOSANT.ComposantId = COMPOSANT_AFFECTATION.ComposantId
                         WHERE COMPOSANT.ComposantType = 'e' AND
                               COMPOSANT_AFFECTATION.LocalisationId = @LocalisationId AND
                               COMPOSANT_AFFECTATION.ComposantDesInstallationDate = '9999-12-31'
                       )
    ;
    
    INSERT INTO HUILE_CHANGEMENT
                      (
                       ComposantId
                     , HuileDateChangement
                     , HuileKm
                      )
    
    SELECT   @ComposantId
            , COALESCE(HuileDateChangement, CAST('9999-12-31' as DATE))
            , COALESCE(Kilométrage, 0)   -- attention à la division par zéro...
    FROM INSERTED
    ;
    END
    
    

    
    USE [DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST]
    GO
    BEGIN TRANSACTION
    
    INSERT INTO [dbo].[CAMION_HUILE_V]
    
               ([CamionNumber]
               ,[HuileDateChangement]
               ,[Kilométrage])
    
         VALUES 
               ('2540'
               ,'2016-12-05'
               ,102934)
    GO
    
    SELECT * FROM CAMION_HUILE_V ;
    
    ROLLBACK
    
    

  8. #808
    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 fait jolie, ça commence à ressembler à une base de données
    Encore merci fmrel

    Nom : PHOTO SCHEMA BASE DONNÉES.JPG
Affichages : 23
Taille : 157,4 Ko

  9. #809
    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,


    Trigger MOTEUR_HUILE_V_INSERT_TR :

    Bel effort !

    J’ai modifié l’affectation de @ComposantId. En effet, la jointure entre COMPOSANT_AFFECTATION et COMPOSANT fait intervenir le test ComposantType = 'e', mais il préférable d’éviter de manipuler des constantes quand c'est possible (je ne parle pas de l'incontournable '9999-12-31'...) Il vaut mieux faire la jointure entre COMPOSANT_AFFECTATION et MOTEUR.


    SET @ComposantId = (
                        SELECT x.ComposantId
                        FROM   MOTEUR as x JOIN COMPOSANT_AFFECTATION AS y ON x.ComposantId = y.ComposantId
                        WHERE  y.LocalisationId = @CamionId
                        AND    ComposantDesInstallationDate = '9999-12-31'  
                       )
    ;
    

    La déclaration d’une variable @LocalisationId est inutile, la variable @CamionId suffit.

    HuileDateChangement a été renommée en HuileChangementDate.

    Remplacer kilométrage par Kilometrage (voire Milleage ), car SQL n’aime pas toujours nos accents...

    Le bonhomme Null ayant la fâcheuse tendance à s’immiscer, j’ai ajouté le contrôle d’existence du camion et du moteur, avec les engueulades ad-hoc.


    Ma proposition :

    CREATE TRIGGER MOTEUR_HUILE_V_INSERT_TR ON MOTEUR_HUILE_V INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @CamionId AS INT ;
    DECLARE @ComposantId AS INT ;
    DECLARE @Engueulade as VARCHAR(256)
    
    --------------------------------------------------------
    -- Au moins et plus une ligne dans INSERTED
    -- (les traitement ensemblistes peuvent en effet
    -- donner lieu à un nombre de lignes quelconque).
    --------------------------------------------------------
    
    IF (SELECT COUNT(*) from INSERTED) <> 1
        BEGIN 
             SET @Engueulade = 'Affectation de composant(s) : au moins et au plus un camion SVP.'
             SELECT @Engueulade AS Engueulons
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
             RETURN
        END
    
    ---SET @LocalisationId = ( SELECT CamionId FROM CAMION AS x WHERE EXISTS ( SELECT '' FROM INSERTED AS u WHERE x.CamionVIN = u.CamionVIN )) ;
    
    -------------------------------------------
    -- Détermination du CamionId à partir du
    -- camion number passé par Cézigue
    -------------------------------------------
    
    SET @CamionId =
                    (
                     SELECT CamionId
                     FROM   CAMION AS x
                     WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.CamionNumber = u.CamionNumber
                                  )
                    )
    ;
    
    IF @CamionId IS NULL
        BEGIN
    	       SET @Engueulade = 'MOTEUR_HUILE_V_INSERT_TR - Camion inconnu'
            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
    ;
    
    --------------------------------------------
    -- Détermination du moteur actuel
    --------------------------------------------
    
    SET @ComposantId = (
                        SELECT x.ComposantId
                        FROM   MOTEUR as x JOIN COMPOSANT_AFFECTATION AS y ON x.ComposantId = y.ComposantId
                        WHERE  y.LocalisationId = @CamionId
                        AND    ComposantDesInstallationDate = '9999-12-31'  
                       )
    ;
    
    IF @ComposantId IS NULL
        BEGIN
    	       SET @Engueulade = 'MOTEUR_HUILE_V_INSERT_TR - Camion dont le moteur 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
    
    ----------------------------------------------
    -- Ça roule
    ----------------------------------------------
    
    INSERT INTO HUILE_CHANGEMENT
                      (
                       ComposantId
                     , HuileChangementDate
                     , HuileKm
                      )
    
    SELECT   @ComposantId
            , COALESCE(HuileChangementDate, CAST('9999-12-31' as DATE))
            , COALESCE(Kilometrage, 0)   -- attention à la division par zéro...
    FROM INSERTED
    ;
    END
    
    Merci de tester...
    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

  10. #810
    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
    ça commence à ressembler à une base de données.
    Exact. C'est la partie émergée de l'iceberg

    Il faudra qu’un de ces jours on prenne la peine de faire maigrir la table CAMION (suppression des colonnes mortes FRGAWR à REARGAWR).
    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

  11. #811
    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 ne voulais pas mettre de contrainte pour l'instant car tout ça va changer…. Nous n'aurons pas une vue pour Changement d'huile Moteur, une autre pour Transmission et une autre pour Differential alors que l'on peut sélectionner 'e' , 't', 'a' qui remplaceraient le 'e' que j'avais mis implicitement pour l'instant….




    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Trigger MOTEUR_HUILE_V_INSERT_TR :

    Bel effort !

    J’ai modifié l’affectation de @ComposantId. En effet, la jointure entre COMPOSANT_AFFECTATION et COMPOSANT fait intervenir le test ComposantType = 'e', mais il préférable d’éviter de manipuler des constantes quand c'est possible (je ne parle pas de l'incontournable '9999-12-31'...) Il vaut mieux faire la jointure entre COMPOSANT_AFFECTATION et MOTEUR.


    SET @ComposantId = (
                        SELECT x.ComposantId
                        FROM   MOTEUR as x JOIN COMPOSANT_AFFECTATION AS y ON x.ComposantId = y.ComposantId
                        WHERE  y.LocalisationId = @CamionId
                        AND    ComposantDesInstallationDate = '9999-12-31'  
                       )
    ;
    

    La déclaration d’une variable @LocalisationId est inutile, la variable @CamionId suffit.

    HuileDateChangement a été renommée en HuileChangementDate.

    Remplacer kilométrage par Kilometrage (voire Milleage ), car SQL n’aime pas toujours nos accents...

    Le bonhomme Null ayant la fâcheuse tendance à s’immiscer, j’ai ajouté le contrôle d’existence du camion et du moteur, avec les engueulades ad-hoc.


    Ma proposition :

    CREATE TRIGGER MOTEUR_HUILE_V_INSERT_TR ON MOTEUR_HUILE_V INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @CamionId AS INT ;
    DECLARE @ComposantId AS INT ;
    DECLARE @Engueulade as VARCHAR(256)
    
    --------------------------------------------------------
    -- Au moins et plus une ligne dans INSERTED
    -- (les traitement ensemblistes peuvent en effet
    -- donner lieu à un nombre de lignes quelconque).
    --------------------------------------------------------
    
    IF (SELECT COUNT(*) from INSERTED) <> 1
        BEGIN 
             SET @Engueulade = 'Affectation de composant(s) : au moins et au plus un camion SVP.'
             SELECT @Engueulade AS Engueulons
     --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
             RETURN
        END
    
    ---SET @LocalisationId = ( SELECT CamionId FROM CAMION AS x WHERE EXISTS ( SELECT '' FROM INSERTED AS u WHERE x.CamionVIN = u.CamionVIN )) ;
    
    -------------------------------------------
    -- Détermination du CamionId à partir du
    -- camion number passé par Cézigue
    -------------------------------------------
    
    SET @CamionId =
                    (
                     SELECT CamionId
                     FROM   CAMION AS x
                     WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.CamionNumber = u.CamionNumber
                                  )
                    )
    ;
    
    IF @CamionId IS NULL
        BEGIN
    	       SET @Engueulade = 'MOTEUR_HUILE_V_INSERT_TR - Camion inconnu'
            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
    ;
    
    --------------------------------------------
    -- Détermination du moteur actuel
    --------------------------------------------
    
    SET @ComposantId = (
                        SELECT x.ComposantId
                        FROM   MOTEUR as x JOIN COMPOSANT_AFFECTATION AS y ON x.ComposantId = y.ComposantId
                        WHERE  y.LocalisationId = @CamionId
                        AND    ComposantDesInstallationDate = '9999-12-31'  
                       )
    ;
    
    IF @ComposantId IS NULL
        BEGIN
    	       SET @Engueulade = 'MOTEUR_HUILE_V_INSERT_TR - Camion dont le moteur 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
    
    ----------------------------------------------
    -- Ça roule
    ----------------------------------------------
    
    INSERT INTO HUILE_CHANGEMENT
                      (
                       ComposantId
                     , HuileChangementDate
                     , HuileKm
                      )
    
    SELECT   @ComposantId
            , COALESCE(HuileChangementDate, CAST('9999-12-31' as DATE))
            , COALESCE(Kilometrage, 0)   -- attention à la division par zéro...
    FROM INSERTED
    ;
    END
    
    Merci de tester...

  12. #812
    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

    Oui, ça c'est évident mais pour l'instant j'essaye de ne rien changer pour ne pas que vous ayez à vous casser la tête… Ce qui fonctionne je n'y touche pas, on fera le maquillage plus tard… Normalement je n'utilise jamais de mots ou de termes en français pour le coté technique.
    Ça évite bien des erreurs. La traduction dans une autre langue peut se faire aisément sur les formulaires…

    Milleage est le terme que j'utiliserais…. Là c'est l'enfer de travailler moitié français moitié anglais...

    Citation Envoyé par fsmrel
    Remplacer kilométrage par Kilometrage (voire Milleage ).

  13. #813
    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 affichez ça :

    Nom : Moteur huile change 1.JPG
Affichages : 29
Taille : 28,8 Ko

    Alors que j'affiche ça :

    Nom : moteur huile change 2.JPG
Affichages : 28
Taille : 67,1 Ko

    Par contre, le résultat final que nous voulons est une vue TruckOilChange comme ça :



    Nom : TruckOilChange2.jpg
Affichages : 36
Taille : 296,9 Ko

  14. #814
    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
    J'ai ça pour l'instant. Puisque je ne fais pas de changement d'huile sur les Camions sans moteur et que c'est plus facile de gérer les Camions par leur 'CamionNumber' que par leur 'CamionVIN', j'entre uniquement 'CamionNumber', 'HuileDateChangement' et Kilométrage pour les insertions dans CAMION_HUILE_V. Pas besoin d'entrer 'MoteurNumeroSerie' non plus, le trigger le trouve par lui-même…
    =>

    J’ai interprété le besoin comme ne concernant que les moteurs. La vue CAMION_HUILE_V est donc conforme au besoin, mais à renommer en MOTEUR_HUILE_V.



    Citation Envoyé par ordigil Voir le message
    Vous affichez ça
    Nom : Moteur huile change 1.JPG
Affichages : 29
Taille : 28,8 Ko
    Avec la vue CAMION_HUILE_V (à renommer en MOTEUR_HUILE_V) c’est la conséquence de ce qui précède.

    Je vous concocterai la vue correspondant à votre souhait, mais ça prendra un peu de temps, car il va falloir que je me fabrique un jeu d’essai en phase pour la table CAMION_MILLEAGE, avec en plus la prise en compte des différentiels. On ne traite pas des essieux ?

    Avec les casseurs mêlés aux gilets jaunes, ça craint pour ce samedi, ça va castagner...
    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. #815
    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,


    Dans la vue que vous désirez voir mettre en oeuvre, vous faites figurer le kilométrage des camions à côté du kilométrage de chacun de leurs composants et de la date D du changement d’huile de ces derniers. Je suppose que pour chaque date D, l’utilisateur aura fourni le kilométrage K du camion C à cette date D.

    Sinon, si par exemple dans la table CAMION_MILLEAGE le dernier relevé du kilométrage du camion C est daté du 8 décembre 2018 (suite à changement des balais d’essuie-glace et vérification de la pression des pneus), et indique 75000 km, et si ensuite C a effectué un parcours de 3000 km entre le 10 décembre et le 12 décembre 2018, et si on effectue un changement d’huile du moteur le 14 décembre 2018, je suppose que pour être pertinent, le kilométrage affiché dans la vue devrait être de 78000 km, donc que l’utilisateur aura mis à jour la table CAMION_MILLEAGE en conséquence.

    Pour le moment, je pars du principe que si la table CAMION_MILLEAGE ne contient pas de ligne pour C avec HuileChangementDate = '2018-12-14', alors dans la vue on affichera '??' pour le kilométrage du camion.

    Quelle est votre position sur ce point ?
    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

  16. #816
    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, nous aurons donc Une vue ENGINE_OIL_CHANGE, une vue TRANSMISSION_OIL_CHANGE et une vue AXLE_OIL_CHANGE. On ne fera pas de vue DIFFERENTIEL_OIL_CHANGE car il est évident que si je change l'huile des essieux, l'huile des différentiels est par le fait même elle aussi changée. On dit : 'Change d'huile des Différentiels' et non : 'Changement d'huile des Essieux' mais pour la conception de la base de données, il est plus facile d'utiliser les essieux que les différentiels. Avez-vous visité mon site WEB ? Si vous allez sur le site WEB vous verrez l'affichage de 'Engine Oil Change' dans l'onglet 'Maintenance'

    Ne faites pas de vue reliant Maintenance et les changements d'huile. Ce n'est pas nécessaire et ça vous sauvera beaucoup de travail…. Les changements d'huile des composants seront regroupés dans l'onglet Maintenance sur le site WEB de toute façon. J'ai commencé à développer 'DZINDZIO_TRUCKS_MANAGEMENT_GIL_TEST' en ce sens. J'inclus la vue de ENGINE_OIL_CHANGE

    j'ai modifié votre vue 'MOTEUR_HUILE_V' pour corresponde au besoin de l'utilisateur.

    Nom : moteur huile change 2.JPG
Affichages : 23
Taille : 67,1 Ko


    Citation Envoyé par fsmrel Voir le message
    =>

    J’ai interprété le besoin comme ne concernant que les moteurs. La vue CAMION_HUILE_V est donc conforme au besoin, mais à renommer en MOTEUR_HUILE_V.





    Avec la vue CAMION_HUILE_V (à renommer en MOTEUR_HUILE_V) c’est la conséquence de ce qui précède.

    Je vous concocterai la vue correspondant à votre souhait, mais ça prendra un peu de temps, car il va falloir que je me fabrique un jeu d’essai en phase pour la table CAMION_MILLEAGE, avec en plus la prise en compte des différentiels. On ne traite pas des essieux ?

    Avec les casseurs mêlés aux gilets jaunes, ça craint pour ce samedi, ça va castagner...

  17. #817
    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

    Ne faites pas de vue liaison entre Maintenance et les Changements d'huile, ce n'est pas nécessaire…. Par contre pour une date donnée, il faut garder une logique. Si le 8 décembre 2018, je fais un changement d'huile sur le Camion '2540' dans la vue 'ENGINE_OIL_CHANGE' et que le 9 décembre 2018, je change un balai d'essuie-glace dans la vue Maintenance, le Milleage du 9 décembre doit logiquement être égal ou supérieur au 8 décembre (Égal dans le cas où le camion serait resté dans la cour sans bouger entre le 8 décembre et le 9 décembre. Mais le millage du 9 décembre ne pourra pas logiquement être inférieur au 8 décembre…. Oui, pour chaque date D, l’utilisateur aura fourni le kilométrage K du camion C à cette date D. Dû à la négligence de l'utilisateur, ( bien que cette négligence correspond à une perte de revenu du aux abus qu'il ne pourra pas vérifier), il n'y aura pas toujours de kilométrage dans Maintenance, dans le cas par exemple justement des changements des balais d'essuie-glace. Si un chauffeur change un balais d'essuie-glace sur la route, l'utilisateur ne l'entrera probablement pas dans la base de données, c'est son problème, il ne pourra pas contrôler les abus….


    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Dans la vue que vous désirez voir mettre en oeuvre, vous faites figurer le kilométrage des camions à côté du kilométrage de chacun de leurs composants et de la date D du changement d’huile de ces derniers. Je suppose que pour chaque date D, l’utilisateur aura fourni le kilométrage K du camion C à cette date D.

    Sinon, si par exemple dans la table CAMION_MILLEAGE le dernier relevé du kilométrage du camion C est daté du 8 décembre 2018 (suite à changement des balais d’essuie-glace et vérification de la pression des pneus), et indique 75000 km, et si ensuite C a effectué un parcours de 3000 km entre le 10 décembre et le 12 décembre 2018, et si on effectue un changement d’huile du moteur le 14 décembre 2018, je suppose que pour être pertinent, le kilométrage affiché dans la vue devrait être de 78000 km, donc que l’utilisateur aura mis à jour la table CAMION_MILLEAGE en conséquence.

    Pour le moment, je pars du principe que si la table CAMION_MILLEAGE ne contient pas de ligne pour C avec HuileChangementDate = '2018-12-14', alors dans la vue on affichera '??' pour le kilométrage du camion.

    Quelle est votre position sur ce point ?

  18. #818
    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 j'écris ça :

    
    USE DZINDZIO_TRUCKS_MANAGEMENT_TEMP
    
    SELECT DISTINCT  CamionVIN, CamionNumber, ComposantType, ComposantSerial, HuileChangementDate, HuileKm
               FROM
                    (
                     SELECT  c.ComposantType, m.ComposantId, m.MoteurNumeroSerie AS ComposantSerial
                           , x.CamionId, x.CamionVIN, x.CamionNumber
                           , z.LocalisationId
    ---                       , y.HuileKm, y.HuileDateChangement
                           , y.HuileKm, y.HuileChangementDate
                           , v.ComposantAffectationId
                       FROM 
                             dbo.COMPOSANT              AS  c                                            INNER JOIN
                             dbo.HUILE_CHANGEMENT       AS  y  ON  y.ComposantId     =  y.ComposantId    INNER JOIN
                             dbo.CAMION                 AS  x  ON  x.CamionId        =  x.CamionId       INNER JOIN
                             dbo.LOCALISATION           AS  z  ON  z.LocalisationId  =  x.CamionId       INNER JOIN
                             dbo.MOTEUR                 AS  m  ON  m.ComposantId     =  c.ComposantId    INNER JOIN
                             dbo.COMPOSANT_AFFECTATION  AS  v  ON  v.ComposantId     =  c.ComposantId
    
                      UNION
    
                     ( 
                     SELECT  c.ComposantType, t.ComposantId, t.TransmissionNumeroSerie AS ComposantSerial
                           , x.CamionId, x.CamionVIN, x.CamionNumber
                           , z.LocalisationId
                           , y.HuileKm, y.HuileChangementDate
                           , v.ComposantAffectationId
                       FROM
                             dbo.COMPOSANT              AS  c                                            INNER JOIN
                             dbo.HUILE_CHANGEMENT       AS  y  ON  y.ComposantId     =  y.ComposantId    INNER JOIN
                             dbo.CAMION                 AS  x  ON  x.CamionId        =  x.CamionId       INNER JOIN
                             dbo.LOCALISATION           AS  z  ON  z.LocalisationId  =  x.CamionId       INNER JOIN
                             dbo.TRANSMISSION           AS  t  ON  t.ComposantId     =  c.ComposantId    INNER JOIN
                             dbo.COMPOSANT_AFFECTATION  AS  v  ON  v.ComposantId     =  c.ComposantId
    
                     UNION
    
                     ( 
                     SELECT  c.ComposantType, a.ComposantId, AxleSerialNumber AS ComposantSerial
                           , x.CamionId, x.CamionVIN, x.CamionNumber
                           , z.LocalisationId
                           , y.HuileKm, y.HuileChangementDate
                           , v.ComposantAffectationId
                       FROM
                             dbo.COMPOSANT              AS  c                                            INNER JOIN
                             dbo.HUILE_CHANGEMENT       AS  y  ON  y.ComposantId     =  y.ComposantId    INNER JOIN
                             dbo.CAMION                 AS  x  ON  x.CamionId        =  x.CamionId       INNER JOIN
                             dbo.LOCALISATION           AS  z  ON  z.LocalisationId  =  x.CamionId       INNER JOIN
                             dbo.AXLE                   AS  a  ON  a.ComposantId     =  c.ComposantId    INNER JOIN
                             dbo.COMPOSANT_AFFECTATION  AS  v  ON  v.ComposantId     =  c.ComposantId
                      ))) 
                         AS  w
    ;
    

    Y a-t-il une façon de modifier le script de façon à obtenir les bons résultats ???

  19. #819
    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
    Nous avons maintenant DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH
    J'ai tout traduit en anglais à l'exception de quelques triggers... C'est plus facile utiliser des termes en anglais pour le côté technique
    Il me reste à vérifier si tout fonctionne.

    La semaine prochaine je ferai l'inverse, je ferai une traduction 100% en français.

  20. #820
    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




    SELECT        CamionVIN     AS Truck_VIN
                , CamionNumber  AS Truck_Number
                           , CASE ComposantType WHEN 'e' THEN 'Engine'
                                                WHEN 't' THEN 'Transmission'
                                                WHEN 'a' THEN 'Axle'
                                                 ELSE '??' END AS Composant_Type, 
                             CASE ComposantType WHEN 'e' THEN
                                 (SELECT        MoteurNumeroSerie
                                   FROM            MOTEUR
                                   WHERE        ComposantId = z.ComposantId) WHEN 't' THEN
                                 (SELECT        TransmissionNumeroSerie
                                   FROM            TRANSMISSION
                                   WHERE        ComposantId = z.ComposantId) WHEN 'a' THEN
                                 (SELECT        AxleSerialNumber
                                   FROM            AXLE
                                   WHERE        ComposantId = z.ComposantId) ELSE '0' END AS Serial_Number
                                              , HuileDateChangement AS Oil_Change_Date
                                              , HuileKm AS Oil_Change_Milleage
                                   FROM            
                                 (SELECT        w.ComposantId, w.ComposantType
                                              , v.LocalisationId, v.ComposantAffectationId
                                              , v.ComposantInstallationDate, v.ComposantDesInstallationDate
                                              , t.HuileKm, t.HuileDateChangement
                                              , y.CamionVIN, y.CamionNumber, 
                                                y.CamionId
                                   FROM       dbo.COMPOSANT_AFFECTATION AS v INNER JOIN
                                              dbo.CAMION AS y ON v.LocalisationId = y.CamionId INNER JOIN
                                              dbo.HUILE_CHANGEMENT AS t ON v.ComposantId = t.ComposantId INNER JOIN
                                              dbo.COMPOSANT AS w ON v.ComposantId = w.ComposantId) AS z
                                  WHERE         ( ComposantDesInstallationDate = CONVERT( datetime2, '9999-12-31', 102 ))
    ;
    
    
    



    Nom : Truck Oil Change.jpg
Affichages : 18
Taille : 356,8 Ko

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