Partage
  • Partager sur Facebook
  • Partager sur Twitter

trigger stock

Sujet résolu
    21 décembre 2011 à 16:09:15

    Bonjour,j'ai réalisé deux triggers sur mysql pour gérer le stock de mon matériel à savoir pour chaque entrée et pour chaque sortie.
    Toutefois, je dois sans doute avoir un problème de synthaxe au niveau du print si quelqu'un peut m'éclairer svp
    merci
    BEGIN
    declare s int;
    select s=stock from produit where new.ean=produit.ean;
    if (new.quantite_sortie>s) then
    print"impossible d'effectuer cette sortie,la quantité maximal est"+s;
    rollback;
    else 
    update produit set stock=stock-new.quantite_sortie
    where new.ean=produit.ean;
    end if;
    if produit.stock=0
    update produit set etat_prod="à commander";
    end if;
    end;
    


    Dans la première condition j'aimerait que si le stock sortie est supérieur au stock réel alors on annule l'insertion de cette sortie et on affiche un message mais je ne sais pas si je suis sur la bonne route
    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2011 à 17:40:43

      Avec ton trigger tu pourras empêcher l'insertion mais pas qualifier correctement l'erreur sauf si tu peux utiliser les SIGNAL implémentés dans mysql 5.5

      Ex, en version 5.1.
      structure:
      create table _account
      (
      	id int not null auto_increment primary key,
      	name varchar (200) not null,
      	credit float not null default 0,
      	unique key uk_name (name)
      )	engine = innoDB;
      
      create table _movement
      (
      	id int not null auto_increment primary key,
      	source_account int not null,
      	target_account int not null,
      	amount float not null,
      	ts timestamp,
      	constraint fk_movement_source foreign key (source_account) references _account (id),
      	constraint fk_movement_target foreign key (target_account) references _account (id)
      )	engine = innoDB;
      
      insert _account values (null, 'Jean', 100), (null, 'Paul', 100);
      
      delimiter |
      
      create trigger check_movement before insert on _movement for each row 
      begin
      	set @cs = (select credit from _account where id = NEW.source_account for update);
      	set @ct = (select credit from _account where id = NEW.target_account for update);
      
      	if @cs is null or @cs < NEW.amount then
                      -- moyen plutôt artificiel de faire planter l'insert.
      		SET NEW.source_account = 0;
      	end if;
      
      	update _account set credit = @ct + NEW.amount where id = NEW.target_account;
      	update _account set credit = @cs - NEW.amount where id = NEW.source_account;
      end
      |
      


      Test:
      insert _movement values (null, 1, 2, 70, null);
      -- ok
      insert _movement values (null, 1, 2, 70, null);
      -- plantage fk_movement_source
      


      A toi de voir, mais souvent mettre du code dans la base est une erreur. Les règles de gestion doivent être maintenue par l'applicatif (API).

      T.
      • Partager sur Facebook
      • Partager sur Twitter

      trigger stock

      × 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