OVH Cloud OVH Cloud

Pb avec TRIGGER

3 réponses
Avatar
chris81
bonjour

je souhiate faire un trigger pour mettre a jour un stock mais la sous
sql server je galere un peu

--A l'insertion (-) et a la suppression (+) d'une ligne dans le BL je
met a jour le nombre de piece detachée

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF INSERT
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] - :new.Qte
WHERE [Piece_Detachee].Id_PD = :new.Id_Article;
END

IF DELETE
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] + :old.Qte
WHERE [Piece_Detachee].Id_PD = :old.Id_Article;
END
END

En plus je ne trouve pas le FOR EACH ROW, est ce que c'est activé par
défaut?

En ce qui concerne les erreurs il me dit qu'il connait pas IF INSERT,
:new.

Qqun saurait il le corriger merci

3 réponses

Avatar
Fred BROUARD
Bonjour,

votre trigger devrait se résuler à :

CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF EXISTS(SELECT *
FROM inserted)
UPDATE Piece_Detachee
SET NbEnStock = LBL.NbEnStock - i.Qte
FROM Ligne_BL AS LBL
INNER JOIN inserted AS i
ON LBL.Id_PD = i.Id_Article
ELSE
UPDATE Piece_Detachee
SET NbEnStock = LBL.NbEnStock + d.Qte
FROM Ligne_BL AS LBL
INNER JOIN deleted AS d
ON LBL.Id_PD = i.Id_Article
END

REMARQUES :
1) dans SQL Server les pseudo tables new et old s'intitulent inserted et
deleted
2) il n'y a pas de FOR EACH ROW car le trigger est toujours ensemblistes.
Si vous voulez faire un code pour chaque ligne il faut implémenter un
curseur.


Lisez l'article que j'ai écrit sur les triggers SQL Server :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L5

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


chris81 a écrit :
bonjour

je souhiate faire un trigger pour mettre a jour un stock mais la sous
sql server je galere un peu

--A l'insertion (-) et a la suppression (+) d'une ligne dans le BL je
met a jour le nombre de piece detachée

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF INSERT
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] - :new.Qte
WHERE [Piece_Detachee].Id_PD = :new.Id_Article;
END

IF DELETE
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] + :old.Qte
WHERE [Piece_Detachee].Id_PD = :old.Id_Article;
END
END

En plus je ne trouve pas le FOR EACH ROW, est ce que c'est activé par
défaut?

En ce qui concerne les erreurs il me dit qu'il connait pas IF INSERT, :new.

Qqun saurait il le corriger merci




Avatar
JO
Fred BROUARD a présenté l'énoncé suivant :
Bonjour,

votre trigger devrait se résuler à :

CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF EXISTS(SELECT *
FROM inserted)
UPDATE Piece_Detachee
SET NbEnStock = LBL.NbEnStock - i.Qte
FROM Ligne_BL AS LBL
INNER JOIN inserted AS i
ON LBL.Id_PD = i.Id_Article
ELSE
UPDATE Piece_Detachee
SET NbEnStock = LBL.NbEnStock + d.Qte
FROM Ligne_BL AS LBL
INNER JOIN deleted AS d
ON LBL.Id_PD = i.Id_Article
END

REMARQUES :
1) dans SQL Server les pseudo tables new et old s'intitulent inserted et
deleted
2) il n'y a pas de FOR EACH ROW car le trigger est toujours ensemblistes.
Si vous voulez faire un code pour chaque ligne il faut implémenter un
curseur.


Lisez l'article que j'ai écrit sur les triggers SQL Server :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L5

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


chris81 a écrit :
bonjour

je souhiate faire un trigger pour mettre a jour un stock mais la sous sql
server je galere un peu

--A l'insertion (-) et a la suppression (+) d'une ligne dans le BL je met a
jour le nombre de piece detachée

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF INSERT
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] - :new.Qte
WHERE [Piece_Detachee].Id_PD = :new.Id_Article;
END

IF DELETE
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] + :old.Qte
WHERE [Piece_Detachee].Id_PD = :old.Id_Article;
END
END

En plus je ne trouve pas le FOR EACH ROW, est ce que c'est activé par
défaut?

En ce qui concerne les erreurs il me dit qu'il connait pas IF INSERT, :new.

Qqun saurait il le corriger merci







merci , ben c pluis simple sur oracle pf!!!!
Avatar
Fred BROUARD
JO a écrit :
Fred BROUARD a présenté l'énoncé suivant :
Bonjour,

votre trigger devrait se résuler à :

CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF EXISTS(SELECT *
FROM inserted)
UPDATE Piece_Detachee
SET NbEnStock = LBL.NbEnStock - i.Qte
FROM Ligne_BL AS LBL
INNER JOIN inserted AS i
ON LBL.Id_PD = i.Id_Article
ELSE
UPDATE Piece_Detachee
SET NbEnStock = LBL.NbEnStock + d.Qte
FROM Ligne_BL AS LBL
INNER JOIN deleted AS d
ON LBL.Id_PD = i.Id_Article
END

REMARQUES :
1) dans SQL Server les pseudo tables new et old s'intitulent inserted
et deleted
2) il n'y a pas de FOR EACH ROW car le trigger est toujours ensemblistes.
Si vous voulez faire un code pour chaque ligne il faut implémenter un
curseur.


Lisez l'article que j'ai écrit sur les triggers SQL Server :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L5

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


chris81 a écrit :
bonjour

je souhiate faire un trigger pour mettre a jour un stock mais la sous
sql server je galere un peu

--A l'insertion (-) et a la suppression (+) d'une ligne dans le BL je
met a jour le nombre de piece detachée

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER tg_MAJ_Stock_PD ON Ligne_BL AFTER INSERT,DELETE
AS
BEGIN
IF INSERT
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] - :new.Qte
WHERE [Piece_Detachee].Id_PD = :new.Id_Article;
END

IF DELETE
BEGIN
UPDATE [Piece_Detachee]
SET [NbEnStock] = [NbEnStock] + :old.Qte
WHERE [Piece_Detachee].Id_PD = :old.Id_Article;
END
END

En plus je ne trouve pas le FOR EACH ROW, est ce que c'est activé par
défaut?

En ce qui concerne les erreurs il me dit qu'il connait pas IF INSERT,
:new.

Qqun saurait il le corriger merci







merci , ben c pluis simple sur oracle pf!!!!




non, pas plus ni moins... différent !

A +







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************