CREATE TRIGGER [dbo].[T_PurchaseInvoices_UpdateQty] ON [dbo].[PurchaseInvoices] FOR UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here IF UPDATE(LocationID) OR EXISTS(SELECT * FROM deleted) BEGIN SELECT * INTO #inserted_tmp FROM inserted SELECT * INTO #deleted_tmp FROM deleted EXEC spHeaderUpdateQty 'PurchaseInvoiceDetails', 'PInvoiceID', default, '+', 'InStock' END SET NOCOUNT OFF END CREATE PROCEDURE [dbo].[spHeaderUpdateQty] @tablename VARCHAR(100), @primarykey VARCHAR(100), @locationfield VARCHAR(100) = 'LocationID', @addminus CHAR(1), @uom VARCHAR(20) = '' AS BEGIN DECLARE @row_count INT, @error_number INT, @error_message VARCHAR(255), @sql VARCHAR(4000) SET NOCOUNT ON; SET @sql = 'SELECT i.ItemID FROM ' + @tablename + ' p INNER JOIN Items i ON p.ItemID = i.ItemID INNER JOIN #inserted_tmp t ON p.' + @primarykey + ' = t.' + @primarykey + ' WHERE KeepStock = 1' EXEC (@sql) SELECT @row_count = @@rowcount IF (@row_count > 0) BEGIN SET @sql = 'UPDATE [dbo].[ItemLocations] SET Qty = CASE p.Draft WHEN 1 THEN i.Qty ELSE i.Qty ' + @addminus + ' ISNULL(dbo.GetQtyByUOM(t.UOMID, s.' + @uom + 'UOMID, t.Qty), t.Qty) END FROM [dbo].[ItemLocations] i, [dbo].[' + @tablename + '] t, [#inserted_tmp] p, [dbo].[Items] s WHERE s.ItemID = t.ItemID AND s.KeepStock = 1 AND p.' + @primarykey + ' = t.' + @primarykey + ' AND i.ItemID = t.ItemID AND i.LocationID = p.' + @locationfield EXEC (@sql) SELECT @row_count = @@rowcount IF @row_count = 0 BEGIN SELECT @error_number=50001, @error_message='No item qty is updated.' GOTO error END ELSE PRINT 'Qty updated' END SET @sql = 'SELECT i.ItemID FROM ' + @tablename + ' p INNER JOIN Items i ON p.ItemID = i.ItemID INNER JOIN #deleted_tmp t ON p.' + @primarykey + ' = t.' + @primarykey + ' WHERE KeepStock = 1' EXEC (@sql) SELECT @row_count = @@rowcount IF (@row_count > 0) BEGIN IF (@addminus = '+') BEGIN SET @addminus = '-' END ELSE BEGIN SET @addminus = '+' END SET @sql = 'UPDATE [dbo].[ItemLocations] SET Qty = CASE p.Draft WHEN 1 THEN i.Qty ELSE i.Qty ' + @addminus + ' ISNULL(dbo.GetQtyByUOM(t.UOMID, s.' + @uom + 'UOMID, t.Qty), t.Qty) END FROM [dbo].[ItemLocations] i, [dbo].[' + @tablename + '] t, [#deleted_tmp] p, [dbo].[Items] s WHERE s.ItemID = t.ItemID AND s.KeepStock = 1 AND p.' + @primarykey + ' = t.' + @primarykey + ' AND i.ItemID = t.ItemID AND i.LocationID = p.' + @locationfield EXEC (@sql) SELECT @row_count = @@rowcount IF @row_count = 0 BEGIN SELECT @error_number=50001, @error_message='No item qty is reverted.' GOTO error END ELSE PRINT N'Qty reverted.' END SET NOCOUNT OFF RETURN /* Error Handling */ error: RAISERROR @error_number @error_message ROLLBACK TRANSACTION SET NOCOUNT OFF END