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

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

Schéma Discussion :

Maintenance de camions


Sujet :

Schéma

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel
    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
    
    
      0  0

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Ça fait jolie, ça commence à ressembler à une base de données
    Encore merci fmrel

    Pièce jointe 432790
      1  0

  3. #783
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    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...

    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).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Je ne 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...
    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 ).
      0  0

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Vous affichez ça :

    Pièce jointe 432889

    Alors que j'affiche ça :

    Pièce jointe 432890

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



    Pièce jointe 432895
      0  0

  6. #786
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    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
    Pièce jointe 432889
    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...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

  7. #787
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    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 ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Bonjour fsmrel, 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.

    Pièce jointe 433046


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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Bonjour fsmrel,

    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 ???
      0  0

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Bonjour fsmrel
    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.
      0  0

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

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

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



    SELECT        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 ))
    ;
    
    
    



    Pièce jointe 433343
      1  0

  12. #792
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    Billets dans le blog
    16
    Par défaut
    Bonjour Ordigil,


    Bel effort concernant la requête du post #820. Je ne l’ai pas encore secouée, mais elle devrait résister.

    Par rapport au résultat attendu de la requête du post #813, il manque toutefois les différentiels. Sur ce, je pars à nouveau chez le dentiste...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Bonjour fsmrel…. L'huile des différentiels et l'huile dans les essieux, c'est la même huile… Ou nous utilisons les essieux ou nous utilisons les différentiels mais pas les deux… Il est plus facile dans la base de données d'utiliser les essieux que les différentiels pour indiquer le changement d'huile. Bonne visite chez le dentiste.


    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Bel effort concernant la requête du post #820. Je ne l’ai pas encore secouée, mais elle devrait résister.

    Par rapport au résultat attendu de la requête du post #813, il manque toutefois les différentiels. Sur ce, je pars à nouveau chez le dentiste...
      0  0

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    J'ai perdu mon trigger pour le Insert et je ne sais pas ce que j'en ai fait

    J'ai commencé à le refaire mais j'ai une erreur et je n'ai pas encore fait le ménage pour effacer les variables inutiles.


    
    -----------------------------
    --- Vue TRUCK_OIL_CHANGE_V     /\/\/\/---- Dans DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH ---\/\/\/\
    -----------------------------
    
    SELECT   TruckVIN, TruckNumber, CASE ComponentType WHEN 'e' THEN 'Engine' WHEN 't' THEN 'Transmission' WHEN 'a' THEN 'Axle' ELSE '??' END AS ComponentType, CASE ComponentType WHEN 'e' THEN
                        (SELECT   EngineSerialNumber
                         FROM      ENGINE
                         WHERE   ComponentId = z.ComponentId) WHEN 't' THEN
                        (SELECT   TransmissionSerialNumber
                         FROM      TRANSMISSION
                         WHERE   ComponentId = z.ComponentId) WHEN 'a' THEN
                        (SELECT   AxleSerialNumber
                         FROM      AXLE
                         WHERE   ComponentId = z.ComponentId) ELSE '0' END AS SerialNumber, OilChangeDate, OilChangeMilleage
    FROM      (SELECT   w.ComponentId, w.ComponentType, v.LocalisationId, v.ComponentAffectationId, v.ComponentInstallDate, v.ComponentUninstallDate, t.OilChangeMilleage, t.OilChangeDate, y.TruckVIN, y.TruckNumber, y.TruckId
                     FROM      dbo.COMPONENT_AFFECTATION AS v INNER JOIN
                                     dbo.TRUCK AS y ON v.LocalisationId = y.TruckId INNER JOIN
                                     dbo.OIL_CHANGE AS t ON v.ComponentId = t.ComponentId INNER JOIN
                                     dbo.COMPONENT AS w ON v.ComponentId = w.ComponentId) AS z
    WHERE   (ComponentUninstallDate = CONVERT(DATETIME, '9999-12-31', 102))
    
    




    
    --------------------------
    --- Trigger pour Insert
    --------------------------
    
    USE [DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH]
    GO
    /****** Object:  Trigger [dbo].[MOTEUR_HUILE_V_INSERT_TR]    Script Date: 2018-12-14 19:11:30 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER TRIGGER [dbo].[TRUCK_OIL_CHANGE_V_INSERT_TR] ON [dbo].[TRUCK_OIL_CHANGE_V] INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @TruckId AS int ;
    DECLARE @ComponentId AS INT ;
    DECLARE @TruckVIN AS varchar(24) ;
    DECLARE @TruckNumber AS varchar(6) ;
    DECLARE @ComponentType AS varchar(12) ;
    DECLARE @SerialNumber AS varchar(25) ;
    DECLARE @OilChangeDate AS date ;
    DECLARE @OilChangeMilleage as int ;
    DECLARE @Engueulade as VARCHAR(256) ;
    
    
    SET @TruckId =
                    (
                     SELECT TruckId
                     FROM   TRUCK AS x
                     WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.TruckNumber = u.TruckNumber
                                  )
                    )
    ;
    
    IF @TruckId IS NULL
        BEGIN
    	       SET @Engueulade = 'ENGINE_OIL_CHANGE_V_INSERT_TR - Unknow Truck'
            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
    ;
    
    SET @TruckVIN =
                    (
                     SELECT TruckVIN
                     FROM   TRUCK AS x
                     WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.TruckNumber = u.TruckNumber
                                  )
                    )
    
         END
    ;
    ------------------------------------------------------------
    SET @ComponentType =
                       (
                        SELECT ComponentType
                        FROM   Component AS x
                         WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.ComponentType = u.ComponentType
                                  )
                        )
    
    ;
    --------------------------------------------------------------------------------------
    
    SET @ComponentId =
                       (
                        SELECT ComponentId
                        FROM   COMPONENT_AFFECTATION AS x
                         WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.LocalisationId = LocalisationId
                                  )
                        )
    
    ;
    
    INSERT INTO OIL_CHANGE
                      (
                       ComponentId
                     , OilChangeDate
                     , OilChangeMilleage
                      )
    
    SELECT    @ComponentId
            , COALESCE(OilChangeDate, CAST('9999-12-31' as DATE))
            , COALESCE(OilChangeMilleage, 0)   -- attention à la division par zéro...
    FROM INSERTED
    ;
    
    




    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Bel effort concernant la requête du post #820. Je ne l’ai pas encore secouée, mais elle devrait résister.

    Par rapport au résultat attendu de la requête du post #813, il manque toutefois les différentiels. Sur ce, je pars à nouveau chez le dentiste...
      0  0

  15. #795
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    Billets dans le blog
    16
    Par défaut
    Bonjour Ordigil,


    Citation Envoyé par ordigil Voir le message
    J'ai perdu mon trigger pour le Insert et je ne sais pas ce que j'en ai fait
    J'ai commencé à le refaire mais j'ai une erreur
    Bon, je vais regarder ça de près.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Quel chance de vous avoir

    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Bon, je vais regarder ça de près.
      0  0

  17. #797
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    Billets dans le blog
    16
    Par défaut
    Bonsoir Ordigil,


    Si vous mettez en oeuvre le trigger TRUCK_OIL_CHANGE_V_INSERT_TR, c’est que vous voulez effectuer des inserts via la vue TRUCK_OIL_CHANGE_V, donc par ce biais mette à jour la table OIL_CHANGE, c’est ce que dit l’INSERT final dans le trigger. So far, so good.

    Mais...

    (1) Notez que l’instruction END balançant l’instruction BEGIN de début de trigger n’est plus à sa place, elle est partie malencontreusement devant l’instruction "SET @ComponentType".


    (2) Passons à cette instruction elle-même :

    SET @ComponentType =
                       (
                        SELECT ComponentType
                        FROM   Component AS x
                         WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.ComponentType = u.ComponentType
                                  )
                       )
    ;
    
    "x.ComponentType" prend les valeurs 'e', 't', 'a', , 'd', tandis que "u.ComponentType" prend les valeurs 'engine', 'transmission', 'axle', 'differential'... Autrement dit, SQL force @ComponentType à NULL...


    (3) Passons à l’instruction :

    SET @ComponentId =
                       (
                        SELECT ComponentId
                        FROM   COMPONENT_AFFECTATION AS x
                         WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.LocalisationId = LocalisationId
                                  )
                        )
    ;
    
    La variable @ComponentId ne peut prendre au plus qu’une valeur, sinon SQL rouspète grave. Or si un camion a par exemple, un moteur et une transmission, la variable prendra deux valeurs, d’où infraction... Vous êtes obligé de faire intervenir le composant dans le 2e WHERE, sachant par ailleurs que la comparaison "x.LocalisationId = LocalisationId" est une tautologie, elle équivaut à "x.LocalisationId = x.LocalisationId" (LocalisationId n’est pas une colonne de INSERTED, mais bien de COMPONENT_AFFECTATION).

    Dans les tests, je vous conseille de tracer les valeurs prises par les variables, exemples :

    select TruckId as 'TruckId'
    ...
    select @TruckVIN as '@TruckVIN'

    Etc.

    Même chose pour INSERTED :

    select '' as INSERTED, * from INSERTED


    Je vais voir comment effectuer les INSERTs de façon satisfaisante...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    C'est triste car la vue TRUCK_OIL_CHANGE_V contient seulement une table dérivée très simple qui contient tous ce que j'avais besoin mais je ne me souviens plus comment j'avais fait le trigger :

    SELECT   TruckVIN, TruckNumber, CASE ComponentType WHEN 'e' THEN 'Engine' WHEN 't' THEN 'Transmission' WHEN 'a' THEN 'Axle' ELSE '??' END AS ComponentType, CASE ComponentType WHEN 'e' THEN
                        (SELECT   EngineSerialNumber
                         FROM      ENGINE
                         WHERE   ComponentId = z.ComponentId) WHEN 't' THEN
                        (SELECT   TransmissionSerialNumber
                         FROM      TRANSMISSION
                         WHERE   ComponentId = z.ComponentId) WHEN 'a' THEN
                        (SELECT   AxleSerialNumber
                         FROM      AXLE
                         WHERE   ComponentId = z.ComponentId) ELSE '0' END AS SerialNumber, OilChangeDate, OilChangeMilleage
    FROM      (SELECT   w.ComponentId, w.ComponentType, v.LocalisationId, v.ComponentAffectationId, v.ComponentInstallDate, v.ComponentUninstallDate, t.OilChangeMilleage, t.OilChangeDate, y.TruckVIN, y.TruckNumber, y.TruckId
                     FROM      dbo.COMPONENT_AFFECTATION AS v INNER JOIN
                                     dbo.TRUCK AS y ON v.LocalisationId = y.TruckId INNER JOIN
                                     dbo.OIL_CHANGE AS t ON v.ComponentId = t.ComponentId INNER JOIN
                                     dbo.COMPONENT AS w ON v.ComponentId = w.ComponentId) AS z
    WHERE   (ComponentUninstallDate = CONVERT(DATETIME, '9999-12-31', 102))
    

    Pièce jointe 435285


    Citation Envoyé par fsmrel Voir le message
    Bonsoir Ordigil,


    Si vous mettez en oeuvre le trigger TRUCK_OIL_CHANGE_V_INSERT_TR, c’est que vous voulez effectuer des inserts via la vue TRUCK_OIL_CHANGE_V, donc par ce biais mette à jour la table OIL_CHANGE, c’est ce que dit l’INSERT final dans le trigger. So far, so good.

    Mais...

    (1) Notez que l’instruction END balançant l’instruction BEGIN de début de trigger n’est plus à sa place, elle est partie malencontreusement devant l’instruction "SET @ComponentType".


    (2) Passons à cette instruction elle-même :

    SET @ComponentType =
                       (
                        SELECT ComponentType
                        FROM   Component AS x
                         WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.ComponentType = u.ComponentType
                                  )
                       )
    ;
    
    "x.ComponentType" prend les valeurs 'e', 't', 'a', , 'd', tandis que "u.ComponentType" prend les valeurs 'engine', 'transmission', 'axle', 'differential'... Autrement dit, SQL force @ComponentType à NULL...


    (3) Passons à l’instruction :

    SET @ComponentId =
                       (
                        SELECT ComponentId
                        FROM   COMPONENT_AFFECTATION AS x
                         WHERE EXISTS
                                  (
                                   SELECT '' FROM INSERTED AS u
                                   WHERE  x.LocalisationId = LocalisationId
                                  )
                        )
    ;
    
    La variable @ComponentId ne peut prendre au plus qu’une valeur, sinon SQL rouspète grave. Or si un camion a par exemple, un moteur et une transmission, la variable prendra deux valeurs, d’où infraction... Vous êtes obligé de faire intervenir le composant dans le 2e WHERE, sachant par ailleurs que la comparaison "x.LocalisationId = LocalisationId" est une tautologie, elle équivaut à "x.LocalisationId = x.LocalisationId" (LocalisationId n’est pas une colonne de INSERTED, mais bien de COMPONENT_AFFECTATION).

    Dans les tests, je vous conseille de tracer les valeurs prises par les variables, exemples :

    select TruckId as 'TruckId'
    ...
    select @TruckVIN as '@TruckVIN'

    Etc.

    Même chose pour INSERTED :

    select '' as INSERTED, * from INSERTED


    Je vais voir comment effectuer les INSERTs de façon satisfaisante...
      0  0

  19. #799
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 965
    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 : 7 965
    Points : 30 777
    Points
    30 777
    Billets dans le blog
    16
    Par défaut
    Bien que ce ne soit pas une nécessité ici (ComposantType n’est pas nécessaire), j’utilise une variable @t de type table, permettant de récupérer en une fois les valeurs de différentes colonnes de la table INSERTED.

    Le trigger qui suit est certainement simplifiable, mais pourriez-vous le tester ?

    CREATE TRIGGER CAMION_HUILE_SUIVI_INSERT_TR ON CAMION_HUILE_SUIVI INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @ComposantId AS INT ;
    DECLARE @ComposantType AS varchar(12) ;
    DECLARE @Engueulade as VARCHAR(256) ;
    DECLARE @trigger as varchar(64) = 'CAMION_HUILE_SUIVI_INSERT_TR'
    
    ---- pour debug ---- select @trigger as '@trigger'
    ---- pour debug ---- select '' as INSERTED, * from INSERTED  
    ------------------------------------------------------------
    DECLARE @t TABLE 
        (
           ComposantId INT
         , ComposantType CHAR(1)
        )
    
    INSERT INTO @t 
        SELECT x.ComposantId, x.ComposantType
        FROM   COMPOSANT AS x
          JOIN MOTEUR AS a ON a.ComposantId = x.ComposantId
          JOIN INSERTED AS y on a.MoteurNumeroSerie = y.SerialNumber 
        UNION
        SELECT x.ComposantId, x.ComposantType
        FROM   COMPOSANT AS x
          JOIN TRANSMISSION AS a ON a.ComposantId = x.ComposantId
          JOIN INSERTED AS y on a.TransmissionNumeroSerie = y.SerialNumber 
        UNION
        SELECT x.ComposantId, x.ComposantType
        FROM   COMPOSANT AS x
          JOIN AXLE AS a ON a.ComposantId = x.ComposantId
          JOIN INSERTED as y ON a.AxleSerialNumber = y.SerialNumber
    ;
    ---- pour debug ---- select * from @t
    
    SET @ComposantType = (select ComposantType from @t)
    
    ---- pour debug ---- select @ComposantType as '@ComposantType' 
    
    --------------------------------------------------------------------------------------
    
    SET @ComposantId = (select ComposantId from @t)
    
    ---- pour debug ---- select @ComposantId as '@ComposantId' 
    --------------------------------------------------------------
    
    INSERT INTO HUILE_CHANGEMENT
                      (
                       ComposantId
                     , HuileChangementDate
                     , HuileKm
                      )
    
    SELECT  @ComposantId
          , COALESCE(HuileChangementDate, CAST('9999-12-31' as DATE))
          , COALESCE(HuileKm, 0)   -- attention à la division par zéro...
    FROM INSERTED
    ;
    
    END
    
    A noter que si des composants de nature différente (camion, transmission, axle) avaient même numéro de série, le trigger planterait probablement (> 1 valeur pour l’instruction SET), mais quel risque y a-t-il pour que cette situation se produise ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

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

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

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Ok j'essaie Merci fsmrel Ça va prendre un bout car je dois tout retraduit en anglais LoL


    Citation Envoyé par fsmrel Voir le message
    Bien que ce ne soit pas une nécessité ici (ComposantType n’est pas nécessaire), j’utilise une variable @t de type table, permettant de récupérer en une fois les valeurs de différentes colonnes de la table INSERTED.

    Le trigger qui suit est certainement simplifiable, mais pourriez-vous le tester ?

    CREATE TRIGGER CAMION_HUILE_SUIVI_INSERT_TR ON CAMION_HUILE_SUIVI INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @ComposantId AS INT ;
    DECLARE @ComposantType AS varchar(12) ;
    DECLARE @Engueulade as VARCHAR(256) ;
    DECLARE @trigger as varchar(64) = 'CAMION_HUILE_SUIVI_INSERT_TR'
    
    ---- pour debug ---- select @trigger as '@trigger'
    ---- pour debug ---- select '' as INSERTED, * from INSERTED  
    ------------------------------------------------------------
    DECLARE @t TABLE 
        (
           ComposantId INT
         , ComposantType CHAR(1)
        )
    
    INSERT INTO @t 
        SELECT x.ComposantId, x.ComposantType
        FROM   COMPOSANT AS x
          JOIN MOTEUR AS a ON a.ComposantId = x.ComposantId
          JOIN INSERTED AS y on a.MoteurNumeroSerie = y.SerialNumber 
        UNION
        SELECT x.ComposantId, x.ComposantType
        FROM   COMPOSANT AS x
          JOIN TRANSMISSION AS a ON a.ComposantId = x.ComposantId
          JOIN INSERTED AS y on a.TransmissionNumeroSerie = y.SerialNumber 
        UNION
        SELECT x.ComposantId, x.ComposantType
        FROM   COMPOSANT AS x
          JOIN AXLE AS a ON a.ComposantId = x.ComposantId
          JOIN INSERTED as y ON a.AxleSerialNumber = y.SerialNumber
    ;
    ---- pour debug ---- select * from @t
    
    SET @ComposantType = (select ComposantType from @t)
    
    ---- pour debug ---- select @ComposantType as '@ComposantType' 
    
    --------------------------------------------------------------------------------------
    
    SET @ComposantId = (select ComposantId from @t)
    
    ---- pour debug ---- select @ComposantId as '@ComposantId' 
    --------------------------------------------------------------
    
    INSERT INTO HUILE_CHANGEMENT
                      (
                       ComposantId
                     , HuileChangementDate
                     , HuileKm
                      )
    
    SELECT  @ComposantId
          , COALESCE(HuileChangementDate, CAST('9999-12-31' as DATE))
          , COALESCE(HuileKm, 0)   -- attention à la division par zéro...
    FROM INSERTED
    ;
    
    END
    
    A noter que si des composants de nature différente (camion, transmission, axle) avaient même numéro de série, le trigger planterait probablement (> 1 valeur pour l’instruction SET), mais quel risque y a-t-il pour que cette situation se produise ?
    USE [DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH]
    GO
    
    INSERT INTO [dbo].[TRUCK_OIL_CHANGE_V]
               ([TruckNumber]
               ,[ComponentType]
               ,[OilChangeDate]
               ,[OilChangeMilleage])
         VALUES
               ('2540'
               ,'e'
               ,'2018-12-01'
               ,'245674')
    GO
    
    

    (0 rows affected)
    Msg 515, Level 16, State 2, Procedure TRUCK_OIL_CHANGE_V_INSERT_TR, Line 53 [Batch Start Line 2]
    Impossible d'insérer la valeur NULL dans la colonne 'ComponentId', table 'DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH.dbo.OIL_CHANGE'. Cette colonne n'accepte pas les valeurs NULL. Échec de INSERT.
    L'instruction a été arrêtée.

    Ah ok, on y va avec le numéro de série du composant. De cette façon ça fonctionne mais ça fait moins rapide pour l'utilisateur rechercher le numéro de série du composant que de simplement entrer 'e', 't', af, ar, ai1, ai2, ai3...
      0  0

Discussions similaires

  1. Ajout dans une table et relation avec d'autres
    Par climz dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 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