数据库中根据仓库数量拆分单据--通过游标实现

declare @yssl int --用来存储需要拆分的原始数
declare @name varchar(50) --原始表中的名称
declare m_canku cursor scroll for --定义一个原始数据游标
select name,sl from tbl_test --原始表数据
open m_canku --打开原始数据游标
fetch next from m_canku into @name,@yssl --循环游标
while @@FETCH_STATUS=0
begin
print @yssl
delete tbl_Temp --循环之前先清空临时表
/**** begin 将符合原始数据当前行中数据量的仓库过滤出来放到临时表中 *******/
insert into tbl_Temp(hz, sl,ckid) select hz,sl,id from (select a.id,a.hz,a.sl,(select sum(b.sl) as qqq from tbl_canku b where a.id>=b.id) as sumqty
from tbl_canku a) a
where id <= (select top 1 id from (select a.id,a.hz,a.sl,(select sum(b.sl) as qqq from tbl_canku b where a.id>=b.id) as sumqty from tbl_canku a
) a where a.sumqty>=@yssl)
order by a.id
/**** end ********/

declare m_cursor cursor scroll for --定义一个仓库子游标
select hz,sl,ckid from tbl_Temp --将过滤的数据放到仓库游标中

open m_cursor --打开子游标
declare @hz varchar(50), @sl int, @ckid int
fetch next from m_cursor into @hz,@sl,@ckid --开始循环子游标
while @@FETCH_STATUS=0
begin
declare @tempint int
if(@yssl>@sl)--如果原始数据中的数量大于仓库第一行的数量,则生成一条数据放到中间表中再运算后继续拆分
begin
if(@sl>0)
begin
insert into tbl_wuliao(name,hz,sl)values(@name,@hz,@sl) --将数据放到中间表中
set @yssl=@yssl-@sl;--由于原始数据中的数量比当前仓库的数据大所以需要运算后继续拆分第二条数据插入
update tbl_canku set sl=0 where id=@ckid --更新仓库数量
print '1'
end
end
else if(@yssl=@sl) --如果原始数据中的数量与当前仓库的数量先等则直接插入一条数据到中间表
begin
if(@sl>0) --过滤掉数量为0的数据
begin
insert into tbl_wuliao(name,hz,sl)values(@name,@hz,@sl)
--set @a=@a-@sl;
update tbl_canku set sl=0 where id=@ckid --更新仓库数量
print '1'
break
end
end
else --如果原始数据中的数量小于仓库第一行的数量,则直接拆分成一条数据放到中间表中再更新仓库数量
begin
if(@yssl>0)
begin
insert into tbl_wuliao(name,hz,sl)values(@name,@hz,@yssl)
update tbl_canku set sl=sl-@yssl where id=@ckid
print '2'
break
end
end
fetch next from m_cursor into @hz,@sl,@ckid
end
close m_cursor --关闭仓库子游标
deallocate m_cursor --关闭仓库子游标
fetch next from m_canku into @name,@yssl
end
close m_canku --关闭原始数据主游标
deallocate m_canku --关闭原始数据主游标

原文地址:https://www.cnblogs.com/hn_lijia/p/11117759.html