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
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
|
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.
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.