2016-11-30 7 views
0

Ниже запроса простой расчет на несколько таблиц и вставки данных, основанные на состоянии другой таблицыХотя цикл выполнения дополнительной даже после достижения состояния в TSQL

DECLARE @CCODE nvarchar(30); 
DECLARE @OHQNTY INT; 
DECLARE @Itemid nvarchar(30); 
DECLARE @ITemlookupcode nvarchar(30); 
DECLARE @ExtDescription nvarchar(200); 
DECLARE @Department nvarchar(50); 
DECLARE @QtyRCV INT; 
DECLARE @DAYSCOUNT INT; 
DECLARE @DateRecive nvarchar(50); 
DECLARE @PoNumber nvarchar(50); 



DECLARE CUR CURSOR FOR 
SELECT [Code],[Onhand] FROM [dbo].[vwStockOnHand] WHERE code <300000; 

OPEN CUR 

FETCH NEXT FROM CUR INTO @CCODE,@OHQNTY 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    WHILE(@OHQNTY>0) 
    BEGIN 
     SELECT TOP(1) @Itemid=[Itemid],@PoNumber=[PoNumber],@ITemlookupcode=[ITemlookupcode], 
        @ExtDescription=[ExtDescription], 
        @Department=[Department],@QtyRCV=[QtyRCV],@DateRecive=[DateRecive] 
        FROM [dbo].[StockIn] 
        WHERE [email protected] AND [QtyRCV]>0 
        ORDER BY DateRecive DESC, PoNumber ASC; 

     SET @DAYSCOUNT= DATEDIFF(DAY,MAX(@DateRecive),GETDATE()); 

     IF (@QtyRCV >= @OHQNTY AND @OHQNTY>0) 
      BEGIN 
       -- INSERTING DATA 
       INSERT INTO [dbo].StockAging 
       (Itemid,ITemlookupcode,ExtDescription,Department,QtyRCV,DateRecive,DaysCount) 
       VALUES(@Itemid,@ITemlookupcode,@ExtDescription,@Department,@OHQNTY,@DateRecive,@DAYSCOUNT) 

       -- UPDATING 
       UPDATE [dbo].[StockOnHand] 
       SET [Onhand]=0 
       FROM [dbo].[StockOnHand] 
       WHERE [Code][email protected]; 

       UPDATE [dbo].[StockIn] 
       SET [QtyRCV]=0 
       FROM [dbo].[StockIn] 
       WHERE [email protected] AND [email protected]; 

       SET @OHQNTY=0; 
      END 
     ELSE IF (@OHQNTY > 0) 
      BEGIN 
       -- INSERTING DATA 
       INSERT INTO [dbo].StockAging 
       (Itemid,ITemlookupcode,ExtDescription,Department,QtyRCV,DateRecive,DaysCount) 
       VALUES(@Itemid,@ITemlookupcode,@ExtDescription,@Department,@QtyRCV,@DateRecive,@DAYSCOUNT) 

       -- UPDATING 
       UPDATE [dbo].[StockOnHand] 
       SET [Onhand]=[Onhand][email protected] FROM [dbo].[StockOnHand] 
       WHERE [Code][email protected]; 

       -- UPDATING 
       UPDATE [dbo].[StockIn] 
       SET [QtyRCV]=0 FROM [dbo].[StockIn] 
       WHERE [email protected] AND [email protected]; 

       SET @[email protected]@QtyRCV; 

      END 
    END 

    FETCH NEXT FROM CUR INTO @CCODE,@OHQNTY 
END 
    CLOSE CUR 
    DEALLOCATE CUR 

Я думаю, что код является сам объяснительный,

Проблема, с которой я сталкиваюсь, даже после достижения условия @OHQNTY> 0 Проходит через цикл снова. Я знаю, что есть проблема с циклом, но не могу найти, где мне не хватает логики. Здесь Result является результатом запроса, ниже один с RecvdQty = 9 является дополнительным

+0

Ваш код был бы * много * проще и быстрее, если вы использовали '' UPDATE', заявления INSERT' с правильной 'WHERE' и присоединиться положения. Курсор почти всегда является неправильным решением для задач SQL. –

ответ

0

Я вижу проблему в If п ..

IF (@QtyRCV >= @OHQNTY AND @OHQNTY>0) 
Begin 
set @OHQNTY=0 
End 

If Когда пункт не выполняется, в то время как ваш цикл продолжает executing..move установка @OHQNTY на внешней стороне If пункта

+0

Но вставка происходит внутри цикла if, поэтому, если это условие терпит неудачу, оно не должно вставлять какие-либо данные. я прав? – Developer

+0

Я не уверен в ваших данных, я не вижу никаких проблем с перемещением 'set @ OHQNTY = 0' вне контекста If – TheGameiswar

1

в IF (@QtyRCV >= @OHQNTY AND @OHQNTY>0)

обновить

UPDATE [dbo].[StockIn] 
SET [QtyRCV]=0 
FROM [dbo].[StockIn] 
WHERE [email protected] AND [email protected]; 

но вы "использовали" только @OHQNTY, так что я думаю, вы должны

UPDATE [dbo].[StockIn] 
SET [QtyRCV]=[QtyRCV]- @OHQNTY 
FROM [dbo].[StockIn] 
WHERE [email protected] AND [email protected]; 

также, у вас есть IF условие так

IF (@QtyRCV >= @OHQNTY AND @OHQNTY>0) BEGIN 
... 
END ELSE IF (@OHQNTY > 0) BEGIN 
... 
END 

но @OHQNTY > 0 бесполезно, он должен be

IF (@QtyRCV >= @OHQNTY) BEGIN 
... 
END ELSE BEGIN 
... 
END 

, наконец, я буду писать это так

IF (@QtyRCV >= @OHQNTY) BEGIN 
    @QtyUsed = @OHQNTY 
END ELSE BEGIN 
    @QtyUsed = @QtyRCV 
END 

-- INSERTING DATA 
INSERT INTO [dbo].StockAging 
(Itemid, ITemlookupcode, ExtDescription, Department, QtyRCV, DateRecive, DaysCount) 
VALUES(@Itemid, @ITemlookupcode, @ExtDescription, @Department, @QtyUsed, @DateRecive, @DAYSCOUNT) 

-- UPDATING 
UPDATE [dbo].[StockOnHand] 
SET [Onhand] = [Onhand] - @QtyUsed 
WHERE [Code][email protected]; 

UPDATE [dbo].[StockIn] 
SET [QtyRCV] = [QtyRCV] - @QtyUsed 
WHERE [email protected] AND [email protected]; 

SET @OHQNTY = @OHQNTY - @QtyUsed; 
Смежные вопросы