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. #801
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour Ordigil,


    Variante du trigger.

    D’accord, si le changement d’huile concerne le moteur, on sait déterminer celui-ci et l’utilisateur n’a pas besoin de le fournir. Exemple :

    INSERT INTO CAMION_HUILE_SUIVI  
        (CamionNumber, ComposantType, HuileChangementDate, HuileKm)
        SELECT '156', 'Engine', '2019-07-17', 16017
    ;
    
    Même chose si le camion n’a qu’une seule transmission, sachant qu’il a été convenu qu’il pouvait en avoir plus d’une, auquel cas l’utilisateur devra en fournir le numéro de série.

    Je vais examiner le cas des axles.

    En tout cas, je vous proposerai une variante du trigger moins astreignante pour l’utilisateur.
    (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

  2. #802
    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 . Oui il va falloir faire un petit truc pour permettre à l'utilisateur de déterminer les 'AXLE'. Je m'amuse déjà avec votre trigger



    Citation Envoyé par fsmrel Voir le message
    Bonjour Ordigil,


    Variante du trigger.

    D’accord, si le changement d’huile concerne le moteur, on sait déterminer celui-ci et l’utilisateur n’a pas besoin de le fournir. Exemple :

    INSERT INTO CAMION_HUILE_SUIVI  
        (CamionNumber, ComposantType, HuileChangementDate, HuileKm)
        SELECT '156', 'Engine', '2019-07-17', 16017
    ;
    
    Même chose si le camion n’a qu’une seule transmission, sachant qu’il a été convenu qu’il pouvait en avoir plus d’une, auquel cas l’utilisateur devra en fournir le numéro de série.

    Je vais examiner le cas des axles.

    En tout cas, je vous proposerai une variante du trigger moins astreignante pour l’utilisateur.
    Dans ce cas qui est quand même très rare de nos jours, la deuxième transmission se nommerait 'Transmission Auxiliaire' . Dans le Camion aurait une 'Transmission Primaire' et une 'Transmission Auxiliaire'. Si le Camion à un chargement extrême comme certain Camions Forestiers, dans la plupart des cas, au lieu d'ajouter une 'Transmission Auxiliaire', mettrait des 'Essieux Planétaires' sur le camion....


    Pièce jointe 435500

    Citation Envoyé par fsmrel
    Même chose si le camion n’a qu’une seule transmission, sachant qu’il a été convenu qu’il pouvait en avoir plus d’une, auquel cas l’utilisateur devra en fournir le numéro de série.
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    En passant :

    Au départ, on s’intéressait au changement d’huile des différentiels, et maintenant au changement d’huile des axles qui les portent : front, forward, rear. Mais les autres types d’axles sont-ils concernés par le changement d’huile ? (pusher, tag, 2ndfront, ...) ? On les laisse se gripper tranquillement ?
    (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. #804
    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
    Différentiel et essieu c'est la même huile…. Si je change l'huile dans un différentiel, je change par le fait même l'huile de son essieu et si je change l'huile d'un essieu, je change par le fait même l'huile son différentiel. J'ai utilisé les essieux pour les changement d'huile pour des raisons pratiques, tel que la simplicité pour les triggers. Si on a un différentiel, lorsqu'on change l'huile on change l'huile du différentiel, du demi-essieu droit et du demi-essieu gauche automatiquement. Si on a pas de différentiel, on change l'huile dans le hub droit et dans le hub gauche séparément car aucune liaison entre les deux…

    Pièce jointe 435508




    Citation Envoyé par fsmrel Voir le message
    En passant :

    Au départ, on s’intéressait au changement d’huile des différentiels, et maintenant au changement d’huile des axles qui les portent : front, forward, rear. Mais les autres types d’axles sont-ils concernés par le changement d’huile ? (pusher, tag, 2ndfront, ...) ? On les laisse se gripper tranquillement ?
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Dessin éloquent...


    Citation Envoyé par Ordigil
    Si on a pas de différentiel, on change l'huile dans le hub droit et dans le hub gauche séparément car aucune liaison entre les deux…
    Donc on doit suivre les changements d’huile des pushers, tags et autres axles dépourvu de différentiel. Vu de la base de données, doit-on considérer qu’on peut ne pas traiter en même temps le hub droit et le hub gauche, donc qu’il faut descendre à ce niveau de finesse dans le suivi des changements ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

  6. #806
    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


    Lorsqu'un roulement à bille est endommagé ou que le joint d'étanchéité est endommagé d'un coté, ce qui arrive régulièrement sur un camion vu le kilométrage parcouru annuellement, à ce moment nous changeons l'huile du côté de la réparation puisque pour effectuer la réparation, l'huile est vidée de ce côté. Faisons donc comme vous le désirez, soit la façon la plus difficile hahaha. Incluons les changements d'huile de tous les essieux en séparant le côté gauche et le côté droit et incluons les changements d'huile des différentiels afin que l'on puisse conserver l'historique des changements d'huile advenant qu'on les remplace par d'autres. Ça va faire un beau trigger



    Citation Envoyé par fsmrel Voir le message
    Dessin éloquent...



    Donc on doit suivre les changements d’huile des pushers, tags et autres axles dépourvu de différentiel. Vu de la base de données, doit-on considérer qu’on peut ne pas traiter en même temps le hub droit et le hub gauche, donc qu’il faut descendre à ce niveau de finesse dans le suivi des changements ?
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Ordigil
    Faisons donc comme vous le désirez
    Je n’ai rien désiré, je n’ai fait que poser des questions, nuance.

    Pour les différentiels, vous avez précisé que le changement d’huile est celui de leur axle, inutile donc de programmer quoi que ce soit les concernant.

    Pour les hubs (cas des axles sans différentiel), pourquoi pas, mais accouchons déjà d’un trigger moins astreignant que celui que j’ai déjà proposé.
    (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

  8. #808
    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'adore vos nuances LoL

    Donc aurons-nous l'historique des changements d'huile des différentiels s'ils ne sont plus associés à leur essieux et vice versa ???


    Citation Envoyé par fsmrel Voir le message
    Je n’ai rien désiré, je n’ai fait que poser des questions, nuance.

    Pour les différentiels, vous avez précisé que le changement d’huile est celui de leur axle, inutile donc de programmer quoi que ce soit les concernant.

    Pour les hubs (cas des axles sans différentiel), pourquoi pas, mais accouchons déjà d’un trigger moins astreignant que celui que j’ai déjà proposé.
    Si pour vous cette base de données est encore un divertissement, allons à fond dans les détails car à chaque fois vous concevez quelque chose de nouveau pour parvenir au résultat, ce qui est vraiment très intéressant sur le plan éducatif. J'aime bien m'amuser avec vos triggers, ça permet de vraiment comprendre le fonctionnement de la base de données.
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Ordigil
    Donc aurons-nous l'historique des changements d'huile des différentiels s'ils ne sont plus associés à leur essieux et vice versa ???
    Pour les essieux, pas de problème, puisqu’on ne cherche pas à savoir s’ils sont associés à des différentiels.

    Que je sache, un différentiel qui n’est plus associé à un essieu n’est plus associé à un camion : le trigger devra en tenir compte : suivi du différentiel orphelin pour lui-même, point barre.

    Quoi qu’il en soit, j’ai modifié le trigger que j’avais proposé : plus de serial number de composant à fournir (sauf en cas de doublon légal, par exemple deux transmission pour un camion).

    Pour les essieux : pour que l’utilisateur n’ait donc pas à fournir le numéro de série de l’essieu qu’il traite, je me suis basé sur la position de l’essieu sur le camion : FRGAWR, REARGAWR, 1INTGAWR, etc., position qu’il devra fournir.


    Exemple :

    insert into  CAMION_HUILE_SUIVI  
        (CamionNumber, ComposantType, HuileChangementDate, HuileKm)
        SELECT '156', '1INT', '2019-11-11', 17006 
    
    insert into  CAMION_HUILE_SUIVI  
        (CamionNumber, ComposantType, HuileChangementDate, HuileKm)
        SELECT '156', 'rear', '2019-03-03', 14008 
    

    Le trigger correspondant à tester :

    
    CREATE TRIGGER CAMION_HUILE_SUIVI_INSERT_TR ON CAMION_HUILE_SUIVI INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @CamionId AS INT ;
    DECLARE @CamionVIN AS varchar(24) ;
    DECLARE @CamionNumber AS varchar(6) ;
    DECLARE @SerialNumber AS varchar(25) ;
    DECLARE @PositionId AS INT ;
    DECLARE @ComposantId AS INT ;
    DECLARE @ComposantTypeCode AS CHAR(1) ;
    DECLARE @ComposantTypeSource AS varchar(12) ;
    DECLARE @ComposantType AS varchar(12) ;
    DECLARE @trigger as varchar(64) = 'ENGINE_OIL_CHANGE_V_INSERT_TR'
    DECLARE @Engueulade as VARCHAR(256) = @trigger + ' - Oil change ; ' ;
    DECLARE @N AS INT ;
    
    ---- pour debug ---- select @trigger as '@trigger'
    ---- pour debug ---- select '' as INSERTED, * from INSERTED  
     
    SET  @CamionNumber = (SELECT CamionNumber FROM INSERTED) ;
    
    SET @CamionId =
                    (
                     SELECT DISTINCT CamionId
                     FROM   CAMION
                     WHERE  CamionNumber = @CamionNumber 
                    )
    ;
    ---- pour debug ---- select @CamionId as '@CamionId'
    
    IF @CamionId IS NULL
        BEGIN
            SET @Engueulade = @Engueulade + '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 @ComposantTypeSource = (SELECT ComposantType FROM INSERTED)
    
    ---- pour debug ---- select @ComposantTypeSource as '@ComposantTypeSource'
    
    SET @ComposantType =
        (
         CASE
             WHEN lower(@ComposantTypeSource) = 'engine' THEN 'e'
             WHEN left(lower(@ComposantTypeSource),5) = 'trans' THEN 't'
             WHEN left(lower(@ComposantTypeSource),4) = '1int' THEN '1INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '2int' THEN '2INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '3int' THEN '3INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '4int' THEN '4INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '5int' THEN '5INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '6int' THEN '6INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '7int' THEN '7INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '8int' THEN '8INTGAWR'
             WHEN left(lower(@ComposantTypeSource),3) = 'frg' THEN 'frgawr'
             WHEN left(lower(@ComposantTypeSource),4) = 'rear' THEN 'reargawr
             WHEN lower(@ComposantTypeSource) = 'tag' THEN 'tag'
             ELSE '?'
         END
        )
    ---- pour debug ---- select @ComposantType as '@ComposantType'
    
    IF @ComposantType = '?'
        BEGIN
            SET @Engueulade = @Engueulade + 'Invalid component type ''' +  @ComposantTypeSource + '''.'
            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
    
    
    DECLARE @t TABLE 
        (
           ComposantId INT
        )
    
    --------------------------------------------
    -- moteur ou transmission
    --------------------------------------------
    IF @ComposantType IN ('e', 't')
        BEGIN
            INSERT INTO @t 
                SELECT y.ComposantId 
                FROM   COMPOSANT_AFFECTATION AS x 
                  JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId  
                WHERE  x.LocalisationId = @CamionId
                   AND LOWER(y.ComposantType) = @ComposantType  
        END
    ELSE
        --------------------------------------------
        -- axle
        --------------------------------------------
        BEGIN
            SET @PositionId = (SELECT PositionId FROM AXLE_POSITION WHERE PositionCode = @ComposantType)
    
           ---- pour debug ---- select @PositionId as '@PositionId'
    
            INSERT INTO @t 
                SELECT y.ComposantId 
                FROM   COMPOSANT_AFFECTATION AS x 
                  JOIN AXLE AS y ON x.ComposantId = y.ComposantId  
                WHERE  x.LocalisationId = @CamionId
                   AND x.PositionId = @PositionId
    
           ---- pour debug ---- select ''  as '@t', * from @t
     
        END
    
    SET @N = (SELECT COUNT(*) FROM @t)
    
    --- pour debug ---- select @N as '@N'
    
    IF @N = 1
        BEGIN
            SET @ComposantId = (SELECT ComposantId FROM @t)
       END
    
    IF @N > 1
        BEGIN
            ---------------------------------------------
            -- Il y a plus d'un composant candidat :
            -- dans ces conditions, l'utilisateur doit 
            -- fournir le serial number du composant 
            -- objet du huilage.
            ----------------------------------------------
            SET @SerialNumber = (SELECT SerialNumber FROM INSERTED)
            ----pour debug ----  
            select @SerialNumber as '@SerialNumber'
            
            -----------------------------------
            -- Si serial number omis,
            -- on rouspète
            -----------------------------------
            IF @SerialNumber IS NULL
                BEGIN 
                    SET @Engueulade = @Engueulade + 'le camion ''' + @CamionNumber + ''' a ' + cast(@N as varchar)
                        + ' ' + lower(@ComposantTypeSource) + 's, veuillez fournir le serial number concerné par le changement d''huile.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
            --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
                    RETURN              
                END
            -----------------------------------------------
            -- Si serial number fourni, on récupère la 
            -- valeur di ComposantId correspondant.
            -- on traite seulement des transmissions
            -- car pour les moteurs et axles, il ne
            -- peut y avoir d'ambiguïté. 
            -----------------------------------------------
            IF @ComposantType = 't'   
               BEGIN
                   SET @ComposantId = 
                       (
                        SELECT y.ComposantId 
                        FROM   COMPOSANT_AFFECTATION AS x 
                          JOIN TRANSMISSION AS y ON x.ComposantId = y.ComposantId  
                        WHERE  x.LocalisationId = @CamionId
                           AND y.TransmissionNumeroSerie = @SerialNumber  
                       )
                    IF @ComposantId IS NULL
                        BEGIN
                            SET @Engueulade = @Engueulade + 'camion ''' + @CamionNumber + ''' : unknown serial number ''' 
                               + @SerialNumber + '''.' 
                            SELECT @Engueulade AS Engueulons, * FROM INSERTED
                    --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                            RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
                            RETURN              
                        END
               END
        END
      
    --- 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
    
    GO
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

  10. #810
    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
    Exactement

    Citation Envoyé par fsmrel
    Que je sache, un différentiel qui n’est plus associé à un essieu n’est plus associé à un camion : le trigger devra en tenir compte : suivi du différentiel orphelin pour lui-même, point barre.

    Ça fait un beau trigger Je le traduis pour en faire l'essaie dans 'DZINDSIO_TRUCKS_MANAGEMENT_ENGLISH'.

    '''''Dans la base de données, il faut trouver une façon de convertir en Majuscule le premier Caractère de tous les mots entrés par l'utilisateur ou forcer l'utilisateur à utiliser une Majuscule pour le premier caractère de tous les mots qu'il entre dans la base de données.. . Sous UNIX, 'Mot' et 'mot', 'mOt' et 'mot', 'moT' et mot' et ainsi de suite, sont tous des mots différents.'''''



    Citation Envoyé par fsmrel Voir le message
    Pour les essieux, pas de problème, puisqu’on ne cherche pas à savoir s’ils sont associés à des différentiels.


    Que je sache, un différentiel qui n’est plus associé à un essieu n’est plus associé à un camion : le trigger devra en tenir compte : suivi du différentiel orphelin pour lui-même, point barre.

    Quoi qu’il en soit, j’ai modifié le trigger que j’avais proposé : plus de serial number de composant à fournir (sauf en cas de doublon légal, par exemple deux transmission pour un camion).

    Pour les essieux : pour que l’utilisateur n’ait donc pas à fournir le numéro de série de l’essieu qu’il traite, je me suis basé sur la position de l’essieu sur le camion : FRGAWR, REARGAWR, 1INTGAWR, etc., position qu’il devra fournir.


    Exemple :

    insert into  CAMION_HUILE_SUIVI  
        (CamionNumber, ComposantType, HuileChangementDate, HuileKm)
        SELECT '156', '1INT', '2019-11-11', 17006 
    
    insert into  CAMION_HUILE_SUIVI  
        (CamionNumber, ComposantType, HuileChangementDate, HuileKm)
        SELECT '156', 'rear', '2019-03-03', 14008 
    

    Le trigger correspondant à tester :

    
    CREATE TRIGGER CAMION_HUILE_SUIVI_INSERT_TR ON CAMION_HUILE_SUIVI INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @CamionId AS INT ;
    DECLARE @CamionVIN AS varchar(24) ;
    DECLARE @CamionNumber AS varchar(6) ;
    DECLARE @SerialNumber AS varchar(25) ;
    DECLARE @PositionId AS INT ;
    DECLARE @ComposantId AS INT ;
    DECLARE @ComposantTypeCode AS CHAR(1) ;
    DECLARE @ComposantTypeSource AS varchar(12) ;
    DECLARE @ComposantType AS varchar(12) ;
    DECLARE @trigger as varchar(64) = 'ENGINE_OIL_CHANGE_V_INSERT_TR'
    DECLARE @Engueulade as VARCHAR(256) = @trigger + ' - Oil change ; ' ;
    DECLARE @N AS INT ;
    
    ---- pour debug ---- select @trigger as '@trigger'
    ---- pour debug ---- select '' as INSERTED, * from INSERTED  
     
    SET  @CamionNumber = (SELECT CamionNumber FROM INSERTED) ;
    
    SET @CamionId =
                    (
                     SELECT DISTINCT CamionId
                     FROM   CAMION
                     WHERE  CamionNumber = @CamionNumber 
                    )
    ;
    ---- pour debug ---- select @CamionId as '@CamionId'
    
    IF @CamionId IS NULL
        BEGIN
            SET @Engueulade = @Engueulade + '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 @ComposantTypeSource = (SELECT ComposantType FROM INSERTED)
    
    ---- pour debug ---- select @ComposantTypeSource as '@ComposantTypeSource'
    
    SET @ComposantType =
        (
         CASE
             WHEN lower(@ComposantTypeSource) = 'engine' THEN 'e'
             WHEN left(lower(@ComposantTypeSource),5) = 'trans' THEN 't'
             WHEN left(lower(@ComposantTypeSource),4) = '1int' THEN '1INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '2int' THEN '2INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '3int' THEN '3INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '4int' THEN '4INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '5int' THEN '5INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '6int' THEN '6INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '7int' THEN '7INTGAWR'
             WHEN left(lower(@ComposantTypeSource),4) = '8int' THEN '8INTGAWR'
             WHEN left(lower(@ComposantTypeSource),3) = 'frg' THEN 'frgawr'
             WHEN left(lower(@ComposantTypeSource),4) = 'rear' THEN 'reargawr
             WHEN lower(@ComposantTypeSource) = 'tag' THEN 'tag'
             ELSE '?'
         END
        )
    ---- pour debug ---- select @ComposantType as '@ComposantType'
    
    IF @ComposantType = '?'
        BEGIN
            SET @Engueulade = @Engueulade + 'Invalid component type ''' +  @ComposantTypeSource + '''.'
            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
    
    
    DECLARE @t TABLE 
        (
           ComposantId INT
        )
    
    --------------------------------------------
    -- moteur ou transmission
    --------------------------------------------
    IF @ComposantType IN ('e', 't')
        BEGIN
            INSERT INTO @t 
                SELECT y.ComposantId 
                FROM   COMPOSANT_AFFECTATION AS x 
                  JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId  
                WHERE  x.LocalisationId = @CamionId
                   AND LOWER(y.ComposantType) = @ComposantType  
        END
    ELSE
        --------------------------------------------
        -- axle
        --------------------------------------------
        BEGIN
            SET @PositionId = (SELECT PositionId FROM AXLE_POSITION WHERE PositionCode = @ComposantType)
    
           ---- pour debug ---- select @PositionId as '@PositionId'
    
            INSERT INTO @t 
                SELECT y.ComposantId 
                FROM   COMPOSANT_AFFECTATION AS x 
                  JOIN AXLE AS y ON x.ComposantId = y.ComposantId  
                WHERE  x.LocalisationId = @CamionId
                   AND x.PositionId = @PositionId
    
           ---- pour debug ---- select ''  as '@t', * from @t
     
        END
    
    SET @N = (SELECT COUNT(*) FROM @t)
    
    --- pour debug ---- select @N as '@N'
    
    IF @N = 1
        BEGIN
            SET @ComposantId = (SELECT ComposantId FROM @t)
       END
    
    IF @N > 1
        BEGIN
            ---------------------------------------------
            -- Il y a plus d'un composant candidat :
            -- dans ces conditions, l'utilisateur doit 
            -- fournir le serial number du composant 
            -- objet du huilage.
            ----------------------------------------------
            SET @SerialNumber = (SELECT SerialNumber FROM INSERTED)
            ----pour debug ----  
            select @SerialNumber as '@SerialNumber'
            
            -----------------------------------
            -- Si serial number omis,
            -- on rouspète
            -----------------------------------
            IF @SerialNumber IS NULL
                BEGIN 
                    SET @Engueulade = @Engueulade + 'le camion ''' + @CamionNumber + ''' a ' + cast(@N as varchar)
                        + ' ' + lower(@ComposantTypeSource) + 's, veuillez fournir le serial number concerné par le changement d''huile.'
                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
            --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
                    RETURN              
                END
            -----------------------------------------------
            -- Si serial number fourni, on récupère la 
            -- valeur di ComposantId correspondant.
            -- on traite seulement des transmissions
            -- car pour les moteurs et axles, il ne
            -- peut y avoir d'ambiguïté. 
            -----------------------------------------------
            IF @ComposantType = 't'   
               BEGIN
                   SET @ComposantId = 
                       (
                        SELECT y.ComposantId 
                        FROM   COMPOSANT_AFFECTATION AS x 
                          JOIN TRANSMISSION AS y ON x.ComposantId = y.ComposantId  
                        WHERE  x.LocalisationId = @CamionId
                           AND y.TransmissionNumeroSerie = @SerialNumber  
                       )
                    IF @ComposantId IS NULL
                        BEGIN
                            SET @Engueulade = @Engueulade + 'camion ''' + @CamionNumber + ''' : unknown serial number ''' 
                               + @SerialNumber + '''.' 
                            SELECT @Engueulade AS Engueulons, * FROM INSERTED
                    --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                            RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
                            RETURN              
                        END
               END
        END
      
    --- 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
    
    GO
    
    Il manque le ' après reargawr



    Citation Envoyé par fsmrel
    SET @ComposantType =
    (
    CASE
    WHEN lower(@ComposantTypeSource) = 'engine' THEN 'e'
    WHEN left(lower(@ComposantTypeSource),5) = 'trans' THEN 't'
    WHEN left(lower(@ComposantTypeSource),4) = '1int' THEN '1INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '2int' THEN '2INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '3int' THEN '3INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '4int' THEN '4INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '5int' THEN '5INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '6int' THEN '6INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '7int' THEN '7INTGAWR'
    WHEN left(lower(@ComposantTypeSource),4) = '8int' THEN '8INTGAWR'
    WHEN left(lower(@ComposantTypeSource),3) = 'frg' THEN 'frgawr'
    WHEN left(lower(@ComposantTypeSource),4) = 'rear' THEN 'reargawr <<<===========
    WHEN lower(@ComposantTypeSource) = 'tag' THEN 'tag'
    ELSE '?'
    END
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Ordigil
    Il manque le ' après reargawr
    Oui, c'est un copier-coller incomplet.
    (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

  12. #812
    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
    Maintenant que ça fonctionne, les ''WHEN left(lower(@ComposantTypeSource),5) = 'trans' THEN 't''' doivent être remplacé par 'Transmission' car dans mon pays on appelle une 'Transmission' une 'Transmission' LOL… Et vue que je travaille sur les Systèmes UNIX et que UNIX fait la différence entre Majuscule et Minuscule, par convention j'utilise toujours le premier caractère des mots saisie en Majuscule…


    Citation Envoyé par fsmrel Voir le message
    Oui, c'est un copier-coller incomplet.
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Ordigil
    Maintenant que ça fonctionne, les ''WHEN left(lower(@ComposantTypeSource),5) = 'trans' THEN 't''' doivent être remplacé par 'Transmission'
    et vu que je travaille sur les Systèmes UNIX et que UNIX fait la différence entre Majuscule et Minuscule, par convention j'utilise toujours le premier caractère des mots saisie en Majuscule
    Rien n’empêche que vous forciez l’utilisateur à saisir « Transmission ». Le WHEN, c’est de la programmation, c’est sous le capot et là tout est bon pour rattraper les saisies du genre « transssmission ». Les histoires de majuscule/minuscule, ça joue au niveau de la couche présentation, mais un trigger c’est du SQL, sous le capot donc, et ça n'est pas de l’UNIX.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

  14. #814
    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'utilise la même convention partout que ce soit sous Windows, Unix, Linux, Apache, Visual Basic, PHP, alors sous SQL j'utiliserai la même convention. Premier Caractère des Mots Saisie = Majuscule… Et c'est l'heure de votre dodo maintenant



    Citation Envoyé par fsmrel Voir le message
    Rien n’empêche que vous forciez l’utilisateur à saisir « Transmission ». Le WHEN, c’est de la programmation, c’est sous le capot et là tout est bon pour rattraper les saisies du genre « transsmission ». Les histoires de majuscule/minuscule, ça joue au niveau de la couche présentation, mais un trigger c’est du SQL, sous le capot donc, et ça n'est pas de l’UNIX.
      0  0

  15. #815
    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 tout ce que j'ai trouvé Je vais forcer l'utilisateur à entrer la première lettre de toutes les insert en Majuscule. Je veux voir toutes les entrées dans toutes les colonnes de la base de données avec le premier caractère en Majuscule. Dans la plupart des cas l'utilisateur sera forcé d'utiliser des listes déroulantes pour les Inserts de toute façon.


    SET @ComponentTypeSource = (SELECT ComponentType FROM INSERTED)
    
    SET @ComponentType = 
        (
         CASE
             WHEN @ComponentTypeSource = 'Engine' COLLATE French_CS_AS THEN 'e'
             WHEN @ComponentTypeSource = 'Transmission' COLLATE French_CS_AS  THEN 't'
             WHEN @ComponentTypeSource = '1Int' COLLATE French_CS_AS THEN '1INTGAWR'
             WHEN @ComponentTypeSource = '2Int' COLLATE French_CS_AS THEN '2INTGAWR'
             WHEN @ComponentTypeSource = '3Int' COLLATE French_CS_AS THEN '3INTGAWR'
             WHEN @ComponentTypeSource = '4Int' COLLATE French_CS_AS THEN '4INTGAWR'
             WHEN @ComponentTypeSource = '5Int' COLLATE French_CS_AS THEN '5INTGAWR'
             WHEN @ComponentTypeSource = '6Int' COLLATE French_CS_AS THEN '6INTGAWR'
             WHEN @ComponentTypeSource = '7Int' COLLATE French_CS_AS THEN '7INTGAWR'
             WHEN @ComponentTypeSource = '8Int' COLLATE French_CS_AS THEN '8INTGAWR'
             WHEN @ComponentTypeSource = 'Front' COLLATE French_CS_AS THEN 'FRGAWR'
             WHEN @ComponentTypeSource = 'Rear' COLLATE French_CS_AS THEN 'REARGAWR'
             WHEN @ComponentTypeSource = 'Tag' COLLATE French_CS_AS THEN 'TAG'
             ELSE '?'
         END
        )
    ---- pour debug ---- select @ComponentType as '@ComponentType'
    
    IF @ComponentType = '?'
        BEGIN
            SET @Engueulade = @Engueulade + 'Invalid component type - Please Be Aware Of Component Type Is Case Sensitive  ''' + @ComponentTypeSource + '''.'
            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
    
      0  0

  16. #816
    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 :-)
    Bonjour fsmrel

    J'ai fait une légère modification dans 'TRUCK_OIL_CHANGE_V' de 'DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH' pour que ce soit plus facile pour l'utilisateur de savoir quel 'Axle' il a fait le changement d'huile…

    
    SELECT   TruckVIN, TruckNumber
                       , CASE ComponentType
                         WHEN 'e' THEN 'Engine'
                         WHEN 't' THEN 'Transmission'
                         WHEN 'a' THEN
                          ( SELECT 'Axle  ' + '( ' + 
                            (
                             CASE
                                WHEN PositionCode = '1INTGAWR' THEN '1Int  '
                                WHEN PositionCode = '2INTGAWR' THEN '2Int  '
                                WHEN PositionCode = '3INTGAWR' THEN '3Int  '
                                WHEN PositionCode = '4INTGAWR' THEN '4Int  '
                                WHEN PositionCode = '5INTGAWR' THEN '5Int  '
                                WHEN PositionCode = '6INTGAWR' THEN '6Int  '
                                WHEN PositionCode = '7INTGAWR' THEN '7Int  '
                                WHEN PositionCode = '8INTGAWR' THEN '8Int  '
                                WHEN PositionCode = 'FRGAWR'   THEN 'Front'
                                WHEN PositionCode = 'REARGAWR' THEN 'Rear '
                                WHEN PositionCode = 'TAG'      THEN 'TAG  '
                                ELSE '?'
                             END
                             )
                                             + ' )' AS '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
                      , x.PositionCode
                     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 INNER JOIN
                                     dbo.AXLE_POSITION AS x ON v.PositionId = x.PositionId) AS z
    
    WHERE   (ComponentUninstallDate = CONVERT(DATETIME, '9999-12-31', 102))
    
    ;
    
    

    Si je fais ça, ça fonctionne…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    USE [DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH]
    
    GO
    
    BEGIN TRANSACTION
    
    
    INSERT INTO [dbo].[TRUCK_OIL_CHANGE_V]
               ([TruckNumber]
               ,[ComponentType]
               ,[OilChangeDate]
               ,[OilChangeMilleage])
         VALUES
               ('2540', 'Rear', '2018-05-09', 515560)

    Pièce jointe 436249


    Par contre, il y a quand même une erreur car je peux seulement faire un insert à la fois…. Sinon j'obtiens ça alors je dois reformuler pour ne retourner qu'une seule valeur mais j'ai essayé de plusieurs façons sauf la bonne. LoL : Msg 512, Level 16, State 1, Procedure TRUCK_OIL_CHANGE_V_INSERT_TR, Line 27 [Batch Start Line 3]
    La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Ordigil,


    Citation Envoyé par Ordigil
    il y a quand même une erreur car je peux seulement faire un insert à la fois….
    Comme dans le cas des autres triggers, on ne peut traiter que d’une ligne à la fois : je regarderai comment mettre en oeuvre un curseur qui permette de traiter des inserts multiples.
    (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. #818
    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
    Si vous ne voyez pas d'erreur dans la vue elle même, alors c'est ok puisque de toute façon l'utilisateur ne fera pas de multi inserts et dans les faits ça m'arrange… Je pensais que j'avais un problème dans la façon dont j'ai conçu la vue. Il y a d'autres vues où il serait plus utile de pouvoir faire du multi insert alors si vous approuvez la façon dont j'ai fait la vue alors ne vous cassez pas la tête avec le trigger pour cette vue, il fonctionne très bien de la façon dont vous l'avez conçu…. Je vais plutôt demander votre aide pour autre chose…




    Citation Envoyé par fsmrel Voir le message
    Bonsoir Ordigil,



    Comme dans le cas des autres triggers, on ne peut traiter que d’une ligne à la fois : je regarderai comment mettre en oeuvre un curseur qui permette de traiter des inserts multiples.
    Je vous montrerai demain car je n'ai pas encore tout à fait terminé. Bonne nuit fsmrel et faites de beaux rêves Merci encore pour tout…
      0  0

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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir Ordigil,


    Au sujet du trigger CAMION_HUILE_SUIVI_INSERT_TR, pourriez-vous secouer cette version qui prend en compte le multi inserts ?

    Même si au bout du compte vous préférez en rester au mono insert, vous pourrez voir la gestion faite du curseur ad-hoc. J’ai documenté pour que vous puissiez suivre en vous posant pas trop de questions…


    CREATE TRIGGER CAMION_HUILE_SUIVI_INSERT_TR ON CAMION_HUILE_SUIVI INSTEAD OF INSERT
    AS
    BEGIN
    
    DECLARE @CamionId AS INT ;
    DECLARE @CamionVIN AS VARCHAR(24) ;
    DECLARE @CamionNumber AS VARCHAR(6) ;
    DECLARE @SerialNumber AS VARCHAR(25) ;
    DECLARE @PositionId AS INT ;
    DECLARE @ComposantId AS INT ;
    DECLARE @ComponentSerialNumberInDataBase AS VARCHAR(25) ;
    DECLARE @ComposantTypeCode AS CHAR(1) ;
    DECLARE @ComposantTypeSource AS varchar(12) ;
    DECLARE @ComposantType AS VARCHAR(12) ;
    DECLARE @OilChangeDate AS DATE ;
    DECLARE @OilChangeMilleage AS INT ;
    DECLARE @trigger as varchar(64) = 'ENGINE_OIL_CHANGE_V_INSERT_TR'
    DECLARE @Engueulade as VARCHAR(256) = @trigger + ' - Oil change ; ' ;
    DECLARE @N AS INT ;
    
    ---- pour debug ---- select @trigger as '@trigger'
    ---- pour debug ---- select '' as INSERTED, * from INSERTED  
    
    --------------------------------------------------------
    -- Le curseur utilisé pour les inserts multiples,
    -- appliqué à INSERTED :
    ---------------------------------------------------------
    
    DECLARE theCurseur CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY 
        FOR SELECT CamionVIN, CamionNumber, ComposantType, SerialNumber, HuileChangementDate, HuileKm 
            FROM INSERTED ;
    
    OPEN theCurseur
    
    ---- pour debug ----select 'open csr' 
    
    -----------------------------------------------------
    -- Lecture de la 1re ligne de INSERTED
    -----------------------------------------------------
    
    FETCH theCurseur INTO @CamionVIN, @CamionNumber, @ComposantTypeSource, @SerialNumber, @OilChangeDate, @OilChangeMilleage
    
    ---- pour debug ---- select  @@FETCH_STATUS as ' @@FETCH_STATUS'
    
    WHILE @@FETCH_STATUS = 0
    
        -------------------------------------------------------------
        -- tant que le curseur produit,
        -- on traite la ligne correpondante de INSERTED
        -------------------------------------------------------------
    
        BEGIN
            ---  pour debug --- select 'un tour de manège' 
            ---- pour debug ---- select @CamionVIN as '@CamionVIN'
    
            ----------------------------------------
            -- Pour la ligne en cours :
            -- Récup de l'identification du camion
            -- en fonction de son numéro
            ----------------------------------------
    
            SET @CamionId =
                    (
                     SELECT CamionId
                     FROM   CAMION
                     WHERE  CamionNumber = @CamionNumber 
                    )
                    ;
             ---- pour debug ---- select @CamionId as '@CamionId'
    
            ------------------------------------
            -- On s'assure que le camion existe
            ------------------------------------
    
            IF @CamionId IS NULL
                BEGIN
                    SET @Engueulade = @Engueulade + '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
    
            ---- pour debug ---- select @ComposantTypeSource as '@ComposantTypeSource'
    
            ------------------------------------------------
            -- récup du composant type
            ------------------------------------------------
            SET @ComposantType =
                (
                 CASE
                     WHEN lower(@ComposantTypeSource) = 'engine' THEN 'e'
                     WHEN left(lower(@ComposantTypeSource),5) = 'trans' THEN 't'
                     WHEN left(lower(@ComposantTypeSource),4) = '1int' THEN '1INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '2int' THEN '2INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '3int' THEN '3INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '4int' THEN '4INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '5int' THEN '5INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '6int' THEN '6INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '7int' THEN '7INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),4) = '8int' THEN '8INTGAWR'
                     WHEN left(lower(@ComposantTypeSource),3) = 'frg' THEN 'frgawr'
                     WHEN left(lower(@ComposantTypeSource),4) = 'rear' THEN 'reargawr'
                     WHEN lower(@ComposantTypeSource) = 'tag' THEN 'tag'
                     ELSE '?'
                 END
                )
                ---- pour debug ---- select @ComposantType as '@ComposantType'
    
            --------------------------------------------------
            -- si le type dde composant est foireux, on dégage
            -- (comme le môme de l'Elysée)
            -------------------------------------------------- 
            IF @ComposantType = '?'
                BEGIN
                    SET @Engueulade = @Engueulade + ' camion ''' 
                        + @CamionNumber + ''' : Invalid component type ''' 
                        +  @ComposantTypeSource + '''.'
                    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
    
            ------------------------------------------
            -- On s'assure que Cézigue a fourni
            -- une date pour le changement d'huile,
            -- sinon on perd du temps pour rien...
            ------------------------------------------
    
            IF @OilChangeDate IS NULL
                BEGIN
                    SET @Engueulade = @Engueulade  + 'camion ''' + @CamionNumber 
                        + ''', composant de type ''' + @ComposantTypeSource
                        + ''' : veuillez fournir la date de changement d''huile.'
                    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
    
             ------------------------------------------------------------------
            -- Table locale @t servant à empiler pour un camion
            -- les identifiants des composants du type de composant
            -- fourni par Cézigue (moteur, transmission, axle positionné).
            -- En fait, cette table n'a d'intérêt que pour les transmissions,
            -- sachant que si Cézigue n'en fournit pas le numéro de série
            -- tandis qu'il y a plus d'une transmission pour le camion,
            -- alors on lui demandera de fournir ce numéro. Il s'agit d'un
            -- cas rare, mais pas impossible.   
            -- Un camion n'ayant qu'un seul moteur, on sait le déterminer,
            -- il est donc inutile que Cézigue en fournisse le numéro de série.
            -- Quant aux axles, là encore il est inutile que Cézigue en
            -- fournisse le numéro de série, puisqu'on sait déterminer 
            -- celui-ci en fonction de sa position sur le camion,
            -- position que Cézigue devra évidemment impértivement fournir.
            --
            -- La table @t n'est pas essentielle : pour le camion et le 
            -- type de composant en cours on pourrait se contenter d'un COUNT 
            -- des composants, mais à l'avenir on pourrait être intéressé
            -- de savoir quels sont ces composants. 
            ------------------------------------------------------------------
    
            DECLARE @t TABLE 
                (
                 ComposantId INT
                )
    
             -------------------------------------------------
             -- en cas d'insert multivalué, il faut
             -- virer ce qui a été empilé lors du tour        
             -- de manège précédent.
             -------------------------------------------------
    
             DELETE FROM @t 
            
             ----------------------------------------------------
             -- moteur ou transmission : empilement dans @t. 
             --
             -- Pour les axles, on atendra d'avoir traité
             -- de leur position sur le camion.
             ----------------------------------------------------
    
             IF @ComposantType IN ('e', 't')
                BEGIN
                    INSERT INTO @t 
                         SELECT DISTINCT x.ComposantId 
                         FROM   COMPOSANT_AFFECTATION AS x 
                           JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId  
                         WHERE  x.LocalisationId = @CamionId
                            AND LOWER(y.ComposantType) = @ComposantType 
                END
            ELSE
                --------------------------------------------
                -- axles - contrôles liés à leur position 
                -- et emplilement dans @t.
                --------------------------------------------
                BEGIN
                    SET @PositionId = (SELECT PositionId FROM AXLE_POSITION WHERE PositionCode = @ComposantType)
    
                    ---- pour debug ---- select @PositionId as '@PositionId'
    
                    -----------------------------------------------------------
                    -- on vérifie qu'il y a bien un axle à la position proposée
                    -----------------------------------------------------------
    
                    DECLARE @N2 AS INT
    
                    SET @N2 = (
                               SELECT COUNT(*)
                               FROM   COMPOSANT_AFFECTATION AS x 
                                 JOIN AXLE AS y ON x.ComposantId = y.ComposantId  
                               WHERE  x.LocalisationId = @CamionId
                                  AND x.PositionId = @PositionId
                              ) 
    
                    ---- pour debug ---- select @n2 as '@N2'
    
                    IF @N2 = 0
                        BEGIN
                            ------------------------------------------
                            -- Cézigue s'est gourré
                            ------------------------------------------
                            SET @Engueulade = @Engueulade + 'Camion ''' + @CamionNumber + ''' : '
                                + 'Il n''y a pas d''axle en position '''  
                                + @ComposantType + '''.'  -- + @ComposantTypeSource + ').'
                            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
    
                    ---------------------------------------------------
                    -- Il y a bien un axle à la position proposée,
                    -- on empile pour retrouver ensuite le traitement
                    -- valant pour tous les types de composants.
                    --------------------------------------------------- 
    
                    ELSE
                        BEGIN 
                            INSERT INTO @t  
                                SELECT DISTINCT x.ComposantId  
                                FROM   COMPOSANT_AFFECTATION AS x 
                                  JOIN AXLE AS y ON x.ComposantId = y.ComposantId  
                                WHERE  x.LocalisationId = @CamionId
                                   AND x.PositionId = @PositionId
    
                            ---pour debug --- select ''  as '@t !!', * from @t
                        END         
                ------------------------------------------------------
                -- terminé pour le contrôle de la position des axles 
                ------------------------------------------------------ 
                END
     
            --------------------------------------------------
            --
            -- Reprise des traitements communs à tous les
            -- types de cmposants
            --
            --------------------------------------------------
    
            ---- pour debug ---- select ''  as '@t', * from @t
    
            ------------------------------------------------------
            -- Rappel : à part le cas des transmissions (rare !),
            -- un composant n'a qu'un élément
            -- dans la pile des identifiants des composants.
            -------------------------------------------------------
    
    
            -------------------------------------------------------
            -- Normalement, Cézigue ne fournit pas le serial
            -- number d'un composant, mais s'il le fait, il faut
            -- s'assurer que c'est bien celui qui est connu
            -- dans la base de données.
            --
            -- A noter que dans le cas des transmissions, 
            -- s'il y en a plus d'une pour un camion, 
            -- il faudra gueuler en demandant
            -- à Cézigue de fournir le numéro de série de la
            -- transmission à huiler.  
            -------------------------------------------------------
    
            ---------------------------------------------------------
            -- Comme la variable locale @ComposantId n'a le droit de
            -- prendre qu'une valeur, alors que pour une transmision
            -- on peut en avoir deux, on utilise l'astuce "TOP 1"
            -- afin de ne pas se faire massacrer par SQL Server,
            -- sachant qu'on traitera plus loin du cas de deux
            -- transmissions pour un camion. 
            ---------------------------------------------------------
    
            SET @ComposantId = (SELECT TOP 1 ComposantId FROM @t)
    
            --- pour debug ---- select @ComposantId as '@ComposantId (TOP 1)'
    
            --------------------------------------------------------
            -- Le numéro de série du composant présent dans la base
            --------------------------------------------------------
    
            SET @ComponentSerialNumberInDataBase =
                CASE @ComposantType
                    WHEN 'e' then (select MoteurNumeroSerie from MOTEUR where ComposantId = @ComposantId) 
                    WHEN 't' then (select TransmissionNumeroSerie from TRANSMISSION where ComposantId = @ComposantId) 
                    ELSE  (select AxleSerialNumber from AXLE where ComposantId = @ComposantId) 
                END              
                --- pour debug ---- select @ComponentSerialNumberInDataBase as '@ComponentSerialNumberInDataBase (TOP 1)'
    
            -------------------------------------------------------
            -- S'il n'y a qu'un seul composant, tant mieux,
            -- c'est plus simple !
            -------------------------------------------------------
    
            SET @N = (SELECT COUNT(DISTINCT ComposantId) FROM @t)
    
            --- pour debug ---- select @N as '@N'
    
            IF @N = 1
                BEGIN
                    -------------------------------------------------------
                    -- On regarde si Cézigue a fourni un numéro de série.
                    -- Dans la négative, c'est bien, et on prend celui
                    -- qu'on a en base. S'il en a fourni un, on se doit
                    -- de vérifier qu'il a fourni celui qu'on a en base.
                    -------------------------------------------------------
    
                    IF @SerialNumber IS NULL OR LEN(TRIM(@SerialNumber)) > 0
                        BEGIN
                            SET @SerialNumber = @ComponentSerialNumberInDataBase
                        END
                    ELSE
                        BEGIN
                            ----------------------------------------------------
                            -- Si Cézigue a proposé un numéro de série et que
                            -- la base n'en contient qu'un pour le camion,
                            -- d'accord, mais à condition que Cézigue soit 
                            -- en phase avec la base.
                            ----------------------------------------------------
    
                            IF LOWER(@ComponentSerialNumberInDataBase) <> LOWER(@SerialNumber)
                                BEGIN
                                    SET @Engueulade = @Engueulade + 'Camion ''' + @CamionNumber + ''', ' + @ComposantType 
                                        + ' ; selon la base de données, le serial number correspondant n''est pas '''  
                                        + @SerialNumber + ''', mais ''' + @ComponentSerialNumberInDataBase + '''.'
                                    SELECT @Engueulade AS Engueulons, * FROM INSERTED
                            --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                                    RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
                                    RETURN
                                END
                        END
               END  -- fin de @N = 1
    
               -------------------------------------------------------
               -- S'il y a plus d'un composant possible, cas des
               -- transmissions, pour que l'ambiguïté soit levée, Cézigue 
               --  aura dû en fournir le numéro de série. 
               -------------------------------------------------------
    
            IF @N > 1
                BEGIN
                    --------------------------------------------------------------
                    -- On a plus d'une occurence de Composantid dans la table @t :
                    -- il s'agit de composants distincts (transmissions)
                    -- Pour qu'il n'y ait pas d'ambiguïté, Cézigue aura dû fournir 
                    -- le numéro de série du comosant en cours. S'il ne l'a pas  
                    -- fait, on l'engueule.
                    --------------------------------------------------------------
    
                    IF @SerialNumber IS NULL 
                        BEGIN
                            SET @Engueulade = @Engueulade + 'le camion ''' + @CamionNumber + ''' a ' + CAST(@N AS VARCHAR)
                                + ' composants de type ' +  @ComposantTypeSource
                                + ', veuillez fournir le numéro de série de celui dont l''huile est changée.' 
                            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 
      
                    ---------------------------------------------------------------
                    -- Cézigue a fourni un serial number, reste à vérifier qu'il
                    -- existe dans la base.
                    -- On recalcule @ComposantId, car celui obtenu initialement
                    -- avec TOP 1 n'est pas forcément le bon et n'est pertinent
                    -- que lorqu'un camion n'a qu'une seul composant du type
                    -- fourni par Cézigue. 
                    ---------------------------------------------------------------
    
                     SET @ComposantId = 
                         (
                          SELECT y.ComposantId 
                          FROM   COMPOSANT_AFFECTATION AS x 
                            JOIN TRANSMISSION AS y ON x.ComposantId = y.ComposantId  
                          WHERE  x.LocalisationId = @CamionId
                             AND y.TransmissionNumeroSerie = @SerialNumber  
                         )
                     ---- pour debug ---- select @ComposantId as '@ComposantId (@N > 1)'
                     
                     -------------------------------------------------------
                     -- Si Cézigue a fourni un numéro de série inconnu,
                     -- on dégage.
                     -------------------------------------------------------
    
                     IF @ComposantId IS NULL
                         BEGIN
                             SET @Engueulade = @Engueulade + 'Camion ''' + @CamionNumber + ''', ' + @ComposantTypeSource 
                                 + ' ; le serial number ''' + @SerialNumber    
                                 + ''', n''est pas connu. '
                             SELECT @Engueulade AS Engueulons, * FROM INSERTED
                            --------        RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer  
                             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests 
                             RETURN
                         END
                END   -- fin de @N > 1             
      
            --- pour debug ---- select @ComposantId as '@ComposantId'
    
            -----------------------------------------------------
            -- On s'assure que le composant n'a pas déjà
            -- fait l'objet d'un changement d'huile  à la date 
            -- fournie par Cézigue 
            -----------------------------------------------------
    
            DECLARE @Nchg as INT
    
            set @Nchg = 
                      (
                       SELECT COUNT(*) 
                       from   HUILE_CHANGEMENT
                       where  ComposantId = @ComposantId
                       and    HuileChangementDate = @OilChangeDate 
                      )
    
            if @Nchg > 0 
                begin
                    SET @Engueulade = @Engueulade + 'camion ''' + @CamionNumber + ''', ' + @ComposantTypeSource + ' ''' + @SerialNumber
                    ---------   + ' ' + lower(@ComposantTypeSource) 
                          + ''' : changement d''huile déjà effectué le ' 
                          + CAST(@OilChangeDate AS VARCHAR) 
                        + ' (au besoin, faites un update).'
                    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
    
    -------------------------------------------------------------
    
            --------------------------------------------------------------
            -- On insère une ligne 
            --------------------------------------------------------------
    
            ----pour debug   --- select 'on tente l''insert'
    
            INSERT INTO HUILE_CHANGEMENT
                      (
                       ComposantId
                     , HuileChangementDate
                     , HuileKm
                      )
    
                SELECT  @ComposantId
                      , COALESCE(@OilChangeDate, CAST('9999-12-31' as DATE))
                      , COALESCE(@OilChangeMilleage, 0)   -- attention à la division par zéro...
                 ;
    
            --------------------------------------------
            -- On entame le tour de manège suivant
            -- avec le curseur.
            --------------------------------------------
    
            ---- pour debug --- select 'fetch suivant' 
    
            FETCH theCurseur INTO @CamionVIN, @CamionNumber, @ComposantTypeSource, @SerialNumber, @OilChangeDate, @OilChangeMilleage   
    
            -- LOOP
       
        --------------------------------------------
        -- Fin du manège
        --------------------------------------------
    
        END         
    
    CLOSE theCurseur
    DEALLOCATE theCurseur
    
    END
    
    GO
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

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

  20. #820
    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
    Wowwwwwwww Merci pour ce cadeau de Noël Vous êtes vraiment une personne qui prend tout à cœur :-)
    Si vous allez visiter 'DZINDZIO_TRUCKS_MANAGEMENT_ENGLISH' vous remarquerez mon problème avec 'MAINTENANCE_REPAIRS', 'MAINTENANCE_REPAIRS_TYPE', 'MAINTENANCE_REPAIRS_PARTS', 'PARTS' et 'SHOPS_LIST'. J'ai inclus 'Maintenance et Repairs' ensembles qui sont devenus 'MAINTENANCE_REPAIRS' afin de me conformer au "Guide de Vérification Mécanique des Véhicules Lourds" qui fait office de loi au Canada. Je n'ai pas encore terminer mais j'ai quand même un problème. Ce que je veux c'est être capable pour une date précise et un kilométrage précis, d'effectuer plusieurs Maintenances et plusieurs Réparations à un même véhicule et à plusieurs adresses différentes. Exemple: Le 20 décembre 2018 en avant midi, je change un pneu sur le Camion 2540, je vérifie l'état des batteries, je change le pare-brise et je fais le changement d'huile du moteur. Le camion prend la route dans l'après-midi le 20 décembre 2018. dans la soirée, il casse un essieux. l'essieu est réparé dans un garage sur la route. Le camion revient à mon garage dans la soirée, je change l'huile dans l'autre différentiel (Essieu ) et je remarque qu'il y a un problème avec un ballon de la suspension sur l'essieu REAR côté droit. Le véhicule passe la nuit dans mon garage. Le lendemain matin je change le ballon de la suspension et je change le liquide de refroidissement du radiateur…



    Résumé :


    20 décembre 2018

    Camion : 2540
    Millage : 512678 Km

    Lieu : Montréal, Québec à mon Garage

    Réparation #1 : Changement Pneu Front Axle Right Side
    Réparation #2 : Changement Pare-Brise
    Maintenance #1 : Vérification État Batteries
    Maintenance #2 : Vérification État Alternateur
    Maintenance #3 : Changement Huile Moteur
    Maintenance #4 : Changement Filtres Carburant

    20 décembre 2018

    Camion 2540
    Millage = 513113 Km

    Lieu : Edmonton Nouveau-Brunswick

    Réparation #3 : Changement Roulement à Billes, Essieu 1INT Côté Gauche
    Maintenance #5 : Changement Huile + Filtre Essieu 1INT
    20 décembre 2018

    Camion : 2540
    Millage : 518034 Km

    Maintenance #6 : Changement Huile Différentiel REAR (Essieu REAR)

    21 décembre 2018

    Camion 2540
    Millage : 518034 Km

    Réparation #1 : Changement Ballon Suspension Essieu REAR Côté Droit
    Maintenance #1 : Changement Liquide Refroidissement



    Pourquoi dans notre base de données nous n'aurions pas 'Transmission Primaire' et 'Transmission Auxiliaire' ? Si le Camion a seulement une Transmission, il y aurait qu'un seul Numéro de Série dans 'Transmission' et si le Camion a une Transmission Auxiliaire, il aurait deux Numéros de Série dans 'Transmission'... De cette façon le trigger pour le changement d'huile trouverait lui-même les Numéro de Série des 2 Transmissions. Lorsqu'un Camion a deux Transmissions, une est toujours 'Primaire' et l'autre toujours 'Auxiliaire'. Les 2 Transmissions ne sont pas interchangeables car physiquement différentes. Une 'Primaire demeure toujours 'Primaire' et une Secondaire demeure toujours 'Auxiliaire'

    On a pas tellement le temps de texter au volant avec ce genre de Camion








    Joyeux Noel fsmrel et Joyeux Noel à tous



      1  0

Discussions similaires

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

Partager

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