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

SQL Procédural MySQL Discussion :

Trigger sous MySQL + calcul de TIME


Sujet :

SQL Procédural MySQL

  1. #1
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut Trigger sous MySQL + calcul de TIME
    Bonjour à tous,

    Je travaille avec une base MySQL et je me suis dit, tiens pourquoi ne pas faire un trigger pour calculer les valeurs de type temps mais ca coince, mon trigger ne me met pas d'erreur lors de l'execution mais le calcul ne se fait pas

    Je m'explique, j'ai deux tables que voici :

    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
    16
    CREATE TABLE `Jour` (
      `Id` int(10) unsigned NOT NULL,
      `Mois` varchar(20) NOT NULL,
      `Annee` int(10) unsigned NOT NULL default '0',
      `Jour` int(10) unsigned NOT NULL,
      `TotalDay` time default NULL,
      PRIMARY KEY  (`Id`,`Mois`,`Annee`,`Jour`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    CREATE TABLE `Mois` (
      `Id` int(10) unsigned NOT NULL,
      `Mois` varchar(20) NOT NULL,
      `Annee` int(10) unsigned NOT NULL default '0',
      `TotalMois` time default NULL,
      PRIMARY KEY  (`Id`,`Mois`,`Annee`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Je fais un trigger me permettant de mettre à jour TotalMois (Table Mois) en aditionnant tout les totalDay correspondant (TotalDay table Jour) lors d'un insert dans la table Jour, ce qui donne :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    DELIMITER //
     
    DROP TRIGGER Ajout//
    CREATE TRIGGER Ajout BEFORE INSERT ON Jour
    FOR EACH ROW
    BEGIN
      DECLARE done BOOLEAN DEFAULT FALSE;
      DECLARE dMat,fMat,dAprem,fAprem,tDay,total TIME;
      DECLARE curs CURSOR FOR SELECT DATE_FORMAT(TotalDay,GET_FORMAT(TIME,'ISO')) AS TotalDay2 FROM Jour WHERE Id=NEW.Id AND Annee=NEW.Annee AND Mois=NEW.Mois;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
     
      SET total = TIME('00:00:00');
     
      OPEN curs;
     
      curs_loop: LOOP
          FETCH curs INTO tDay;
          IF `done` THEN LEAVE curs_loop; END IF;
          SET total = TIME(total)+TIME(tDay);
      END LOOP curs_loop;
     
      INSERT INTO Mois (Id,Mois,Annee,TotalMois) VALUES (NEW.Id,NEW.Mois,NEW.Annee,total) ON DUPLICATE KEY UPDATE TotalMois=total;
     
      CLOSE curs;
     
    END//
    Mais le probléme c'est que le calcul ne se fait pas, j'ai toujours '00:00:00' alors que je devrais avoir un truc du genre '20:20:54'.

    J'ai essayé de convertir tout les temps en secondes puis de les additionner et de les reconvertir en TIME mais rien n'y fait.

    En fait, en y regardant de plus prés il me met une erreur qui est celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Column 'TotalMois' cannot be null
    Quelqu'un aurait-il la solution ???

    MERCI

  2. #2
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    'TotalDay' peut être NULL, or "TIME(NULL) = NULL" et "n'importe quoi+NULL = NULL"

    Donc il suffit d'un NULL à un moment donnée pour qu'il se propage jusqu'au résultat final et donne une erreur.

    Est-ce que quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET total = TIME(total) + TIME(IFNULL(tDay,0))
    marche ?

    Il me semble aussi qu'il y a bien plus de 'TIME()' que nécessaire.

  3. #3
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut
    MERCI pour ta réponse,

    je n'ais plus d'erreur mais j'ai '00:00:08' . Franchement je doute que ces valeurs :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    07:00:00
    07:00:00
    02:30:00
     
    04:00:00
    07:15:00
    06:00:00
    06:10:00
    03:00:00
     
     
    03:15:00
    06:45:00
    06:45:00
    07:15:00
    06:30:00
    04:30:00
    07:45:00
    07:30:00
    08:55:00
    11:50:00
     
     
    02:30:00
    08:45:00
    08:30:00
    Fasse '00:00:08' !!!!

    Je vais voir creuser dans cette direction (NOT NULL)...

  4. #4
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut
    Re, en fait j'ai changé Cette partie du code (rajout du if ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IF tDay IS NOT NULL THEN
            SET total = total+tDay;
          END IF;
    Cela ne me met plus 00:00:08 mais 08:30:00 qui est la derniére heure donné par la requéte (CF liste plus haut), pourquoi ne m'additionne t-il pas tout correctement ?

  5. #5
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut


    J'ai trouvé, en fait juste rajouter un addtime, ce qui donne :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    DELIMITER //
     
    DROP TRIGGER Ajout//
    CREATE TRIGGER Ajout BEFORE INSERT ON Jour
    FOR EACH ROW
    BEGIN
      DECLARE done BOOLEAN DEFAULT FALSE;
      DECLARE dMat,fMat,dAprem,fAprem,tDay TIME;
      DECLARE total TIME;
      DECLARE curs CURSOR FOR SELECT DATE_FORMAT(TotalDay,GET_FORMAT(TIME,'ISO')) AS TotalDay2 FROM Jour WHERE Id=NEW.Id AND Annee=NEW.Annee AND Mois=NEW.Mois;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
     
      SET total = '00:00:00';
     
      OPEN curs;
     
      curs_loop: LOOP
          FETCH curs INTO tDay;
          IF `done` THEN LEAVE curs_loop; END IF;
          IF tDay IS NOT NULL THEN
            SET total = addtime(total,tDay);
          END IF;
      END LOOP curs_loop;
     
      /*SET total = SEC_TO_TIME(total);*/
      INSERT INTO Mois (Id,Mois,Annee,TotalMois) VALUES (NEW.Id,NEW.Mois,NEW.Annee,total) ON DUPLICATE KEY UPDATE TotalMois=total;
     
      CLOSE curs;
     
    END//
    Merci pour la piste du not null
    A la prochaine galére
    Bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Editer un trigger sous mysql query
    Par valkiki dans le forum MySQL
    Réponses: 2
    Dernier message: 03/04/2009, 16h42
  2. aide creation trigger sous mysql
    Par bil.dev dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 08/02/2009, 23h18
  3. 1er Trigger sous MySQL quand on vient d'Oracle
    Par romulus dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 07/10/2008, 16h38
  4. Trigger sous MySQL
    Par champijulie dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/04/2007, 10h57
  5. Problème de Triggers sous Mysql 5
    Par petozak dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 14/08/2006, 10h18

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