22,210
社区成员
发帖
与我相关
我的任务
分享
DECLARE @Xu TABLE(CusId VARCHAR(10) NOT NULL,Code VARCHAR(10) NOT NULL,Color VARCHAR(10) NOT NULL,Qty INT NOT NULL, Seq INT NOT NULL)
DECLARE @Gong TABLE(CusId VARCHAR(10) NOT NULL,Code VARCHAR(10) NOT NULL,Color VARCHAR(10) NOT NULL,Qty INT NOT NULL, Seq INT NOT NULL)
INSERT @Xu(CusId, Code, Color, Qty, Seq)
VALUES('HW','A','Red',100,1),
('HW','A','Red',60,2),
('HW','A','Red',55,3),
('HW','A','Red',66,4),
('HW','A','Blue',9,1),
('XW','B','Red',30,1),
('XW','B','Red',50,2),
('XH','C','Blue',100,1)
INSERT @Gong(CusId, Code, Color, Qty, Seq)
VALUES('HW','A','Red',150,1),
('HW','A','Red',80,2),
('HW','A','Red',60,3),
('HW','A','Blue',11,1),
('XW','B','Red',22,1),
('XW','B','Red',33,2)
DECLARE @result TABLE(CusId VARCHAR(10) NOT NULL,Code VARCHAR(10) NOT NULL,Color VARCHAR(10) NOT NULL,Qty INT NOT NULL, Seq INT NOT NULL,
CusId2 VARCHAR(10) NOT NULL,Code2 VARCHAR(10) NOT NULL,Color2 VARCHAR(10) NOT NULL,Qty2 INT NOT NULL, Seq2 INT NOT NULL,assignQty INT NOT null)
DECLARE @CusId VARCHAR(10),@Code VARCHAR(10),@Color VARCHAR(10),@Seq INT, @Qty INT,@remainQty INT
DECLARE @CusId2 VARCHAR(10),@Code2 VARCHAR(10),@Color2 VARCHAR(10),@Seq2 INT, @Qty2 INT, @remainQty2 INT
DECLARE @assignQty INT = 0
SELECT @Color='',@CusId='',@Qty=0,@remainQty=0,@Code='',@Seq=0
SELECT @CusId2='',@Code2='',@Color2='',@Seq2=0,@remainQty2=0,@Qty2=0
DECLARE @bNeedXu bit=1
DECLARE cursor_xu CURSOR FOR --定义游标
SELECT CusId, Code, Color, Qty, Seq FROM @Xu
ORDER BY CusId,code,Color,Seq
OPEN cursor_xu --打开游标
FETCH NEXT FROM cursor_xu INTO @CusId, @Code, @Color, @Qty, @Seq --抓取下一行游标数据
WHILE @@FETCH_STATUS = 0
BEGIN
IF @bNeedXu=1
BEGIN
if exists(select * from master..syscursors where cursor_name='cursor_gong')
begin
CLOSE cursor_gong --关闭游标
DEALLOCATE cursor_gong --释放游标
end
DECLARE cursor_gong CURSOR FOR
SELECT CusId, Code, Color, Qty, Seq FROM @Gong WHERE CusId=@CusId AND code = @code AND color =@color ORDER BY Seq
OPEN cursor_gong
FETCH NEXT FROM cursor_gong INTO @CusId2,@Code2,@Color2,@Qty2,@Seq2
SET @remainQty = @Qty
SET @remainQty2 = @Qty2
end
WHILE @@FETCH_STATUS=0
BEGIN
IF @remainQty>0
BEGIN
IF @remainQty<=@remainQty2 --如果满足需求
BEGIN
SET @assignQty = @remainQty
SET @remainQty2 = @remainQty2 - @assignQty
SET @remainQty = 0
INSERT @result(CusId, Code, Color, Qty, Seq, CusId2, Code2, Color2, Qty2,Seq2,assignQty)
VALUES(@CusId , @Code, @Color , @Qty , @Seq , @CusId2, @Code2 , @Color2,@Qty2, @Seq2, @assignQty)
END
ELSE --不能满足需求
BEGIN
SET @assignQty = @remainQty2
SET @remainQty = @remainQty - @assignQty
INSERT @result(CusId, Code, Color, Qty, Seq, CusId2, Code2, Color2, Qty2,Seq2,assignQty)
VALUES(@CusId , @Code, @Color , @Qty , @Seq , @CusId2, @Code2 , @Color2,@Qty2, @Seq2, @assignQty)
FETCH NEXT FROM cursor_gong INTO @CusId2,@Code2,@Color2,@Qty2,@Seq2
SET @remainQty2 = @Qty2
end
END
ELSE
GOTO NextXu
END
NextXu:
IF @remainQty2=0
SET @bNeedXu=1
ELSE
SET @bNeedXu = 0
--如果可供量为0,需求不为0则写入
IF @remainQty>0 AND @@FETCH_STATUS =-1
BEGIN
INSERT @result(CusId, Code, Color, Qty, Seq, CusId2, Code2, Color2, Qty2,Seq2,assignQty)
VALUES(@CusId , @Code, @Color , @Qty , @Seq , '', '' , '',0, 0, 0)
END
FETCH NEXT FROM cursor_xu INTO @CusId, @Code, @Color, @Qty, @Seq
SET @remainQty = @Qty
IF @CusId<>@CusId2 OR @Code<>@Code2 OR @Color<>@Color2
SET @bNeedXu=1
END
CLOSE cursor_xu --关闭游标
DEALLOCATE cursor_xu --释放游标
SELECT * FROM @result --ORDER BY CusId,Code,Color,Seq,Seq2