/****** Object: StoredProcedure [dbo].[p_increaseInventory] Script Date: 2017/11/7 星期二 7:49:27 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON 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赋值 * Modified by jzx on 2017-11-7 修改kwjbxx表时,增加sl>0条件,即cprkzl表插入记录触发器增加的零库存记录不考虑。 */ 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 AND a.sl>0 -- 2017-11-7 debug 增加sl>0的条件 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 TRIGGER [dbo].[t_wlRkzl_IU] ON [dbo].[cprkzl] --WITH ENCRYPTION FOR INSERT, UPDATE AS /** * 生成指令或修改入库指令的入库库位后,锁定指令操作的库位 * Created by 蒋智湘 ON 06-06-07 * Modified by 蒋智湘 ON 2007-03-09 调用库位上锁过程时,添加锁类型参数的值 * Modified by jzx on 2009-5-4 给cprkzl.qczt字段赋值。对应红字入库单,总是赋予0,否则根据总原库存数量是否为0设定是否0还是空值。 * Modified by jzx on 2014-11-3 对修改后入库库位为Null的处理。 * Modified by jzx on 2015-7-8 为了知道托盘在途过程中占用库位的库存情况,提前在安排库位的时候就插入零库存记录行 * Modified by jzx on 2015-12-13 支持插入的新指令记录的状态为完成状态时,无需锁定库位。这种情况用于处理不记账的入库记录日志 * Modified by jzx on 2016-3-15 因386项目电池托盘条码长度超过7个字符而修改代码 * Modified by jzx on 2016-3-17 debug:对于未关联入库单的入库指令,插入的库存的质量状态默认从cprkzl表的zlzt字段中获取,而不是强制为合格2; * 同时将cfwzxx字段也插入库存记录表 * Modified by jzx on 2016-7-17 更改jccs字段值的筛选条件更改了 * Modified by jzx on 2016-7-31 仅仅针对xnkw=0库位才记录库存数据;常温存放及其后续工序不需要改变检测次数字段的值 * Modified by jzx on 2016-8-7 为了提高效率,不再传电池编号到库存表,只能在电池信息表看电池。 * Modified by jzx on 2017-10-20 更改托盘编号变量的数据类型为varchar(50),而不是varchar(12) * Modified by jzx on 2017-11-7 插入的零库存记录,lpxx字段在386项目中注释掉了(386 lpxx字段存储的电池条码,实际累加库存时,不记录条码), 导致审核指令增加库存时,额外新增了记录行,恢复回来。 */ BEGIN DECLARE @ckmc type_ck --仓库代码 , @kwbh type_kwbh --库位编号 , @tpbh varchar(50) --托盘号 , @ckmc_old type_ck , @kwbh_old type_kwbh , @tpbh_old varchar(50) , @zlbh INT , @kcs type_sl , @v_pzbh varchar(30); SET NOCOUNT ON; IF UPDATE(kwbh) OR UPDATE(tpbh) OR UPDATE(ckmc)-- OR UPDATE(tpbh) BEGIN SELECT @ckmc_old = ckmc, @kwbh_old = kwbh, @tpbh_old = tpbh FROM deleted; SELECT @ckmc = ckmc, @kwbh = kwbh, @tpbh = tpbh, @zlbh = zlbh, @kcs = ykcs, @v_pzbh = pzbh FROM inserted WHERE zt!=2;-- 2015-12-13 jzx 如果插入的指令就是完成状态,则不用进行锁定处理 IF @kwbh_old IS NOT NULL AND (ISNULL(@kwbh,' ') <> @kwbh_old) BEGIN -- 锁定新库位 IF @kwbh IS NOT NULL BEGIN EXEC p_lockCell @ckmc, @kwbh, 'M', @zlbh, @kcs, 1 IF @@ERROR > 0 RETURN; END; --释放修改前的库位 EXEC p_unlockCell @ckmc_old, @kwbh_old, @zlbh -- 记录字段“是否取出”的值 UPDATE cprkzl SET qczt = CASE WHEN ykcs > 0 THEN 0 ELSE NULL END WHERE zlbh = @zlbh; END ELSE IF @kwbh_old IS NULL AND @kwbh IS NOT NULL --插入记录时,才会出现IS NULL的情况 BEGIN EXEC p_lockCell @ckmc, @kwbh, 'M', @zlbh, @kcs, 1 IF @@ERROR > 0 RETURN; -- 记录字段“是否取出”的值 UPDATE cprkzl SET qczt = 0 WHERE zlbh = @zlbh AND ykcs > 0; END IF (ISNULL(@kwbh_old, ' ') <> ISNULL(@kwbh, ' ')) OR (ISNULL(@tpbh_old, ' ') <> ISNULL(@tpbh, ' ')) BEGIN IF @kwbh_old IS NOT NULL DELETE cpkcxx FROM deleted z LEFT JOIN cprkd d ON z.pzbh = d.ysdh WHERE cpkcxx.sl = 0 AND cpkcxx.kwbh = z.kwbh AND cpkcxx.zlzt = ISNULL(d.zl, ISNULL(z.zlzt,'2')) AND cpkcxx.cpbh = z.cpbh AND ISNULL(cpkcxx.lpxx, ' ') = ISNULL(z.lpxx, ' ') AND ISNULL(cpkcxx.tpbh, ' ') = ISNULL(z.tpbh, ' ') AND cpkcxx.bz = ISNULL('入库单' + z.pzbh, '入库指令' + CAST(z.zlbh AS VARCHAR(12))); IF @kwbh IS NOT NULL BEGIN INSERT INTO cpkcxx (ckmc, kwbh, tpbh, zlzt, cpbh, lpxx, txm, sl, rksj, jldw, cpmc, cpgg1, cpgg2, cpgg3, jhj, wzlb, jzl, cfwzxx, bz) SELECT z.ckmc, z.kwbh, z.tpbh, ISNULL(d.zl, ISNULL(z.zlzt,'2')), z.cpbh,z.lpxx, MAX(z.txm), 0, GETDATE() , MAX(m.jldw), MAX(m.cpmc), MAX(m.cpgg1), MAX(m.cpgg2), MAX(m.cpgg3), MAX(m.jhj), MAX(m.wzlb) , MAX(ISNULL(z.bzl, m.jzl)), MAX(z.cfwzxx) , MAX(ISNULL('入库单' + z.pzbh, '入库指令' + CAST(z.zlbh AS VARCHAR(12)))) FROM inserted z LEFT JOIN cprkd d ON z.pzbh=d.ysdh LEFT JOIN cprkdmx m ON z.mxbh = m.mxbh JOIN kwjbxx k on z.kwbh = k.kwbh AND xnkw=0 -- 2016-7-31 WHERE NOT EXISTS(SELECT 2 FROM cpkcxx r WHERE r.kwbh = z.kwbh AND r.zlzt = ISNULL(d.zl, ISNULL(z.zlzt,'2')) AND r.cpbh = z.cpbh AND ISNULL(r.lpxx, ' ') = ISNULL(z.lpxx, ' ') AND ISNULL(r.tpbh, ' ') = ISNULL(z.tpbh, ' ') ) GROUP BY z.ckmc,z.kwbh,z.tpbh,d.zl,z.cpbh,z.lpxx,z.zlzt; END; END; END END go