Ниже запроса простой расчет на несколько таблиц и вставки данных, основанные на состоянии другой таблицыХотя цикл выполнения дополнительной даже после достижения состояния в 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 Проходит через цикл снова. Я знаю, что есть проблема с циклом, но не могу найти, где мне не хватает логики. Здесь является результатом запроса, ниже один с RecvdQty = 9 является дополнительным
Ваш код был бы * много * проще и быстрее, если вы использовали '' UPDATE', заявления INSERT' с правильной 'WHERE' и присоединиться положения. Курсор почти всегда является неправильным решением для задач SQL. –