8795 sujets

Développement web côté serveur, CMS

Bonjour à tous. J'ai un problème au niveau de la syntaxe d'un déclencheur MySQL...

En effet je vous décris le problèmes :
Avant d'insérer une absence (congés) on veut vérifier :
- Si la date de début est bien avant la date de fin
- Compter le nombre de jour en décomptant les jours fermés inclus dans la table jourFerme
- Réaliser l'insertion

Cependant MySQL me retourne une erreur 1064... Et j'avoue que je débute dans les triggers...

Voici le code du trigger :

delimiter //
Create trigger insertAbs on absence before Insert
FOR EACH ROW
      declare @nbJour integer;
      declare @nbDiff float;
      declare @nbDemiJour float;
Begin
  if(New.dateDebut < New.dateFin) then
      #On compte le nombre de jour fermé compris entre dateDeb et dateFin
      Select @nbJour = count(*) From jourferme where dateJour between New.dateDebut and New.dateFin;
      Select @nbDiff = DATEDIFF(Date_Format(New.dateDebut, %Y %m %d), Date_Format(New.dateFin, %Y %m %d));
      if(New.demiJourDeb = "am") && (New.demiJourFin = "am") then
          Set @nbDemiJour = 0.5;
        else if(New.demiJourDeb = "am") && (New.demiJourFin = "pm") then
          Set @nbDemiJour = 1.0;
        else if(New.demiJourDeb = "pm") && (New.demiJourFin = "pm") then
          Set @nbDemiJour = 0.5;
        else if(New.demiJourDeb = "pm") && (New.demiJourFin = "am") then
          Set @nbDemiJour = 1.0;
      end if;
      Insert Into absence (dateDebut, dateFin, nbrJour, demiJourDeb, demiJourFin, motif, etat, numEmploye, typeAbs) values(Date_Format(New.dateDebut, %Y %m %d), Date_Format(New.dateFin, %Y %m %d), @nbJour-@nbDiff+@nbDemiJour, New.demiJourDeb, New.demiJourFin, New.motif, New.etat, New.numEmploye, New.typeAbs);
    end if;
End//;
delimiter;


En vous remerciant par avance de votre aide... A très vite, merci à tous.
Modifié par TagadaGeo (20 May 2010 - 14:06)
A priori l'erreur 1064 correspond à une erreur de synthaxe.

Ne manque-t'il pas la clause "FROM" dans ta requête "Select @nbDiff" ?
Bonjour, tout d'abord merci à toi de m'avoir répondu... Aprés beaucoup de test, j'ai enfin réussi à appliquer mon Déclencheur.

Tu as en effet raison, il est bien question de syntaxe ici. Je joins le nouveau code qui fonctionne, cela peut alors être un exemple pour d'autres.

Pour rappel SGBD : MySQL


DELIMITER //
DROP TRIGGER IF EXISTS insertAbs //
CREATE TRIGGER insertAbs BEFORE INSERT ON absence
FOR EACH ROW
BEGIN
  DECLARE nbJour integer;
  DECLARE nbDiff float;
  DECLARE nbDemiJour float;
  DECLARE dateDeb date;
  DECLARE dateFin date;
  SET dateDeb = (SELECT DATE_FORMAT(New.dateDebut, "%Y %m %d"));
  SET dateFin = (SELECT DATE_FORMAT(New.dateFin, "%Y %m %d"));
  IF(New.dateDebut < New.dateFin)THEN
    SET nbJour = (Select count(*) From jourferme where dateJour between New.dateDebut and New.dateFin);
    SET nbDiff = (Select DATEDIFF(dateDeb, dateFin));
    IF(New.demiJourDeb = "am") && (New.demiJourFin = "am")THEN
      Set nbDemiJour = 0.5;
      ELSE
        IF(New.demiJourDeb = "am") && (New.demiJourFin = "pm")THEN
          Set nbDemiJour = 1.0;
          ELSE
          IF(New.demiJourDeb = "pm") && (New.demiJourFin = "pm")THEN
            Set nbDemiJour = 0.5;
            ELSE
            IF(New.demiJourDeb = "pm") && (New.demiJourFin = "am")THEN
              Set nbDemiJour = 1.0;
            END IF;
          END IF;
        END IF;
    END IF;
    Set nbJour = (nbJour+nbDiff+nbDemiJour);
    Insert Into absence (dateDebut, dateFin, nbrJour, demiJourDeb, demiJourFin, motif, etat, numEmploye, typeAbs) values(dateDebut, dateFin, ((nbJour-nbDiff)+nbDemiJour), New.demiJourDeb, New.demiJourFin, New.motif, New.etat, New.numEmploye, New.typeAbs);
  END IF;
End//
delimiter;


La syntaxe est super importante d'autant dire que la petite nouveauté c'est qu'il faut décomposer les confitions :

If(condition)THEN
Traitement
ELSE
IF(condition2)THEN
Traitement
ENDIF
ENDIF

Voila en te remerciant encore. A bientôt... Smiley biggrin