2017-03-07 1 views
-2

mon code actuel (ce qui est faux)Comment faire requête dynamique dans Triiger Dans Sql Server 2008

CREATE TRIGGER [dbo].[Trg_After_Update] ON [dbo].[PurchaseDetails] 
FOR UPDATE 
AS 
BEGIN 
    UPDATE Product SET Rate = I.SallingPrice, 
     [email protected] int=0; 
     --if(I.Quantity > D.Quantity) 
      [email protected] = I.Quantity - D.Quantity 
      --Stock = Stock - @Result 
     --ELSE 
      [email protected] = D.Quantity - I.Quantity 
      --Stock = Stock + @Result 
    FROM Inserted I inner join deleted D on I.DetailsID = D.DetailsID 
    WHERE ProductID = I.ProductID 
END 

Lorsque l'utilisateur mise à jour d'achat du projet de loi d'entrée, puis d'abord Cheack Que ancienne entrée quantité est inférieure ou supérieure à la quantité actuelle . Comptez ensuite Diffrence entre ancien et nouveau Quantité Puis jour l'enregistrement À plus ou petite quantité et Mines Et Plus à l'aide Si la condition

+1

Votre question n'a aucun sens. –

+1

Aucun 'si 'nécessaire. Essentiellement les deux cas font 'Stock = Stock - D.Quantity + I.Quantity' – Serg

Répondre

1

En supposant que je comprends la question, vous cherchez quelque chose comme ceci:

CREATE TRIGGER [dbo].[Trg_PurchaseDetails_After_Update] ON [dbo].[PurchaseDetails] 
FOR UPDATE 
AS 
BEGIN 
    UPDATE P 
    SET Rate = I.SallingPrice, 
     Stock = Stock - D.Quantity + I.Quantity 
    FROM Product P 
    INNER JOIN Inserted I ON P.ProductID = I.ProductID 
    INNER JOIN deleted D on I.DetailsID = D.DetailsID 
END 
+0

Ceci est l'expression C# qui vous aide à comprendre Login ... Stock = (I.Quantity> D.Quantity? (Stock - (I.Quantity -D.Quantity)): (Stock + (D.Quantity - I.Quantity))) –

+0

Vous pourriez utiliser le cas pour cela, mais je ne pense pas que vous devriez. Voulez-vous que j'ajoute l'expression de cas à la réponse? –

+0

@SiddiqueBagwan - c'est une façon d'écrire inutilement compliquée Stock = Stock - (I.Quantity - D.Quantity); Si «I.Quantity» est plus petit que «D.Quantity», alors «I.Quantity - D.Quantity» produit un nombre négatif dont la magnitude est exactement égale à «D.Quantity - I.Quantity». Et soustraire un nombre négatif équivaut à ajouter la valeur absolue de ce nombre négatif. –

0

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.

+0

@Zohar - des excuses pour le mauvais nom –

+0

Pas de problème :-) –

+0

Merci Bro For Solution .... –

0
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 
+0

Comme j'ai essayé de le souligner dans ma réponse, ce type de solution (ou Zohar) a un mauvais problème - Si plusieurs lignes sont mises à jour et font référence au * même * 'ProductID', ce' UPDATE' ne fera * pas * ce que vous attendez. Il appliquera une mise à jour à la table 'Product' (laquelle n'est pas connue) et ignorera les autres. En outre, comme les gens essaient à plusieurs reprises de vous le dire, cette logique conditionnelle n'est * pas * nécessaire.'5 - (-4)' est * déjà * égal à '5 + 4', par maths. –