Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Check record existence using Dynamic SQL
Message
From
30/07/2007 09:46:34
 
General information
Forum:
Microsoft SQL Server
Category:
Other
Environment versions
SQL Server:
SQL Server 2005
Miscellaneous
Thread ID:
01244442
Message ID:
01244545
Views:
13
Hi,
Below is the trigger and stored procedure. Please advice. Thank you
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
I am not the most powerful man in this world.
I am not the worst man in this world either.
I just as same as all of you.
I still need to learn from my mistakes...
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform