zoukankan      html  css  js  c++  java
  • 数据库中根据仓库数量拆分单据--通过游标实现

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

  • 相关阅读:
    面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
    线段树 | 第1讲 (给定区间求和)(转)
    C++中的静态多态和动态多态(转)
    ARP与RARP详细解析(转)
    排序算法之归并排序
    byte数组使用Arrays.asList转换List出错
    排序算法之希尔排序
    排序算法之冒泡排序、选择排序、插入排序
    Tomcat配置优化
    内连接、左外连接、右外连接、全外连接、交叉连接
  • 原文地址:https://www.cnblogs.com/hn_lijia/p/11117759.html
Copyright © 2011-2022 走看看