légère tweaks basé sur Zohar's answer - nous sommes destinés à faire baisser les niveaux de stock basés sur ces achats, plutôt que vers le haut. Mais nous devons également tenir compte de ce qui se passe lorsque plusieurs lignes sont mises à jour et traitent le même ProductID
. Nous devons donc faire un peu d'agrégation aussi bien avant d'appliquer la mise à jour:
CREATE TRIGGER [dbo].[Trg_PurchaseDetails_After_Update] ON [dbo].[PurchaseDetails]
FOR UPDATE
AS
BEGIN
UPDATE P
SET Rate = I.SallingPrice,
Stock = Stock - (I.Quantity - D.Quantity)
FROM Product P
INNER JOIN
(SELECT ProductID,SUM(Quantity) as Quantity,
MAX(SallingPrice) as SallingPrice from Inserted group by ProductID) I
ON P.ProductID = I.ProductID
INNER JOIN
(SELECT ProductID,SUM(Quantity) as Quantity from deleted group by ProductID) D
on P.ProductID = D.ProductID
END
Notez aussi que je l'ai pensé qu'il est correct de prendre la valeur SallingPrice
maximale de toutes les valeurs mises à jour pour chaque produit. Si ce n'est pas correct, nous avons besoin d'une spécification plus claire de ce qui devrait arriver pour une mise à jour qui affecte plusieurs lignes avec la même valeur ProductID
.
Comme commentée ci-dessous la réponse de Zohar, votre logique conditionnelle est inutilement compliquée, puisque 4 - (5 - 7)
et 4 + (7 - 5)
produisent le même résultat, il n'y a pas besoin de passer autour de la soustraction entre les crochets et pour changer l'opérateur externe.
Pour comprendre ce que je parle de la nécessité d'agrégation, considérons le script suivant (qui utilise Siddique's answer):
create table dbo.Product (
ProductID int not null primary key,
Stock int not null,
Rate int not null
)
go
insert into dbo.Product(ProductID,Stock,Rate) values (1,49,5)
go
create table dbo.PurchaseDetails (
DetailsID int not null primary key,
ProductID int not null,
Quantity int not null,
SallingPrice int not null)
go
insert into dbo.PurchaseDetails (DetailsID,ProductID,Quantity,SallingPrice) values
(1,1,10,5),
(2,1,20,10)
go
CREATE TRIGGER [dbo].[Trg_After_Update] ON [dbo].[PurchaseDetails]
FOR UPDATE
AS
BEGIN
UPDATE Product SET Rate = I.SallingPrice,
Stock = (CASE
WHEN I.Quantity > D.Quantity
THEN (Stock - (I.Quantity - D.Quantity))
WHEN I.Quantity < D.Quantity
THEN (Stock + (D.Quantity - I.Quantity))
END)
FROM inserted I Inner join deleted D on I.DetailsID = D.DetailsID AND I.ProductID = D.ProductID
Where Product.ProductID = I.ProductID
END
go
update PurchaseDetails set Quantity = Quantity + 5
go
select * from Product
select * from PurchaseDetails
Le résultat est:
ProductID Stock Rate
----------- ----------- -----------
1 44 10
DetailsID ProductID Quantity SallingPrice
----------- ----------- ----------- ------------
1 1 15 5
2 1 25 10
Stock a été ajusté de 5 - mais nous avons ajusté deux rangées et le stock total aurait dû changer de 10 et non de 5.
Votre question n'a aucun sens. –
Aucun 'si 'nécessaire. Essentiellement les deux cas font 'Stock = Stock - D.Quantity + I.Quantity' – Serg