USE [ASRS_WXZD_JYMH_CPK] GO -- 库位信息表增加“物资种类数”字段,用于标识库位上当前库存不同物资种类个数。不同产品、批次种类不同 ALTER TABLE kwjbxx ADD wzzls SMALLINT NOT NULL DEFAULT 0 GO -- 各类物资的出库方式都统一设定为整托出库 UPDATE wzlb SET chkufs = 2 WHERE chkufs != 2 go update sys_config set dqz='cpmc,cpbh' where id_pzx='ckdmx_input_srchFlds'; update sys_config set dqz='cpbh,cpmc,cpgg1,lpxx' where id_pzx='srkz.kctj.khzzd'; go SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[p_decreaseInventory] -- WITH ENCRYPTION AS /** * 在多个库位上递减库存的过程。 * 待递减的库存数据在临时表#deleted中。该临时表的内容在调用该过程前 * 由其他过程或触发器或其他SQL代码负责填入。 * * Created by 蒋智湘 on 2006-07-31 * Modified by 蒋智湘 on 2007-02-26 库位上库存总量的更新办法改成汇总库位库存总数后的值,而不是简单的递减 * Modified by jzx on 2009-4-12 保留零库位库存记录,达到记忆目的 * Modified by jzx on 2009-4-28 不再保留零库位库存记录,达到记忆目的。因为那样会出现很多零库存记录,操作者很烦。 * 但删除库存前,将零库存记录的库位号记录到cpxx表中 * Modified by jzx on 2009-8-22 更新库位信息表上新增kzjrks字段的值 * Modified by jzx on 2010-7-29 扣减库存前,检查库存,给出足够提示信息,而不是通过表上的约束来报错。 * Mofieid by jzx on 2010-9-17 删除对无效表inventory的操作 * Modified by jzx on 2011-5-10 取出库存表中je字段值的处理。该字段设计有问题 * Modified by jzx on 2011-6-30 修改库存不足错误抛出部分 * Modified by jzx on 2014-10-31 删除零库存记录时,仅对inserted表操作的库位处理,而不是整个当前库存表中所有的库位 * Modified by jzx on 2015-9-17 当库存扣减时,同时扣减字段“前批库存数”的值,当扣减后的前批库存数字段值小于等于0后, * 更新rksj字段值为“后批入库时间”字段的值。 * Modified by jzx on 2016-4-25 将删除另库存记录从最后移入到循环体中。整盘出库类项目的执行效率。 另外386项目的库存表上删除触发器有对删除记录的sl是否为0的特殊处理 * Modified by jzx on 2016-5-13 查找库存记录时,增加txm字段匹配条件 * Modified by jzx on 2017-10-18 给kwjbxx表上新增字段wzzls赋值 */ BEGIN DECLARE @ckmc type_ck, @kwbh type_kwbh, @v_txm varchar(30) , @kc_jlh INT, @cpbh nvarchar(50), @lpxx type_ph,@zlzt CHAR(1) , @sl type_sl, @v_kcsl type_sl, @v_jzl type_sl, @v_tpbh nvarchar(50) SET NOCOUNT ON; DECLARE @delete_0_inventory BIT; SELECT @delete_0_inventory = dqz FROM sys_config WHERE id_pzx='delete_0_inventory'; --修改库存时的游标 DECLARE c_kc CURSOR FOR SELECT kcjlh, ckmc, kwbh, cpbh, lpxx, zlzt, sl, jzl, tpbh, txm FROM #deleted; --遍历游标,修改库存 OPEN c_kc WHILE 1 = 1 BEGIN FETCH c_kc INTO @kc_jlh, @ckmc, @kwbh, @cpbh, @lpxx, @zlzt, @sl, @v_jzl, @v_tpbh, @v_txm IF @@FETCH_STATUS <> 0 BREAK; SET @v_kcsl = 0 --修改库位库存 SELECT @v_kcsl = sl, @kc_jlh = jlh FROM cpkcxx WHERE ckmc = @ckmc AND kwbh = @kwbh AND cpbh = @cpbh AND ISNULL(lpxx, ' ') = ISNULL(@lpxx, ' ') AND zlzt = @zlzt AND ISNULL(tpbh, ' ') = ISNULL(@v_tpbh, ' ') AND ISNULL(txm, ' ') = ISNULL(@v_txm, ' '); IF @v_kcsl < @sl BEGIN CLOSE c_kc; -- 2015-1-2 jzx 先关闭游标后抛出异常 DEALLOCATE c_kc; -- 2011-6-30 RAISERROR 不支持DECIMAL类型参数,只能先转换成字符串类型。%d只针对整数类型 DECLARE @v_kcslStr VARCHAR(20), @v_slStr VARCHAR(20) SET @v_kcslStr = @v_kcsl SET @v_slStr = @sl RAISERROR('库位 %s 上编码 %s 的当前库存数 %s 小于要出库的数量 %s', 16, 1, @kwbh, @cpbh, @v_kcslStr, @v_slStr) RETURN; -- 2015-1-2 jzx 将之前的break改成return END; -- 删除零库存记录 IF @delete_0_inventory = 1 BEGIN DELETE cpkcxx WHERE jlh = @kc_jlh AND sl = @sl; IF @@ROWCOUNT <= 0 UPDATE cpkcxx SET sl = sl - @sl, 前批库存数 = 前批库存数 - @sl , rksj = CASE WHEN 前批库存数<=@sl AND 后批入库时间>rksj THEN 后批入库时间 ELSE rksj END WHERE jlh = @kc_jlh; END ELSE BEGIN UPDATE cpkcxx SET sl = sl - @sl, 前批库存数 = 前批库存数 - @sl , rksj = CASE WHEN 前批库存数<=@sl AND 后批入库时间>rksj THEN 后批入库时间 ELSE rksj END WHERE jlh = @kc_jlh; END; --修改库位上的总数量,可追加入库数量,实际存放物资的质量状态 UPDATE kwjbxx SET zsl=ISNULL(sumsl, 0), kzjrks = kzjrks + @sl, sjwzlx=zl, wzzls=ISNULL(zls,0) -- 2009-8-22 jzx 增加kzjrks字段的修改 FROM (SELECT ckmc ck, kwbh kw FROM kwjbxx WHERE ckmc=@ckmc AND kwbh = @kwbh) A LEFT JOIN (SELECT ckmc ck2, kwbh kw2, SUM(sl) AS sumsl, MIN(zlzt) AS zl, COUNT(DISTINCT cpbh+ISNULL(lpxx,'')) zls FROM cpkcxx WHERE ckmc=@ckmc AND kwbh = @kwbh AND sl!=0 GROUP BY ckmc, kwbh)T ON A.ck=T.ck2 AND A.kw=T.kw2 WHERE ckmc = A.ck AND kwbh = A.kw AND zsl<>ISNULL(sumsl, 0) END CLOSE c_kc; DEALLOCATE c_kc; -- 记忆最近存放库位 IF EXISTS(SELECT 2 FROM sys_config WHERE id_pzx='update_cpxx_cfkw' AND dqz='1') UPDATE cpxx SET zjcfkw = kwbh FROM cpkcxx JOIN ckxx ON cpkcxx.ckmc = ckxx.dm AND ckxx.sfpk=0 WHERE cpxx.cpbh = cpkcxx.cpbh AND cpkcxx.sl = 0 AND ISNULL(zjcfkw, '') != kwbh; -- 删除零库存记录 2016-4-25 从386项目开始,将其移到前面循环里执行。 --IF EXISTS(SELECT 2 FROM sys_config WHERE id_pzx='delete_0_inventory' AND dqz='1') -- DELETE cpkcxx FROM (SELECT DISTINCT kwbh FROM #deleted) d WHERE sl=0 AND cpkcxx.kwbh=d.kwbh; END go ALTER PROCEDURE [dbo].[p_increaseInventory] -- WITH ENCRYPTION AS /** * 在多个库位上添加库存过程。 * 待加入的库存数据在临时表#inserted中。该临时表的内容在调用该过程前 * 由其他过程或触发器或其他SQL代码负责填入。 * * Created by jzx on 2006-07-31 * Modified by jzx on 2006-12-19 在库存表中增加对供应单位字段的存储 * Modified by jzx on 2007-02-26 库位上库存总量的更新办法改成汇总库位库存总数后的值,而不是简单的递减 * Modified by jzx on 2009-4-12 保留零库位库存记录,达到记忆目的 * Modified by jzx on 2009-4-28 不再保留零库位库存记录,达到记忆目的。因为那样会出现很多零库存记录,操作者很烦 * Modified by jzx on 2010-8-8 增加对库存备注信息的存储 * Modified by jzx on 2010-9-17 删除对无效表inventory的操作 * Modified by jzx on 2011-5-4 增加对jzl和txm的存储 * Modified by jzx on 2011-5-10 取出库存表中je字段值的处理。该字段设计有问题 * Modified by jzx on 2014-10-31 删除零库存记录时,仅对inserted表操作的库位处理,而不是整个当前库存表中所有的库位 * Modified by jzx on 2015-9-17 对cpkcxx表新增字段“前批库存数”和“后批入库时间”赋值;累加前库位为0的,则入库时间也更新 * Modified by jzx on 2016-3-16 给cpkcxx表的cfwzxx字段赋值。这个字段很早就有了,只是仅386项目开始才使用 * Modified by jzx on 2016-5-13 给cpkcxx表新增字段“预约出库时间”赋值;查找库存记录时,增加txm字段匹配条件 * Modified by jzx on 2016-7-16 给cpkcxx表新增字段rkzbsj(入库准备时间)字段赋值 * Modified by jzx on 2016-9-18 增加set nocount on语句 * Modified by jzx on 2016-11-5 debug:之前停用游标操作时,用的@zlzt变量值判断新库存记录的质量状态值,改成i.zlzt;同时把变量定义都注释掉 * Modified by jzx on 2016-12-23 优化代码,使用表变量。需要按照关键字段汇总临时表#inserted;增加piz字段存储 * Modified by jzx on 2017-2-17 计算预约出库时间改用关联新表sc_StandByDuration,而不是之前的sc_gwxx * Modified by jzx on 2017-2-18 debug: 之前没有给@cntInsert赋值,错误第给@cntUpdate赋值两遍 * Modified by jzx on 2017-10-18 给kwjbxx表上新增字段wzzls赋值 */ BEGIN SET NOCOUNT ON; DECLARE @cntAll INT, @cntUpdate INT, @cntInsert INT; DECLARE @inserted TABLE(cpbh type_cpbh, lpxx type_ph null, ckmc type_ck, kwbh type_kwbh, zlzt CHAR(1) , txm varchar(30) null, tpbh nvarchar(50) null , sl type_sl, rksj datetime, cfwzxx tinyint null, rkzbsj datetime null, yycksj datetime null , cpmc type_pm null, cpgg1 type_gg null, cpgg2 type_cz null, cpgg3 type_th null , jldw type_jldw null, wzlb type_wzlb null , gydw nvarchar(60) null, jhj type_dj null, jzl type_sl null, bz varchar(200) null , piz numeric(8,3),scrq DATETIME null,hth NVARCHAR(50) null,maoz NVARCHAR(50) null,hjzt NVARCHAR(50) null ,ywy NVARCHAR(50) null,mxcc NVARCHAR(50) null,gdh NVARCHAR(50) null,yt NVARCHAR(50) null, gx NVARCHAR(50) null, scfc NVARCHAR(50) null, bc NVARCHAR(50) null ); INSERT INTO @inserted SELECT i.cpbh, i.lpxx, MAX(i.ckmc), i.kwbh, i.zlzt, i.txm, i.tpbh , SUM(i.sl), MAX(i.rksj), MAX(i.cfwzxx), MAX(i.rkzbsj) --, DATEADD(MI, CASE WHEN i.zlzt IN('9','A') THEN S.gwcs8 ELSE S.gwcs2 END, MAX(i.rksj)) AS yycksj , DATEADD(MI, MAX(s.duration), MAX(i.rksj)) AS yycksj , MAX(i.cpmc), MAX(i.cpgg1), MAX(i.cpgg2), MAX(i.cpgg3), MAX(jldw), MAX(i.wzlb), MAX(i.gydw), MAX(i.jhj) , MAX(i.jzl), MAX(i.bz), MIN(i.piz),i.scrq,i.hth,i.maoz,i.hjzt,i.ywy,i.mxcc,i.gdh,i.yt,i.gx,i.scfc,i.bc FROM #inserted i --LEFT JOIN kwjbxx K ON i.kwbh = K.kwbh --LEFT JOIN sc_gwxx S ON CAST(K.hdh AS VARCHAR) + '#机'=S.gwid --GROUP BY i.kwbh,i.zlzt,i.cpbh,i.lpxx,i.txm,i.tpbh,S.gwcs8,S.gwcs2; LEFT JOIN sc_StandByDuration s ON i.wzlb=s.wzlb AND i.zlzt=s.dczt GROUP BY i.kwbh,i.zlzt,i.cpbh,i.lpxx,i.txm,i.tpbh,i.scrq,i.hth,i.maoz,i.hjzt,i.ywy,i.mxcc,i.gdh,i.yt,i.gx,i.scfc,i.bc -- 首先检查库位号是否没有填写的 SELECT @cntAll = count(*) FROM @inserted WHERE kwbh IS NULL OR LEN(kwbh) = 0; IF @cntAll > 0 BEGIN RAISERROR('未指定有效的库位号', 16, 1); RETURN; END; -- 再检查是否有记录存在。为了检查调用过程时,是否有外部程序删除了临时表记录 SELECT @cntAll = count(*) FROM @inserted; IF @cntAll = 0 BEGIN RAISERROR('待改动的库存记录数为0', 16, 1); RETURN; END; UPDATE cpkcxx SET sl = r.sl + i.sl , rksj = CASE WHEN r.sl<=0 THEN i.rksj ELSE r.rksj END , jldw = i.jldw , cpmc =i.cpmc , cpgg1=i.cpgg1 , cpgg2=i.cpgg2 , cpgg3= i.cpgg3 , jhj =i.jhj , wzlb = i.wzlb , gydw = ISNULL(i.gydw, r.gydw) , bz = ISNULL(i.bz, r.bz) , 前批库存数=r.sl , 后批入库时间=i.rksj , cfwzxx = i.cfwzxx , 预约出库时间 = i.yycksj , rkzbsj = i.rkzbsj , piz = i.piz , txm = i.txm ,scrq=i.scrq ,hth=i.hth ,maoz=i.maoz ,hjzt=i.hjzt ,ywy=i.ywy ,mxcc=i.mxcc ,gdh=i.gdh ,yt=i.yt ,gx=i.gx ,scfc=i.scfc ,bc=i.bc FROM cpkcxx r, @inserted i WHERE r.kwbh = i.kwbh AND r.zlzt = i.zlzt AND r.cpbh = i.cpbh --AND ISNULL(r.txm, ISNULL(i.txm, ' ')) = ISNULL(i.txm, ' ') AND ISNULL(r.lpxx, ' ') = ISNULL(i.lpxx, ' ') AND ISNULL(r.tpbh, ' ') = ISNULL(i.tpbh, ' '); SET @cntUpdate = @@ROWCOUNT; SET @cntInsert = 0; --set @cntUpdate = 0;; 2017-2-18 debug IF (@cntUpdate < @cntAll) BEGIN INSERT INTO cpkcxx (ckmc, kwbh, cpbh, lpxx, sl, zlzt, rksj, jldw, cpmc, cpgg1, cpgg2, cpgg3, jhj, wzlb, gydw, bz, jzl, txm , 前批库存数, 后批入库时间, tpbh, cfwzxx, 预约出库时间, rkzbsj, piz,scrq,hth,maoz,hjzt,ywy,mxcc,gdh,yt,gx,scfc,bc) SELECT i.ckmc, i.kwbh, i.cpbh, i.lpxx, i.sl, i.zlzt, i.rksj, i.jldw, i.cpmc, i.cpgg1, i.cpgg2, i.cpgg3, i.jhj, i.wzlb, i.gydw, i.bz, i.jzl, i.txm , 0, i.rksj, i.tpbh, i.cfwzxx, i.yycksj, i.rkzbsj, i.piz,i.scrq,i.hth,i.maoz,i.hjzt,i.ywy,i.mxcc,i.gdh,i.yt,i.gx,i.scfc,i.bc FROM @inserted i WHERE NOT EXISTS(SELECT 2 FROM cpkcxx a WHERE a.kwbh = i.kwbh AND a.zlzt = i.zlzt AND a.cpbh = i.cpbh --AND ISNULL(a.txm, ISNULL(i.txm, ' ')) = ISNULL(i.txm, ' ') AND ISNULL(a.lpxx, ' ') = ISNULL(i.lpxx, ' ') AND ISNULL(a.tpbh, ' ') = ISNULL(i.tpbh, ' ')); SET @cntInsert = @@ROWCOUNT; --SET @cntUpdate = @@ROWCOUNT;2017-2-18 debug END; -- 还要检查一次 IF @cntInsert + @cntUpdate != @cntAll BEGIN RAISERROR('插入和修改记录数之和不等于待处理记录总行数', 16, 1); RETURN; END; --修改库位上的总数量 UPDATE kwjbxx SET zsl=ISNULL(sumsl, 0), sjwzlx = t.zlzt, sfwzzl='M', wzzls=zls FROM (SELECT i.kw, SUM(a.sl) AS sumsl, MAX(a.zlzt) zlzt, COUNT(DISTINCT cpbh+ISNULL(lpxx,'')) zls FROM cpkcxx a JOIN (SELECT DISTINCT kwbh kw FROM @inserted) i ON a.kwbh = i.kw GROUP BY i.kw)T WHERE kwbh = t.kw; /* DECLARE @ckmc type_ck , @kwbh type_kwbh, @jldw type_jldw , @kc_jlh INT, @lpxx type_ph, @wzlb type_wzlb , @cpbh nvarchar(50), @rksl type_sl, @zlzt CHAR(1) , @cpmc varchar(80), @cpgg1 varchar(255), @cpgg2 type_cz, @cpgg3 type_th, @jhj type_dj , @pmh VARCHAR(10), @rksj datetime, @v_gydw NVARCHAR(60) , @v_kcsl type_sl, @v_kcbz VARCHAR(200), @v_jzl type_sl, @v_txm VARCHAR(30), @v_tpbh varchar(12) , @v_cfwzxx nvarchar(20), @txm varchar(30), @时长 INT, @rkzbsj DATETIME; DECLARE c_kc CURSOR FOR--修改库存时的游标 SELECT ckmc, kwbh, cpbh, lpxx, zlzt, txm , sl, cpmc, cpgg1, cpgg2, cpgg3, jhj, pmh, wzlb, jldw, rksj, gydw, bz, jzl, txm, tpbh, cfwzxx , rkzbsj FROM #inserted; --遍历游标,修改库存 OPEN c_kc WHILE 1 = 1 BEGIN FETCH c_kc INTO @ckmc, @kwbh, @cpbh, @lpxx, @zlzt, @txm, @rksl, @cpmc, @cpgg1, @cpgg2, @cpgg3 , @jhj, @pmh, @wzlb, @jldw, @rksj, @v_gydw, @v_kcbz, @v_jzl, @v_txm, @v_tpbh, @v_cfwzxx , @rkzbsj IF @@FETCH_STATUS <> 0 BREAK; IF @kwbh IS NULL OR LEN(@kwbh) = 0 -- 2016-5-13 增减库位编号是否为空值判断 BEGIN RAISERROR('未指定有效的库位号', 16, 1); BREAK; END; -- 2016-5-13 386项目特性。 SELECT @时长 = CASE WHEN @zlzt IN('9','A') THEN S.gwcs8 ELSE S.gwcs2 END FROM kwjbxx K, sc_gwxx S WHERE CAST(K.hdh AS VARCHAR) + '#机'=S.gwid AND kwbh = @kwbh; -- 检查是否有相同的库存记录 SET @kc_jlh = NULL SET @v_kcsl = NULL SELECT @kc_jlh = jlh, @v_kcsl = sl FROM cpkcxx WHERE kwbh = @kwbh AND zlzt = @zlzt AND cpbh = @cpbh --AND ISNULL(txm, ' ') = ISNULL(@txm, ' ') AND ISNULL(lpxx, ' ') = ISNULL(@lpxx, ' ') AND ISNULL(tpbh, ' ') = ISNULL(@v_tpbh, ' '); IF @kc_jlh IS NULL OR @v_kcsl = 0 BEGIN IF @v_kcsl = 0 UPDATE cpkcxx SET sl = sl + @rksl, jhj=@jhj, rksj = CASE WHEN sl<=0 THEN @rksj ELSE rksj END , 前批库存数=sl, 后批入库时间=@rksj , cpmc=@cpmc, cpgg1=@cpgg1, cpgg2=@cpgg2, cpgg3 = @cpgg3, jldw = @jldw, wzlb = @wzlb , gydw = ISNULL(@v_gydw, gydw) , bz = ISNULL(@v_kcbz, bz), tpbh = @v_tpbh , cfwzxx = @v_cfwzxx , 预约出库时间 = DATEADD(MI, @时长, @rksj) , rkzbsj = @rkzbsj WHERE jlh = @kc_jlh; --插入库位库存 ELSE BEGIN INSERT INTO cpkcxx (ckmc, kwbh, cpbh, lpxx, sl, zlzt, rksj, jldw, cpmc, cpgg1, cpgg2, cpgg3, jhj, wzlb, gydw, bz, jzl, txm , 前批库存数, 后批入库时间, tpbh, cfwzxx, 预约出库时间, rkzbsj) VALUES(@ckmc, @kwbh, @cpbh, @lpxx, @rksl, @zlzt, @rksj, @jldw, @cpmc, @cpgg1, @cpgg2, @cpgg3, @jhj, @wzlb, @v_gydw, @v_kcbz, @v_jzl, @v_txm , 0, @rksj, @v_tpbh, @v_cfwzxx, DATEADD(MI, @时长, @rksj), @rkzbsj); IF (@@ERROR <> 0) BREAK; END END ELSE BEGIN UPDATE cpkcxx SET sl=sl + @rksl, jhj=@jhj, 前批库存数=sl, 后批入库时间=@rksj --, cpmc=@cpmc, cpgg1=@cpgg1, cpgg2=@cpgg2, cpgg3 = @cpgg3, jldw = @jldw, wzlb = @wzlb , gydw = ISNULL(@v_gydw, gydw) , bz = ISNULL(@v_kcbz, bz) WHERE jlh = @kc_jlh; END --修改库位信息 UPDATE kwjbxx SET sjwzlx = @zlzt, sfwzzl='M' WHERE ckmc = @ckmc AND kwbh = @kwbh AND (sjwzlx <> @zlzt OR sjwzlx IS NULL OR sfwzzl IS NULL OR sfwzzl <> 'M'); --修改库位上的总数量 UPDATE kwjbxx SET zsl=ISNULL(sumsl, 0) FROM (SELECT ckmc ck, kwbh kw FROM kwjbxx WHERE ckmc=@ckmc AND kwbh = @kwbh) A LEFT JOIN (SELECT ckmc ck2, kwbh kw2, SUM(sl) AS sumsl FROM cpkcxx WHERE ckmc=@ckmc AND kwbh = @kwbh GROUP BY ckmc, kwbh )T ON A.ck=T.ck2 AND A.kw=T.kw2 WHERE ckmc = A.ck AND kwbh = A.kw AND zsl<>ISNULL(sumsl, 0) END CLOSE c_kc DEALLOCATE c_kc*/ IF EXISTS(SELECT 2 FROM sys_config WHERE id_pzx='delete_0_inventory' AND dqz='1') DELETE cpkcxx WHERE sl=0 AND kwbh IN(SELECT DISTINCT kwbh FROM @inserted); END go ALTER VIEW [dbo].[cpkcxx_v] AS /** * 查询所有可出库位的情况 * Created By jzx 2006-05-24 * Used by 出库指令生成界面;安排出库库位存储过程;ScglManager * Modified by jzx on 2006-12-19 增加供应单位字段的输出 * Modified by jzx on 2007-02-01 修改计划出库数来此未完成出库单的指令数量和,而不是通过触发器在库存表中记录的计划出库数 * 因为触发器实现有问题 * Modified by jzx on 2007-03-09 如果库位被锁定, 只要不是人工锁定,且是出库锁,也允许出库。有了计划出库数控制数量,这样设计是安全的 * Modified by jzx on 2010-8-8 增加备注信息字段输出 * Modified by jzx on 2010-8-25 库位号不会有NULL值,所以去掉对库位的ISNULL处理;对NULL值该用CASE WHEN 处理,而不是用和数据库相关的ISNULL函数 * Modified by jzx on 2010-8-26 检查未审核出库单时,仅检查7天内的。绝大多数情况下7天前的单子肯定是已经审核了, * 所以让系统去搜索7天前的未审核单子没有必要。 * Modified by jzx on 2011-6-14 增加对有带批次产品的支持,此时批号不为空,且出库时必须输入批号。 * Modified by jzx on 2011-6-18 增加输出字段:flagKzkw, xnkw, pai, lie, ceng;不再排除入库锁定的库位 * Modified by jzx on 2011-7-28 计划出库部分把未审核的转库指令也包含进来 * Modified by jzx on 2011-10-15 将txm作为库存记录的唯一值字段 * Modified by jzx on 2011-11-28 将cfwzxx作为库存记录的唯一值字段 * Modified by jzx on 2012-4-13 sfsd字段有等于"-2"的可能,因此不能用sfsd!=-1筛选手工锁定库位; 计划出库数添加sc_gcgzb部分的占用 * Modified by jzx on 2012-9-5 计算计划占用量时,剔除日期筛选条件;2005或更高版本的数据库支持条件索引, 可以通过创建zt=0的条件索引提高未审核单据的检索效率 * Modified by jzx on 2013-5-1 增加scJhbh字段输出 * Modified by jzx on 2013-5-29 增加piz,cpgg3字段输出 * Modified by jzx on 2013-12-25 关联库位信息表,滤掉(临时)无效库位对应的库存记录。 * Modified by jzx on 2014-9-16 增加storeDist字段输出 * Modified by jzx on 2014-10-13 增加wckw、nckw、hdh字段输出 * Modified by jzx on 2014-10-15 增加bzl字段输出 * Modified by jzx on 2014-11-22 返回的kwzsl在原来kwjbxx.zsl字段值的基础上扣减计划出库部分。 这样处理后,当一个库位多次安排出库时,程序判断出库指令是否为整盘出库指令的更加准确。 * Modified by jzx on 2014-12-9 增加输出字段:双伸位都有货 * Modified by jzx on 2015-10-10 只有出库自动锁定的库位可以加入结果集 * Modified by jzx on 2016-4-26 增加cfwzxx和piz字段输出 * Modified by jzx on 2016-5-13 增加“预约出库时间”字段输出 * Modified by jzx on 2016-6-18 增加“托盘个数”字段输出 * Modified by jzx on 2016-7-16 将READ PAST锁提示更改成NOLOCK。cpkcxx表的READ PAST提示删除 * Modified by jzx on 2017-10-18 增加ysbj(颜色标记)字段输出。1标识库位上存放的是拼箱,0标识正常单一物资 */ SELECT a.ckmc, a.kwbh, a.flagKzkw, a.xnkw, a.pai, a.lie, a.ceng, a.storeDist, b.cpbh, b.lpxx, B.sl - ISNULL(ck.jhcks,0) AS sl, b.jlh, b.tpbh, b.zlzt, b.cpmc, b.cpgg1, b.cpgg2, b.cpgg3, b.jldw, b.rksj, b.wzlb, a.sfsd AS sbh, a.zsl - ISNULL(ck2.jhcks2,0) AS kwzsl, b.gydw, b.bz, b.txm--, b.piz, b.cfwzxx, b.scJhbh , a.wckw, a.nckw, a.hdh, b.jzl bzl, a.双伸位都有货 , b.cfwzxx, b.piz, b.预约出库时间, a.托盘个数,b.scrq,b.hth,b.hjzt,b.ywy,b.mxcc,b.gdh,b.yt,b.gx,b.scfc,b.bc , CASE WHEN a.wzzls > 1 THEN 1 ELSE 0 END ysbj FROM dbo.cpkcxx AS b INNER JOIN dbo.kwjbxx(NOLOCK) AS a ON b.kwbh = a.kwbh AND a.sfyx=1 LEFT JOIN (SELECT zl, cpbh, lpxx, kwbh, tpbh/*, txm*/, SUM(jhcks) jhcks -- 库位限定物资的计划出库部分 FROM (SELECT D.zl, Z.cpbh, Z.lpxx, Z.kwbh, Z.tpbh/*, Z.txm*/, SUM(Z.sl) AS jhcks FROM ckzl(NOLOCK) Z INNER JOIN dbo.ckd(NOLOCK) D ON Z.pzbh = D.ckdh WHERE (D.zt = 0) AND (D.sflz = 1) GROUP BY D.zl, Z.cpbh, Z.lpxx, Z.kwbh, Z.tpbh--, Z.txm UNION ALL SELECT Z.zlzt zl, Z.cpbh, Z.lpxx, D.zckw kwbh, D.zctp tpbh/*, Z.txm*/, SUM(Z.sl) AS jhcks FROM cpZkzlMx(NOLOCK) AS Z INNER JOIN dbo.cpZkzl(NOLOCK) D ON Z.zlbh = D.zlbh WHERE D.zt != 2 GROUP BY Z.zlzt, Z.cpbh, Z.lpxx, D.zckw, D.zctp--, Z.txm ) AS T GROUP BY zl, cpbh, lpxx, kwbh, tpbh/*, txm*/) AS ck ON b.cpbh = ck.cpbh AND b.zlzt=ck.zl AND b.kwbh = ck.kwbh AND ISNULL(b.lpxx, ' ') = ISNULL(ck.lpxx, ' ') AND ISNULL(b.tpbh, ' ') = ISNULL(ck.tpbh, ' ') --AND ISNULL(b.txm, ' ') = ISNULL(ck.txm, ' ') LEFT JOIN (SELECT kwbh, SUM(jhcks) jhcks2 -- 库位所有物资的计划出库部分 FROM (SELECT Z.kwbh, SUM(Z.sl) AS jhcks FROM ckzl(NOLOCK) Z INNER JOIN dbo.ckd(NOLOCK) D ON Z.pzbh = D.ckdh WHERE (D.zt = 0) AND (D.sflz = 1) GROUP BY Z.kwbh UNION ALL SELECT D.zckw kwbh, SUM(Z.sl) AS jhcks FROM cpZkzlMx(NOLOCK) AS Z INNER JOIN dbo.cpZkzl(NOLOCK) D ON Z.zlbh = D.zlbh WHERE D.zt != 2 GROUP BY D.zckw ) AS T GROUP BY kwbh) AS ck2 ON b.kwbh = ck2.kwbh WHERE --a.sfsd >= 0 (a.sfsd = 0 OR (a.sfsd > 0 AND a.suolx=0)) AND (b.sl > ISNULL(ck.jhcks,0)) GO ALTER VIEW [dbo].[v_report_kctj] AS /** * 库存汇总查询视图。 * 329项目汇总库存数据不是来自库位库存表,而是物料供应商关系表。 * 考虑到其他项目会不一样,所以更改成使用视图方式,避免修改java代码。 * Created by jzx on 2014-9-22 * Used by 当前合格品/不良品库存汇总查询 * Modified by jzx on 2015-1-29 关联cpxx表,读取jxh字段 * Modified by jzx on 2016-4-13 增加kwbh字段输出 * Modified by jzx on 2016-4-21 增加tpbh字段输出 * Modified by jzx on 2016-5-13 debug:返回的ckmc字段值不是固定的'LTCK',而是去cpkcxx.ckmc字段值 * Modified by jzx on 2016-8-29 增加txm、cfwzxx输出字段 * Modified by jzx on 2017-10-18 增加cpgg1,cpgg2,cpgg3,pai,lie,ceng,hdh输出字段 */ SELECT cpbh,cpmc,cpgg1,cpgg2,cpgg3,pai,lie,ceng,hdh , CASE WHEN xnkw!=2 THEN sl ELSE 0 END AS ybzKcs , CASE WHEN xnkw=2 THEN sl ELSE 0 END AS dfqKcs , sl kczs, lpxx, wzlb, a.zlzt AS zlzt, a.ckmc , NULL AS jianc, a.gydw AS gysmc, NULL zjm, b.jxh , a.kwbh, a.tpbh, a.txm, a.cfwzxx , b.jldw jldw,a.jzl as jzl,a.bz as bz, CAST(a.sl/a.jzl AS DECIMAL(12,1)) js FROM cpkcxx a-- LEFT JOIN gysxx g ON a.lpxx = g.dm LEFT JOIN (SELECT jldw,cpbh cpid, jxh FROM cpxx) b ON a.cpbh=b.cpid LEFT JOIN (SELECT kwbh kwid, xnkw,pai,lie,ceng,hdh FROM kwjbxx) k ON a.kwbh=k.kwid WHERE a.sl!=0 GO ALTER PROCEDURE [dbo].[p_autoAllocateRetrieveCells] @p_dh type_dh , @p_mxbh INT = NULL --允许只自动安排某个出库单明细记录的出库库位。为NULL则表示指定出库单的所有明细 , @p_kcjlh INT = NULL -- 是否指定出指定记录号的库存记录明细。手动安排时会传递实际值 , @p_czr VARCHAR(20) = NULL -- WITH ENCRYPTION AS /** * 对选定出库单或其明细记录安排出库库位 * * Created by jzx on 2006-07-21 * Used by 出库单上的自动出库库位。 * Modified by jzx on 2006-10-20 提取可选库位时,不再需要批号相同;并将批号信息存入出库指令表中 * Modified by jzx on 2006-12-19 更改参数:去除仓库、库位,改用库存记录号;在出库指令中记录入库物资的供应单位 * Modified by jzx on 2006-12-28 在出库指令中记录对应出入库单单号(存入ckzl表上的pzbh字段) * Modified by jzx on 2009-8-13 增加对明细确定了供应单位时,所出库位只能是指定供应单位的那部分,而不是全部。 * 当明细确定了批号时,取指定批号的库位 * Modified by jzx on 2009-8-22 将库存记录上的入库时间转出到指令表上 * Modified by jzx on 2010-8-8 将库存备注信息带入ckzl表中 * Modified by jzx on 2010-8-25 使用配置项 ckkw.zdap.kwgs 的当前值,确定安排的库位个数 * Modified by jzx on 2010-9-15 共用同一库位的指令号时,仅对非虚拟库位适用 * Modified by jzx on 2011-6-19 零散数量默认从虚拟库位或者扩展库位上出 * Modified by jzx on 2011-8-6 当确定批次出库时,不再按入库时间排序 * Modified by jzx on 2011-11-4 在手工确定出库库存记录的情况下,不检查批号是否匹配 * Modified by jzx on 2011-11-28 单据记录筛选条件中增加D.sflz=1 * Modified by jzx on 2014-9-26 329项目,原包装小件拉动出库(ckd.clfs=1)时,需要往上取整整件出库。 * Modified by jzx on 2014-10-15 329 项目开始,在ckzl表中存储bzl字段值,该值来自库存记录表,而不是ckdmx表 * Modified by jzx on 2014-10-24 在指定批次的情况下,按入库时间排序时,只需要精确到日就可以了,不需要精确到秒; 外侧(靠巷道堆垛机一侧)库位优先安排出库。 * Modified by jzx on 2014-10-31 在wzlb表中指定特定类别的物料是整箱出库还是整盘出库,抑或是按实际需求数量出库 * Modified by jzx on 2014-11-6 当某种物料在立库平库都有时,立库库位优先安排。主要考虑特殊物料情况。 * Modified by jzx on 2014-11-11 拉动出库时,特殊物料库位也不能安排。特殊物料出库是在收货确认时在特殊库位上扣减库存 * Modified by jzx on 2014-12-9 仅在双伸位都有货时才优先安排浅库位(wckw is null)出库; 优先安排数量少的库位而不是多的库位,为的是尽量减少拣选回库。 * Modified by jzx on 2015-1-8 增加SET NOCOUNT ON代码行 * Modified by jzx on 2015-9-6 严格按照先进现出原则,即使安排的是深货位 * Modified by jzx on 2015-10-20 重新启用系统配置项ckkw.zdap.kwgs的作用,且只安排单个库位情况下,自动修改ckdmx.shsl字段值为实际安排数量的值 * Modified by jzx on 2015-10-21 前一次更新代码中忘记更新ckdmx.js字段值 * Modified by jzx on 2015-10-23 将ckd表上新增字段“限定出库口”的值作为ckzl表记录tpcrk字段值的默认值 * Modified by jzx on 2015-10-24 仅对自动生成的拉动出库单明细记录才自动修改ckdmx.shsl字段值为yapsl字段值 * Modified by jzx on 2015-11-20 安排立库实体库位时,如果设定的托盘出入库口不同,则不能共享指令编号 * Modified by jzx on 2015-12-8 增加参数p_czr,用于传递调用这个过程的管理系统登录账号 * Modified by jzx on 2015-12-11 当参数@p_kcjlh不为空时,允许安排出库的出库数量为0 * Modified by jzx on 2016-1-4 debug: 当需要在立库库位上安排零头出库时,计算立库库位出库整箱(向下取整)数量时,用错了变量。 * Modified by jzx on 2016-3-23 同一入库日期的,先按storeDist的值排序,然后再按sl排序 * Modified by jzx on 2016-4-26 处理ckdmx表新字段“限定出库托盘”对库位安排的影响;将cfwzxx,piz,txm字段存入ckzl表 * Modified by jzx on 2016-4-27 debug 上一次修改代码中,对限定出库托盘条件筛选处理语句有错误。 * Modified by jzx on 2017-10-18 整托出库安排方式,如果出库单明细中没有托盘上有的其他物资,也需要安排掉;同时给ckzl.ysbj字段赋值 */ BEGIN DECLARE @v_cpbh type_cpbh, @v_lpxx type_ph, @v_cksl type_sl, @v_zlsl type_sl, @v_kcsl type_sl , @v_mxbh INT, @v_zlbh INT, @v_zlbh_length TINYINT , @v_kcjlh INT --库存记录号 , @v_ckmc type_ck, @v_kwbh type_kwbh, @v_tpbh nvarchar(50), @v_zljlh INT --出库指令表的记录号 , @v_zlzt CHAR(1)--出库物资的质量状态 , @v_kwzsl type_sl --出库库位上所有物资的总数量 , @v_kckwxx CURSOR , @c_sl type_sl --cpkcxx数量 , @v_gydw NVARCHAR(60) , @v_kc_rksj SMALLDATETIME, @v_kcbz VARCHAR(200) , @v_config CHAR(1) , @v_ckck type_ck , @v_jzl INT , @v_kzkw TINYINT , @v_xnkw TINYINT , @v_hasXnkw TINYINT , @v_clfs CHAR(1) , @v_wzlb VARCHAR(15) , @v_zlsl2 type_sl , @v_chkufs TINYINT -- 出库方式:0按需出库;1整箱出库;2整盘出库 , @v_浅库位 type_kwbh -- 如果不为null,则表示遍历的库位为深库位 , @v_浅库位有货 BIT -- 标识浅库位是否有货 , @v_跳过的库位数 INT , @v_跳过内侧库位 TINYINT -- 0表示没有遍历到深库位;1表示跳过一次,试图先安排外侧库位;2表示跳过两次遍历,安排的库位数还不够,只好最后尝试安排深库位 , @v_tpcrk NVARCHAR(20) , @v_限定出库托盘 varchar(12) , @piz NUMERIC(8,3), @txm VARCHAR(30), @cfwzxx TINYINT, @v_ysbj TINYINT; DECLARE c_ckdmx CURSOR FOR SELECT M.mxbh, M.cpbh, M.lpxx, M.shsl - M.yapsl AS cksl, D.zl, M.ghs, M.lpxx, D.ckbh ckck , ISNULL(D.clfs,'0') clfs, M.wzlb, W.chkufs, D.限定出库口, M.限定出库托盘--, ISNULL(M.jzl, 1) jzl FROM ckdmx M INNER JOIN ckd D ON M.ckdh = D.ckdh AND D.zt = 0 AND D.sflz=1 LEFT JOIN wzlb W ON M.wzlb = W.dm WHERE (M.ckdh = @p_dh) AND (@p_mxbh IS NULL OR mxbh = @p_mxbh) AND (shsl > yapsl OR (@p_kcjlh IS NOT NULL)) ORDER BY M.cpbh, M.lpxx SET NOCOUNT ON; SELECT @v_config = dqz FROM sys_config WHERE ID_pzx = 'ckkw.zdap.kwgs'; OPEN c_ckdmx WHILE 1 = 1 BEGIN FETCH c_ckdmx INTO @v_mxbh, @v_cpbh, @v_lpxx, @v_cksl, @v_zlzt, @v_gydw, @v_lpxx, @v_ckck, @v_clfs, @v_wzlb, @v_chkufs , @v_tpcrk, @v_限定出库托盘--, @v_jzl IF @@FETCH_STATUS <> 0 BREAK; SET @v_跳过内侧库位 = 0; 单项库位安排: IF (@v_lpxx IS NOT NULL) SET @v_kckwxx = CURSOR FOR SELECT I.jlh, I.ckmc, I.kwbh, I.sl, I.tpbh, I.kwzsl, I.lpxx, I.gydw, I.rksj, I.bz, I.xnkw, I.bzl, I.wckw, I.双伸位都有货 , I.piz, I.txm, I.cfwzxx, ysbj FROM cpkcxx_v I WHERE I.cpbh = @v_cpbh AND I.zlzt = @v_zlzt AND I.ckmc = @v_ckck -- 2011-6-19 jzx 必须从指定仓库中出 AND ( (@p_kcjlh IS NULL --AND (@v_gydw IS NULL OR gydw = @v_gydw) -- 限定出指定供应商的产品 AND lpxx = @v_lpxx ) OR jlh = @p_kcjlh )-- 329项目开始:拉动出库时,不能安排特殊物料库位和待发区库位 -- 2015-12-14 jzx 如果用户手工选定了库位,则可以选择特殊库位 AND (@v_clfs NOT IN('1','2') OR I.xnkw NOT IN(2,CASE WHEN @p_kcjlh IS NULL THEN 3 ELSE 2 END)) AND (@v_限定出库托盘 IS NULL OR (@p_kcjlh IS NOT NULL OR tpbh=@v_限定出库托盘)) -- 2016-1-13 346碧陆斯项目开始支持制单的时候就限定出库托盘 ORDER BY xnkw,CAST(I.rksj AS DATE), storeDist, I.sl, ceng; ELSE -- 不限定批号出库 SET @v_kckwxx = CURSOR FOR SELECT I.jlh, I.ckmc, I.kwbh, I.sl, I.tpbh, I.kwzsl, I.lpxx, I.gydw, I.rksj, I.bz, I.xnkw, I.bzl, I.wckw, I.双伸位都有货 , I.piz, I.txm, I.cfwzxx, ysbj FROM cpkcxx_v I WHERE I.cpbh = @v_cpbh AND I.zlzt = @v_zlzt AND I.ckmc = @v_ckck -- 2011-6-19 jzx 必须从指定仓库中出 AND ( (@p_kcjlh IS NULL AND (@v_gydw IS NULL OR gydw = @v_gydw) -- 限定出指定供应商的产品 ) OR jlh = @p_kcjlh )-- 329项目开始:拉动出库时,不能安排特殊物料库位和待发区库位 -- 2015-12-14 jzx 如果用户手工选定了库位,则可以选择特殊库位 AND (@v_clfs NOT IN('1','2') OR I.xnkw NOT IN(2,CASE WHEN @p_kcjlh IS NULL THEN 3 ELSE 2 END)) AND (@v_限定出库托盘 IS NULL OR (@p_kcjlh IS NOT NULL OR tpbh=@v_限定出库托盘)) -- 2016-1-13 346碧陆斯项目开始支持制单的时候就限定出库托盘 ORDER BY xnkw,CAST(I.rksj AS DATE), storeDist, I.sl, ceng; OPEN @v_kckwxx WHILE @v_cksl > 0 OR @p_kcjlh IS NOT NULL -- 2015-12-11 jzx 库存记录号指定情况下,不受@v_cksl是否大于0限制 BEGIN FETCH @v_kckwxx INTO @v_kcjlh, @v_ckmc, @v_kwbh, @v_kcsl, @v_tpbh, @v_kwzsl, @v_lpxx, @v_gydw, @v_kc_rksj, @v_kcbz, @v_xnkw , @v_jzl, @v_浅库位, @v_浅库位有货, @piz, @txm, @cfwzxx, @v_ysbj IF @@FETCH_STATUS <> 0 BREAK; --确定指令上的出库数量。 SET @v_zlsl = CASE WHEN @v_kcsl >= @v_cksl THEN @v_cksl ELSE @v_kcsl END; -- 329项目特性:从立库出库的小件,需要向上取整,整包装出库 IF @v_jzl > 1 AND 1=@v_chkufs BEGIN SET @v_zlsl2 = CEILING(@v_cksl/@v_jzl) * @v_jzl; IF @v_kcsl >= @v_zlsl2 AND @v_zlsl <> @v_zlsl2 SET @v_zlsl = @v_zlsl2; END; ELSE IF 2=@v_chkufs -- 2014-10-31 支持整盘出库 BEGIN SET @v_zlsl = @v_kcsl; END; -- 2011-6-19 jzx 默认整件出库。不足一件时,则从虚拟货库位上出 ELSE IF @p_kcjlh IS NULL -- 未指定选用单个库存记录行的情况下(手工选择出库库位时,@p_kcjlh IS NOT NULL) AND @v_jzl > 1 AND @v_zlsl > @v_jzl AND @v_zlsl > floor(@v_zlsl/@v_jzl)*@v_jzl BEGIN IF @v_hasXnkw IS NULL BEGIN SET @v_hasXnkw = 0; IF EXISTS(SELECT 1 FROM cpkcxx_v I WHERE I.cpbh = @v_cpbh AND I.zlzt = @v_zlzt AND I.ckmc = @v_ckck -- 2011-6-19 jzx 必须从指定仓库中出 AND ISNULL(I.lpxx, ' ') = ISNULL(@v_lpxx, ' ') AND I.kwbh != @v_kwbh AND I.xnkw != 0 AND (@v_clfs NOT IN('1','2') OR I.xnkw NOT IN(2,3)) ) BEGIN SET @v_hasXnkw = 1; END; END; IF (@v_hasXnkw != 0) -- 说明存在虚拟库位库存记录 BEGIN -- 2016-1-4 jzx debug: 之前用错变量了,不应该是@v_cksl,而是@v_kcsl --SET @v_zlsl = FLOOR(@v_cksl/@v_jzl) * @v_jzl; SET @v_zlsl = FLOOR(@v_kcsl/@v_jzl) * @v_jzl; END; END; --确定指令号 SET @v_zlbh = NULL; --共用同仓库库位,状态为0的出库指令的指令号 IF @v_xnkw = 0 SELECT @v_zlbh = zlbh FROM ckzl WHERE ckmc = @v_ckmc AND kwbh = @v_kwbh AND zt = 0 AND ISNULL(tpcrk,' ') = ISNULL(@v_tpcrk, ' '); -- 2015-11-20 jzx 必须是同一个出入库口的任务 ELSE -- 虚拟库位共用指令号时,必须是同一出库单 SELECT @v_zlbh = zlbh FROM ckzl WHERE ckmc = @v_ckmc AND kwbh = @v_kwbh AND zt = 0 AND pzbh = @p_dh; --如果没有找到,则新增一个 IF @v_zlbh IS NULL EXEC p_instNoCreator @v_zlbh OUT, 1; --提取指令记录号 SET @v_zljlh = NULL SELECT @v_zljlh = MAX(jlh) + 1 FROM ckzl; IF @v_zljlh IS NULL SET @v_zljlh = 1 --设置出库指令单号(pzbh) SELECT @p_dh= ckdh FROM ckdmx H WHERE mxbh=H.mxbh AND mxbh=@v_mxbh; --得到库存可出数量 -07-12-15 --SELECT @c_sl=J.sl FROM cpkcxx J WHERE jlh = @v_kcjlh SET @c_sl = @v_kcsl; --插入出库指令 INSERT INTO ckzl(jlh, zlbh, mxbh, kcjlh, ckmc, kwbh, tpbh, ykcs, sl, hkzt,cpbh, lpxx, gydw,pzbh,zlzt ,pkcsl,kc_rksj, kcbz, bzl, tpcrk, czr, cfwzxx, piz, txm, ysbj) VALUES (@v_zljlh, @v_zlbh, @v_mxbh, @v_kcjlh, @v_ckmc, @v_kwbh, @v_tpbh, @v_kwzsl, @v_zlsl , CASE WHEN @v_kwzsl > @v_zlsl AND @v_chkufs!=2 THEN 0 ELSE NULL END -- 2017-10-18 增加 AND @v_chkufs!=2 条件 , @v_cpbh, @v_lpxx, @v_gydw, @p_dh,@v_zlzt , @c_sl,@v_kc_rksj, @v_kcbz, @v_jzl, @v_tpcrk, @p_czr, @cfwzxx, @piz, @txm, @v_ysbj); -- 2017-10-18 增加下面分支 IF @v_chkufs = 2 AND EXISTS(SELECT 2 FROM cpkcxx_v WHERE kwbh=@v_kwbh AND tpbh=@v_tpbh AND jlh!=@v_kcjlh AND sl>0) BEGIN DECLARE @v_mxbh2 INT; DECLARE c_kckwxxOther CURSOR FOR SELECT I.jlh, I.sl, I.cpbh, I.lpxx, I.gydw, I.rksj, I.bz, I.bzl , I.piz, I.txm, I.cfwzxx FROM cpkcxx_v I WHERE kwbh=@v_kwbh AND tpbh=@v_tpbh AND jlh!=@v_kcjlh AND sl>0; OPEN c_kckwxxOther; WHILE 1=1 BEGIN FETCH c_kckwxxOther INTO @v_kcjlh, @v_kcsl, @v_cpbh, @v_lpxx, @v_gydw, @v_kc_rksj, @v_kcbz , @v_jzl, @piz, @txm, @cfwzxx IF @@FETCH_STATUS <> 0 BREAK; SET @v_zljlh = @v_zljlh + 1; -- 如果单据明细上有其他批次的物料,则绑定明细到这条记录上 SET @v_mxbh2 = NULL; SELECT @v_mxbh2 = mxbh FROM ckdmx WHERE cpbh=@v_cpbh AND ckdh=@p_dh AND mxbh != @v_mxbh; INSERT INTO ckzl(jlh, zlbh, mxbh, kcjlh, ckmc, kwbh, tpbh, ykcs, sl, hkzt,cpbh, lpxx, gydw,pzbh,zlzt ,pkcsl,kc_rksj, kcbz, bzl, tpcrk, czr, cfwzxx, piz, txm, ysbj) VALUES (@v_zljlh, @v_zlbh, ISNULL(@v_mxbh2, @v_mxbh), @v_kcjlh, @v_ckmc, @v_kwbh, @v_tpbh, @v_kwzsl, @v_kcsl , NULL, @v_cpbh, @v_lpxx, @v_gydw, @p_dh, @v_zlzt , @v_kcsl,@v_kc_rksj, @v_kcbz, @v_jzl, @v_tpcrk, @p_czr, @cfwzxx, @piz, @txm, @v_ysbj); SET @v_cksl = @v_cksl - @v_kcsl; END; CLOSE c_kckwxxOther; DEALLOCATE c_kckwxxOther; END; --递减尚未安排出库的数量 SET @v_cksl = @v_cksl - @v_zlsl; IF @v_config = '1' -- 如果仅安排一个库位情况下,立马退出循环 BEGIN -- 2015-10-20 jzx 还要自动修改shsl字段值为yapsl -- 2015-10-21 jzx 还要更新js字段值 -- 2015-10-24 jzx 仅对自动拉动出库单的出库指令才修改shsl字段值 IF @v_clfs IN('2') UPDATE ckdmx SET shsl=yapsl,js=CAST(yapsl/jzl AS DECIMAL(10,1)) WHERE mxbh=@v_mxbh AND shsl<>yapsl; BREAK; END; SET @v_hasXnkw = NULL; END CLOSE @v_kckwxx; DEALLOCATE @v_kckwxx; IF @v_cksl > 0 AND @v_跳过的库位数 > 0 BEGIN -- 再次打开游标处理 SET @v_跳过内侧库位 = @v_跳过内侧库位 + 1; GOTO 单项库位安排; END; END CLOSE c_ckdmx DEALLOCATE c_ckdmx; END go