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


    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 --关闭原始数据主游标

  • 相关阅读:
    高并发系统如何设计
    PHP的垃圾回收机制(开启垃圾回收机制后的优缺点是什么)
    移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)
    家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)
    一天JavaScript示例-判定web页面的区域
    左右margin top问题百分比值
    Ubuntu14.04设备JDK
    三层架构,四大天王——删
    MEMO:UIButton 中的图片和标题 左对齐
    HDU 3874 离线段树
  • 原文地址:https://www.cnblogs.com/hn_lijia/p/11117759.html
Copyright © 2020-2023  润新知