Partage
  • Partager sur Facebook
  • Partager sur Twitter

Difficultés de créer un trigger sous phpmyadmin

    15 janvier 2018 à 10:01:26

    Bonjour

    Mon précédent post a disparu car considéré comme du spam. Je pense que c'est parce que j'ai fait plusieurs modifs du texte trop rapidement.

    Ceci étant je n'arrive pas à créer un trigger pourtant assez facile

    Le principe est simple quand je mets à jour une date sur une table (date de la dernière visite) je veux mettre à jour la date de la prochaine revision en calculant la nouvelle date en fonction d'un durée exprimée en mois

    la requête d'origine donne ceci


    UPDATE `maintenance` SET `date_prochaine_visite` = DATE_ADD( `date_derniere_visite` , INTERVAL `periodicite` MONTH )

    Je veux la transformer à partir de la table maintenance ou se trouve la date de la dernière visite en trigger qui mette à jour la table cal_revision (calendrier des revisions) dans le champ date_revision

    J'ai réalisé de multiples essais qui aboutissent à des erreurs

    Par exemple, voici mon script

    SELECT `date_derniere_visite`, date_revision`
     
    FROM `maintenance`,`cal_revision`
     
    UPDATE `cal_revision`
     
    SET `date_revision` = DATE_ADD( `date_derniere_visite` , INTERVAL `periodicite` MONTH )
     
    WHERE `cal_revision.id_maintenance`=`maintenance.id`

    Si quelqu'un veut bien m'aider, je l'en remercie

    Bonne Journée

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2018 à 18:11:09

      Bonjour,

      Peux-tu nous donner la structure des tables concernées, ainsi qu'un exemple de données avant et après le passage du TRIGGER ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        15 janvier 2018 à 22:51:16

        Merci Benzouye

        C'est assez simple

        si je peux faire un trigger sur la même table je veux mettre à jour le champ date de la prochaine visite en calculant sa valeur à partir du champ dernière visite auquel j'ajoute le nombre de mois du champ periodicite

        Ci dessous copie de la table

        maintenance

        ColonneTypeNullDéfautCommentaires
        id smallint(5)<bdo dir="ltr" /> Non     
        marque tinytext<bdo dir="ltr" /> Non     
        cat_materiel tinytext<bdo dir="ltr" /> Non     
        lien_excel tinytext<bdo dir="ltr" /> Non     
        periodicite tinyint(4)<bdo dir="ltr" /> Non     
        date_derniere_visite date<bdo dir="ltr" /> Non     
        date_prochaine_visite date<bdo dir="ltr" /> Non    valeur calculee 

        Index

        Nom de l'indexTypeUniqueCompresséColonneCardinalitéInterclassementNullCommentaire
        PRIMARY BTREE Oui Non id 0 A Non  
        Ouvrir une nouvelle fenêtre phpMyAdmin

        Soit je dois impérativement utiliser deux tables et en ce cas j'ai crée une table cal_revision et je mets à jour le champ date_revision

        cal_revision

        ColonneTypeNullDéfautCommentaires
        id smallint(5)<bdo dir="ltr" /> Non     
        id_maintenance smallint(6)<bdo dir="ltr" /> Non     
        date_revision date<bdo dir="ltr" /> Non     

        Index

        Nom de l'indexTypeUniqueCompresséColonneCardinalitéInterclassementNullCommentaire
        PRIMARY BTREE Oui Non id 0 A Non  

        Merci de ton aide

        car je patine sur le sujet

        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2018 à 12:01:06

          Je pense que tu ne devrais pas calculer et stocker la date dans ta table, mais la calculer simplement lorsque tu en as besoin ...
          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            16 janvier 2018 à 12:21:59

            Bonjour Benzouye

            Il faut que j'ai la date de la prochaine révision en table.

            Je préfèrerais également l'avoir en trigger car il faudrait que chaque formulaire contienne le code et si l'on utilise d'autres sources que je ne contrôle pas comme un tableur excel en odbc cela va causer pb

            -
            Edité par PierreLiberas 16 janvier 2018 à 12:24:09

            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2018 à 13:59:43

              PierreLiberas a écrit:

              Il faut que j'ai la date de la prochaine révision en table

              Pourquoi ? Puisque c'est le résultat d'un calcul ... Autant la calculer chaque fois que tu en as besoin plutôt que de mettre en place une "usine à gaz" avec des triggers ...

              SELECT
                  id,
                  date_derniere_visite,
                  periodicite,
                  date_derniere_visite + INTERVAL periodicite MONTH AS date_prochaine_visite
              FROM maintenance;

              -
              Edité par Benzouye 16 janvier 2018 à 14:02:11

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                16 janvier 2018 à 15:20:24

                Merci Benzouye

                ton code fonctionne parfaitement sauf que je dois passer par un trigger car la base peut être consultée avec des front-end ou des applications tierces comme excel surs lesquels je ne peux intervenir.

                • Partager sur Facebook
                • Partager sur Twitter
                  16 janvier 2018 à 15:37:19

                  PierreLiberas a écrit:

                  la base peut être consultée avec des front-end ou des applications tierces comme excel surs lesquels je ne peux intervenir

                  Non, mais les utilisateurs peuvent mettre en place le calcul ... c'est une addition avec deux données qui sont présentes en base ...

                  Après, si tu veux vraiment ton trigger :

                  DELIMITER &&
                  
                  CREATE TRIGGER update_maintenance_date
                  AFTER INSERT ON cal_revision
                  FOR EACH ROW
                  BEGIN
                  	UPDATE maintenance
                  	SET date_prochaine_visite = NEW.date_revision + INTERVAL periodicite MONTH
                  	WHERE id = NEW.id_maintenance;
                  END&&
                  
                  DELIMITER ;

                  Mais c'est absurde ... Si tu insères une révision anti-datée, cela va fausser le truc ...

                  De plus, il faudrait également un TRIGGER AFTER UPDATE pour gérer les mises à jour de date ... pas top ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    16 janvier 2018 à 17:11:15

                    @Benzouye

                    Tu as raison il ne faut utiliser qu'une table pour "minimiser" les dégâts que peut entraîner la mise à jour. (même si cela ne résout pas tout)

                    J'ai donc modifié ton code, sans succès, pour créer un trigger sur la même table

                    DELIMITER &&
                     
                    CREATE TRIGGER update_maintenance
                    BEFORE UPDATE ON maintenance
                    FOR EACH ROW
                    BEGIN
                        UPDATE maintenance
                        SET prochaine_visite = NEW.derniere_visite + INTERVAL periodicite MONTH
                        WHERE id = NEW.id;
                    END&&
                     
                    DELIMITER ;


                    Le positif est que le trigger est enregistré sans erreur

                    Le négatif est qu'à l'usage mysql me renvoit une erreur #1442 voir ci-dessous

                    Merci Benzouye de ta patience et de tes conseils

                    Finalement j'ai trouvé le bon code en insérant la commande

                    BEGIN
                    SET NEW.prochaine_visite = NEW.derniere_visite + INTERVAL NEW.periodicite MONTH;
                    END

                    Cette instruction ne fonctionne qu'avec l'interface de phpmyadmin et je ne suis pas arrivé à la générer en sql avec le code complet; on verra une autre fois

                    Bonne soirée et merci encore

                    -
                    Edité par PierreLiberas 16 janvier 2018 à 18:20:36

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Difficultés de créer un trigger sous phpmyadmin

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown