Partage
  • Partager sur Facebook
  • Partager sur Twitter

Eviter la superposition entre des dates

    28 février 2021 à 0:16:08

    Bonsoir,

    Tout d'abord, désolé si la question a déjà été posé mais je n'ai pas trouvé réponse. De plus, merci par avance a toute personne essayant d'y répondre.

    Voici mon problème:

    J'ai des heures de travail dans ma base de données (dateDebut et dateFin qui sont des dateTimes), je souhaiterai éviter qu'il y ait des superpositions lorsque vais introduire de nouvelle heures dans ma base de données. Pour cela, dans le cas ou j'ai une superposition j'aimerai pouvoir éviter de sauvegarder l'information dans ma base de donnée.

    Avez vous la solution à cette interrogation?

    Merci par avance de votre réponse.

    PS: on pourrait supposer que ma requête me retourne toutes les superpositions, dans le cas ou il y en aurait une, j'éviterai de sauvegarder les horaires et j'afficherai par exemple la tranche horaire déjà enregistré dans la base de donnée.

    • Partager sur Facebook
    • Partager sur Twitter
      28 février 2021 à 11:17:27

      Bonjour,

      Smogg a écrit:

      je souhaiterai éviter qu'il y ait des superpositions lorsque vais introduire de nouvelle heures dans ma base de données

      Il faut mettre en place un TRIGGER BEFORE INSERT ON et y faire le contrôle de cohérence des dates. Si superposition alors lever une erreur (SIGNAL) que tu traites côté application pour informer l'utilisateur et éventuellement lui proposer les horaires corrects.

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        28 février 2021 à 11:45:33

        Benzouye a écrit:

        Bonjour,

        Smogg a écrit:

        je souhaiterai éviter qu'il y ait des superpositions lorsque vais introduire de nouvelle heures dans ma base de données

        Il faut mettre en place un TRIGGER BEFORE INSERT ON et y faire le contrôle de cohérence des dates. Si superposition alors lever une erreur (SIGNAL) que tu traites côté application pour informer l'utilisateur et éventuellement lui proposer les horaires corrects.


        Merci beaucoup, auriez vous un exemple par hasard?

        En tout, j'ai 4 dates (dateDebut déjà introduit, dateFin déjà introduit) et les deux nouvelles dates que je veux introduire (dateDebut et dateFin).

        Cordialement

        • Partager sur Facebook
        • Partager sur Twitter
          28 février 2021 à 15:23:17

          https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

          A l'intérieur, tu fais un SELECT des enregistrements de la table en question qui pourraient chevaucher, si il y en a tu leves une erreur sinon tu continues.

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            28 février 2021 à 18:47:56

            Benzouye a écrit:

            https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

            A l'intérieur, tu fais un SELECT des enregistrements de la table en question qui pourraient chevaucher, si il y en a tu leves une erreur sinon tu continues.


            Merci, je suis sous symfony avec Doctrine, je ne vois pas trop comment le mettre en place. Mais je vais essayer de le faire
            • Partager sur Facebook
            • Partager sur Twitter
              28 février 2021 à 20:59:12

              Je ne pense pas que Doctrine permette de générer les TRIGGER, en même temps je ne connais pas cet ORM.

              A mon avis, il faudra le mettre en place directement côté base de données. Par contre c'est bien côté PHP qu'il faudra traiter le retour.

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                28 février 2021 à 23:19:07

                Benzouye a écrit:

                Je ne pense pas que Doctrine permette de générer les TRIGGER, en même temps je ne connais pas cet ORM.

                A mon avis, il faudra le mettre en place directement côté base de données. Par contre c'est bien côté PHP qu'il faudra traiter le retour.


                D'accord, j'essaye de le faire mais impossible. Je suis sous symfony, j'ai réussi a le faire pour une seule date en regardant s'il superpose les dates de réservations mais j'arrive pas avec 2 dates...
                • Partager sur Facebook
                • Partager sur Twitter
                  28 février 2021 à 23:23:50

                  Peux-tu poster le code du TRIGGER que tu as commencé ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    1 mars 2021 à 18:39:28

                    Voici ce que j'ai fait pour le moment

                    public function salarieAuTravail()
                        {
                            $now = new \DateTime('now');
                            //dd($now);
                            return $this->createQueryBuilder('p')
                                ->andWhere('p.dateDebut <= :now')
                                ->andWhere('p.dateFin >= :now')
                                ->setParameter('now', $now)
                                ->getQuery()
                                ->getResult()
                            ;
                        }



                    Mais j'avais déjà fait ça avant:


                    if($recherche->getDateFin() && $recherche->getDateDebut()){
                                $query =  $query
                                ->andWhere('NOT (:dateDebut BETWEEN r.dateDebut AND r.dateFin 
                                OR :dateFin BETWEEN r.dateDebut AND r.dateFin 
                                OR r.dateDebut >= :dateDebut AND r.dateFin <= :dateFin) 
                                OR r.dateDebut IS NULL AND r.dateFin IS NULL')
                                ->setParameter('dateFin', $recherche->getDateFin())
                                ->setParameter('dateDebut', $recherche->getDateDebut());
                            }


                    Qui marchait pas trop mal sur un autre projet





                    Benzouye a écrit:

                    Peux-tu poster le code du TRIGGER que tu as commencé ?




                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 mars 2021 à 18:47:18

                      Alors je ne pourrais t'aider côté Symfony, si tu veux continuer sur cette voie je te laisse créer un sujet dans le forum PHP.

                      Si tu veux essayer en pur SQL, tu peux faire cela :

                      DELIMITER &&
                      
                      CREATE TRIGGER controle_superpose
                      BEFORE INSERT ON nomdelatable
                      FOR EACH ROW
                      BEGIN
                      	IF EXISTS(
                      		SELECT *
                      		FROM nomdelatable
                      		WHERE
                      			dateDebut <= NEW.dateFin
                      			AND dateFin >= NEW.dateDebut
                      	) THEN
                      		SIGNAL SQLSTATE '26000'
                      			SET MESSAGE_TEXT = 'Il existe déjà des données sur cette période'
                      	END IF;
                      END&&
                      
                      DELIMITER ;

                      Ainsi, lorsque tu voudras insérer des dates superposées, tu recevras une erreur MySQL (ici code 26000 avec le message donné).

                      Tu as juste à traiter ce retour côté Symfony pour avertir ton utilisateur.

                      L'avantage principal c'est que personne ne pourra insérer des données incohérentes, notamment sans passer par ton app PHP ...

                      De manière générale on laisse la responsabilité de l'intégrité des données au SGBD, jamais à l'app ...

                      -
                      Edité par Benzouye 1 mars 2021 à 18:49:07

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        1 mars 2021 à 19:24:02

                        Merci beaucoup pour ta réponse, je vais essayer de potasser tout ça pour que ça fasse quelque chose.

                        J'espère arriver a faire quelque chose.


                        Benzouye a écrit:

                        Alors je ne pourrais t'aider côté Symfony, si tu veux continuer sur cette voie je te laisse créer un sujet dans le forum PHP.

                        Si tu veux essayer en pur SQL, tu peux faire cela :

                        DELIMITER &&
                        
                        CREATE TRIGGER controle_superpose
                        BEFORE INSERT ON nomdelatable
                        FOR EACH ROW
                        BEGIN
                        	IF EXISTS(
                        		SELECT *
                        		FROM nomdelatable
                        		WHERE
                        			dateDebut <= NEW.dateFin
                        			AND dateFin >= NEW.dateDebut
                        	) THEN
                        		SIGNAL SQLSTATE '26000'
                        			SET MESSAGE_TEXT = 'Il existe déjà des données sur cette période'
                        	END IF;
                        END&&
                        
                        DELIMITER ;

                        Ainsi, lorsque tu voudras insérer des dates superposées, tu recevras une erreur MySQL (ici code 26000 avec le message donné).

                        Tu as juste à traiter ce retour côté Symfony pour avertir ton utilisateur.

                        L'avantage principal c'est que personne ne pourra insérer des données incohérentes, notamment sans passer par ton app PHP ...

                        De manière générale on laisse la responsabilité de l'intégrité des données au SGBD, jamais à l'app ...

                        -
                        Edité par Benzouye il y a 32 minutes



                        • Partager sur Facebook
                        • Partager sur Twitter

                        Eviter la superposition entre des dates

                        × 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