/****** Object: Trigger [dbo].[t_wlRkzl_IU] Script Date: 2017/10/20 星期五 0:42:16 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON 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) */ 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; UPDATE sc_cells SET jccs=0 FROM inserted i WHERE cellNo=i.lpxx AND dczt!=i.zlzt -- AND dczt NOT IN('7','8','9') AND dczt NOT IN('9','A','B', 'C') AND i.zlzt<'A' -- 2017-7-31 jzx 常温存放及其后续工序不改变检测次数 AND jccs > 0 END -- 2016-8-7 从cpkcxx_IUD触发器移入这里 INSERT INTO sc_cells_binding_hist(jlsj,cellNo, NG_CODE, NG, oldTpbh, newTpbh, oldDczt, newDczt, oldCfwz, newCfwz, oldScsj, newScsj) SELECT getdate(),c.cellNo, c.NG_CODE, c.NG, c.tpbh, i.tpbh, c.dczt, i.zlzt, c.cfwz, i.cfwzxx, c.scsj, i.scsj FROM inserted i JOIN sc_cells c ON i.lpxx = c.cellNo JOIN cpxx ON i.cpbh = cpxx.cpbh AND cpxx.flagSfdc = 1 WHERE i.tpbh != c.tpbh AND i.sl>0; END go ALTER TRIGGER [dbo].[t_cpZkzl_IU] ON [dbo].[cpZkzl]-- WITH ENCRYPTION FOR INSERT, UPDATE AS /** * 生成指令或修改入库指令的入库库位后,锁定指令操作的库位 * Created by 蒋智湘 ON 06-07-31 * Modified by 蒋智湘 ON 2007-03-09 调用库位上锁过程时,添加锁类型参数的值 * Modified by jzx on 2011-10-12 支持空托盘的转库 * Modified by jzx on 2011-11-29 debug: 纠正插入指令时,转出库位不上锁问题,因为重复使用变量导致自动解锁。 * Modified by jzx on 2015-9-16 对于djbh LIKE 'cpZkzl.[1-9]% ckzl.[1-9]%'的库位修改处理; 修改后的库位如果就是转出库位,则不需要重新上锁 * Modified by jzx on 2015-9-17 一旦确定转入库位,就即时往转入库位插入零库存记录 * Modified by jzx on 2015-9-24 转入库位是有货库位时,调用p_lockCell过程时,传递的物资种类要取转入库位的物资种类 * 而不是之前取用@v_zcwzzl变量的值;将“inserted d JOIN inserted i”纠正为“deleted d JOIN inserted i” * Modified by jzx on 2016-3-15 因386项目电池托盘条码长度超过7个字符而修改代码 * Modified by jzx on 2017-10-20 更改托盘编号变量的数据类型为varchar(50),而不是varchar(12) */ BEGIN DECLARE @zcck type_ck --仓库代码 , @zckw type_kwbh --库位编号 , @zrck type_ck , @zrkw type_kwbh , @v_zrck type_ck , @v_zrkw type_kwbh , @v_zrkw_old type_kwbh , @zlbh INT , @zckwkc type_sl , @zrkwkc type_sl , @v_zcwzzl CHAR(1) , @v_zrwzzl CHAR(1) -- 2015-9-24 引入的新变量 , @v_zrtp varchar(50) -- 2016-1-13 jzx 引入的两个新变量 , @v_zrtp_old varchar(50) SELECT @zlbh = zlbh, @zcck = zcck, @zckw = zckw, @zckwkc = zckwkc, @v_zcwzzl=b.sfwzzl , @zrck = zrck, @zrkw = zrkw, @zrkwkc = zrkwkc, @v_zrtp = a.zrtp FROM inserted a JOIN kwjbxx b ON a.zcck=b.ckmc AND a.zckw=b.kwbh; SET NOCOUNT ON; IF NOT EXISTS (SELECT 2 FROM deleted) --说明是在插入记录时触发的。一旦生成记录,转出库位就不能修改。 BEGIN EXEC p_lockCell @zcck, @zckw, @v_zcwzzl, @zlbh, @zckwkc, 0 END IF UPDATE(zrkw) OR UPDATE(zrtp) BEGIN --释放修改前的库位 SELECT @v_zrkw_old = zrkw, @v_zrtp_old = zrtp FROM deleted WHERE zlbh = @zlbh; IF @v_zrkw_old IS NOT NULL EXEC p_unlockCell NULL, @v_zrkw_old, @zlbh -- 锁定新库位 IF @zrkw IS NOT NULL BEGIN SELECT @v_zrwzzl = sfwzzl FROM kwjbxx WHERE kwbh=@zrkw AND zsl!=0; IF @v_zrwzzl IS NULL -- 2015-9-24 仅当目标库位为空库位时,变量@v_zrwzzl才取@v_zcwzzl变量的值 SET @v_zrwzzl = @v_zcwzzl; EXEC p_lockCell @zrck, @zrkw, @v_zrwzzl, @zlbh, @zrkwkc, 1; END; -- 记录字段“是否取出转入托盘”的值,如果转入库位上有物资,则需要取出转出和转入库位上托盘 /*UPDATE cpZkzl SET sfqcZrtp = 0, sfqcZctp = 0 WHERE zlbh = @zlbh AND zrkwKc > 0;*/ -- 浅货位托盘转深货位托盘指令的入库库位更改后,需要将出库指令表中原出库库位改回来(之前是转出库位对应的深货位) IF EXISTS(SELECT 2 FROM deleted d JOIN inserted i ON d.zlbh = i.zlbh AND d.zrkw<>i.zrkw WHERE (d.djbh LIKE 'cpZkzl.[1-9]% ckzl.[1-9]%') AND ISNUMERIC(SUBSTRING(d.djbh, CHARINDEX(' ckzl.', d.djbh) + 6, LEN(d.djbh))) = 1 AND i.zt!=2) UPDATE ckzl SET kwbh = d.zrkw FROM deleted d JOIN inserted i ON d.zlbh = i.zlbh AND d.zrkw<>i.zrkw WHERE ckzl.zlbh = SUBSTRING(i.djbh, CHARINDEX(' ckzl.', i.djbh) + 6, LEN(i.djbh)) AND ckzl.zt=0 AND (d.djbh LIKE 'cpZkzl.[1-9]% ckzl.[1-9]%') AND ISNUMERIC(SUBSTRING(d.djbh, CHARINDEX(' ckzl.', d.djbh) + 6, LEN(i.djbh))) = 1 AND i.zt!=2 AND ckzl.kwbh IS NULL; -- 插入零库存记录,以便入库库位安排程序能及早知道目标入库库位将要放入什么物资 IF (ISNULL(@v_zrkw_old, ' ') <> ISNULL(@v_zrkw, ' ')) OR (ISNULL(@v_zrtp_old, ' ') <> ISNULL(@v_zrtp, ' ')) BEGIN IF @v_zrkw_old IS NOT NULL DELETE cpkcxx FROM deleted z JOIN cpZkzlMx d ON z.zlbh=d.zlbh WHERE cpkcxx.sl = 0 AND cpkcxx.kwbh = z.zrkw AND cpkcxx.zlzt = d.zlzt AND cpkcxx.cpbh = d.cpbh AND ISNULL(cpkcxx.lpxx, ' ')=ISNULL(d.lpxx, ' ') AND ISNULL(cpkcxx.tpbh, ' ')=ISNULL(z.zrtp, ' ') AND cpkcxx.bz = '转库指令' + CAST(z.zlbh AS VARCHAR(12)); IF @v_zrkw IS NOT NULL INSERT INTO cpkcxx (ckmc, kwbh, tpbh, zlzt, cpbh, lpxx, txm, sl, rksj, jldw, cpmc, cpgg1, cpgg2, cpgg3, jhj, wzlb, jzl, bz) SELECT zrck, zrkw, zrtp, d.zlzt, d.cpbh, d.lpxx, MAX(d.txm), 0, MAX(d.rksj) , MAX(d.jldw), MAX(d.cpmc), MAX(d.cpgg1), MAX(d.cpgg2), MAX(d.cpgg3), MAX(d.jhj), MAX(d.wzlb), MAX(d.jzl) , '转库指令' + CAST(z.zlbh AS VARCHAR(12)) FROM inserted z JOIN cpZkzlMx d ON z.zlbh=d.zlbh WHERE NOT EXISTS(SELECT 2 FROM cpkcxx r WHERE r.kwbh = z.zrkw AND r.zlzt = d.zlzt AND r.cpbh = d.cpbh AND ISNULL(r.lpxx, ' ')=ISNULL(d.lpxx, ' ') AND ISNULL(r.tpbh, ' ')=ISNULL(z.zrtp, ' ') ) AND d.jlh > 0 -- jlh = 0 是空托盘转库记录 GROUP BY z.zlbh,zrck,zrkw,zrtp,d.zlzt,d.cpbh,d.lpxx; END; END END go ALTER TRIGGER [dbo].[t_qtzl_IU] ON [dbo].[qtzl]-- WITH ENCRYPTION FOR INSERT, UPDATE AS /** * 生成指令或修改入库指令的入库库位后,锁定指令操作的库位 * Created by 蒋智湘 ON 06-01-14 * Modified by 蒋智湘 on 2006-02-20 因存储过程p_lockCell实现的变换而更改代码 * Modified by jzx on 2017-10-20 更改托盘编号变量的数据类型为varchar(50),而不是varchar(12) */ DECLARE @ckdm type_ck --修改后的仓库代码 , @kwbh type_kwbh --库位编号 , @tpbh varchar(50) --托盘号 , @ckdm_old type_ck , @kwbh_old type_kwbh , @tpbh_old varchar(50) , @zlbh INT , @kcs type_sl , @lx TINYINT IF UPDATE(kwbh) OR UPDATE(ckdm) OR UPDATE(tpbh) BEGIN SELECT @ckdm_old = ckdm, @kwbh_old = kwbh, @tpbh_old = tpbh FROM deleted; SELECT @ckdm = ckdm, @kwbh = kwbh, @tpbh = tpbh, @zlbh = zlbh, @lx = lx, @kcs = ykcs FROM inserted; IF @kwbh_old IS NOT NULL AND (@ckdm <> @ckdm_old OR @kwbh <> @kwbh_old) BEGIN -- 锁定新库位 EXEC p_lockCell @ckdm, @kwbh, 'T', @zlbh, @kcs IF @@ERROR <> 0 RETURN; --释放修改前的库位 EXEC p_unlockCell @ckdm_old, @kwbh_old, @zlbh END ELSE IF @kwbh_old IS NULL --插入记录时,才会出现IS NULL的情况 BEGIN EXEC p_lockCell @ckdm, @kwbh, 'T', @zlbh, @kcs IF @@ERROR <> 0 RETURN; END END go ALTER PROCEDURE [dbo].[p_finishInstruction] ( @p_table VARCHAR(10) , @p_zlbh INT , @p_czr varchar(20)=NULL , @p_tpcrk nvarchar(20) = NULL -- 托盘出库口 , @p_实际入库库位 type_kwbh = NULL -- 实际入库库位。在拣选回库完成后处理 ) AS /** * 标示完成指定编号的作业指令 * Created by jzx on 2013-4-2 * Modified by jzx on 2013-5-28 显式创建临时表#inserted,而不是通过SELECT .... INTO {table}创建 * Modified by jzx on 2013-7-10 入库后,如果存货档案的分区属性没有,但入库库位有, 则在存货档案中记录分区属性值同库位上的分区属性值一致 * Modified by jzx on 2013-10-24 期初库存记录保管账时,最后一个参数传递指令编号而不是之前的NULL * Modified by jzx on 2014-8-17 转库指令完成时,完成对库存箱号记录的转移。暂时只支持部分转库。 * Modified by jzx on 2014-9-9 将转库指令明细表的jzl字段出入临时表#deleted表 * Modified by jzx on 2014-9-26 原包装存放库位和待发区存放库存之间发生转移时,需要将物料供应商关系表中冗余记录的 原包装库存总数和待发区库存总数同步更新一下。 * Modified by jzx on 2014-9-27 329项目客户要求入库指令最后一条审核后,需要自动审核入库单;增加参数@p_tpcrk * Modified by jzx on 2014-10-10 往临时表#inserted和#deleted中插入记录时,不在关联cpkcxx表取rksj/gydw/cpmc等字段值, * 而是直接从cpZkzlMx表中取得 * Modified by jzx on 2014-11-1 如果存于封账期间,则不自动审核。 * Modified by jzx on 2014-11-5 修改dfqKcs字段值同时需要需要"剩余未翻包装数量"字段值 * Modified by jzx on 2014-12-23 增加参数 @p_实际入库库位 * Modified by jzx on 2015-2-5 jzx 入库指令完成时,插入零库存记录行,以便后续入库库位安排时,能即时知道目标库位上到底放了什么物品 * Modified by jzx on 2015-2-9 debug 前一次升级漏写指定记录的筛选条件 * Modified by jzx on 2015-5-11 完成转库指令时,往临时表deleted和#inserted插入的记录加上筛选条件M.sl>0; 修改cpkcXhxx的库位时,增加产品编码、批号和质量状态过滤条件 * Modified by jzx on 2015-9-11 对转库指令中,djbh LIKE 'ckzl.####'的特殊转库指令的处理 * Modified by jzx on 2015-9-14 对转库指令中,djbh LIKE 'cpZkzl.####'的特殊转库指令的处理 * Modified by jzx on 2015-9-16 如果转出转入库位相同,则不做库存数据转移处理。 * Modified by jzx on 2015-9-17 注释之前自动插入零库存记录行的代码,改在触发器cpRkzl_IU中完成,即记录的时间提前了。 * Modified by jzx on 2015-9-24 空盘转入有货库位时,不再报错 * Modified by jzx on 2015-10-14 debug:更改临时表字段定义顺序,添加je字段,保持和过程p_finishRkd中的一致 * Modified by jzx on 2015-10-15 对于pzbh字段值为Null的cprkzl,完成累加库位库存后,还要递减cpxx表的在途库存字段值 * Modified by jzx on 2015-10-17 处理新的配置项"xtkz_lpxx_usage"的设置值不同情况下,数据修改的变化 * Modified by jzx on 2015-11-18 需要同步修改cpxx表上的“待发数”字段的值 * Modified by jzx on 2015-11-21 需要同步修改khcpxx表上的“待发数”和“dfqKcs”字段的值 * Modified by jzx on 2015-12-1 当出入库指令的库位号为Null时,不能完成指令 * Modified by jzx on 2015-12-5 debug:临时表#inserted上的gydw数据类型由原来的nvarchar(20)改成nvarchar(60) * Modified by jzx on 2015-12-7 debug:出库指令反馈时,如果传入的实际入库库位有值,则还要判定是否有有效库位号 * Modified by jzx on 2015-12-13 debug: 入库指令完成修改cpxx表的ybzKcs和dfqKcs字段值的UPDATE语句遗漏WHERE子句; 入库指令入库库位是待发区库位的,则还需要修改khcpxx表的dfqKcs字段值。 * Modified by jzx on 2016-3-12 针对cpzkzl.djbh LIKE @'###.##'的特殊转库指令的处理 * Modified by jzx on 2016-4-18 debug: 转库指令完成后,往临时表#inserted和#deleted插入记录时,忘记给tpbh字段赋值了; * Modified by jzx on 2016-4-18 更新库位信息表的托盘编号时,不限定库位类型,任何类型的库位都可以记录托盘号 * Modified by jzx on 2016-4-21 如果传入参数@p_czr为null,则不覆盖指令记录的czr字段值 * Modified by jzx on 2016-4-26 为比亚迪项目更改代码,其他项目可能需要删除对表sc_cells的操作 * Modified by jzx on 2016-5-13 转库指令完成时,是否记录保管账和系统配置项设定值有关,且允许非合格品也记录保管账 * Modified by jzx on 2016-7-16 为了给cpkcxx表新增字段rkzbsj字段赋值而修改代码 * Modified by jzx on 2016-7-17 为了给sc_cells表新增字段runStatus字段赋值而修改代码 * Modified by jzx on 2016-7-31 新的库位类型4,不记录库存数据。只是作为日志记录。 * Modified by jzx on 2016-8-3 为了提高效率,将其它项目专用的代码注释掉 * Modified by jzx on 2016-8-5 上一次修改,针对xnkw=4的库位,没有机会对sc_cells表的runStatus和sywz字段进行修改 * Modified by jzx on 2016-8-7 为了提高效率,入库指令完成时不再传电池编号到库存表,只能在电池信息表看电池; 转库指令完成需要修改sc_cells表。 * Modified by jzx on 2016-8-27 debug: 转库完成更改sc_cells表时,之前没有加上isBingding='Y'条件,导致解除绑定的历史记录的jrwz都错误地赋值了 * Modified by jzx on 2016-8-29 空托盘出入库指令完成后,对zsl字段修改不在做递减递增操作,直接覆盖 * Modified by jzx on 2016-10-30 因414项目电池托盘条码长度超过12个字符而修改代码,改成20个字符长度 * Modified by jzx on 2016-12-23 调用累加库存过程后,不删除临时表,改用DBMS事务提交底层代码去删除;转库检查库存数是否足够时,增加托盘号筛选 * Modified by jzx on 2017-2-17 入库指令完成时,给电池信息表的工艺开始时间赋值; 给sc_cells表的新增字段recipeID赋值为cprkzl记录的recipeID字段值 ,b.scrq,b.hth,b.hjzt,b.ywy,b.mxcc,b.gdh,b.yt,b.gx,b.scfc,b.bc * Modified by jzx on 2017-10-20 更改@zrtp变量的数据类型为varchar(50),而不是varchar(20) */ BEGIN DECLARE @old TINYINT -- 修改前的状态 SET NOCOUNT ON; CREATE TABLE #inserted(ckmc CHAR(4), kwbh VARCHAR(20), cpbh NVARCHAR(20), lpxx VARCHAR(30), zlzt CHAR(1) , gydw NVARCHAR(60), je NUMERIC(18,2) , sl NUMERIC(18,3), cpmc NVARCHAR(60), cpgg1 NVARCHAR(60), cpgg2 NVARCHAR(60), cpgg3 NVARCHAR(60) , jhj NUMERIC(15,4), pmh VARCHAR(20), wzlb VARCHAR(15), jldw NVARCHAR(10) , rksj DATETIME, bz NVARCHAR(100), jzl NUMERIC(18,3), txm VARCHAR(30), cfwzxx NVARCHAR(20) , piz NUMERIC(18,3), tpbh nvarchar(50), rkzbsj DATETIME,scrq DATETIME,hth NVARCHAR(50),maoz NUMERIC(18,3),hjzt NVARCHAR(50) ,ywy NVARCHAR(50),mxcc NVARCHAR(50),gdh NVARCHAR(50),yt NVARCHAR(50), gx NVARCHAR(50), scfc NVARCHAR(50), bc NVARCHAR(50) ) IF(@p_table = 'ck_qckc') BEGIN DECLARE @v_mark BIT, @v_kcjlh INT; -- 应该首先检查是否有入库记录,如果有,则不能补录 /*SELECT @v_mark = MAX(1) FROM cprkzl z JOIN cprkd ON z.pzbh = cprkd.ysdh , ck_qckc I WHERE z.cpbh = I.cpbh AND z.kwbh = I.kwbh AND cprkd.zl = I.zlzt AND I.zt != 2 AND I.zlbh = @p_zlbh; IF @v_mark = 1 BEGIN RAISERROR('该存货编码和库位已经做过入库单,不能补录期初库存', 16, 1); RETURN; END;*/ -- 检查是否分配了库位 IF EXISTS(SELECT 2 FROM ck_qckc WHERE zlbh = @p_zlbh AND kwbh IS NULL) BEGIN RAISERROR ('尚未分配库位', 16, 1); RETURN; END; -- 更新完成时间和状态 UPDATE ck_qckc SET wcsj=getdate(), zt = 2 WHERE zlbh = @p_zlbh AND zt != 2; -- 插入库存 INSERT INTO #inserted SELECT I.ckmc, I.kwbh, I.cpbh, I.lpxx, I.zlzt, I.gydw, NULL AS je , I.qcsl AS sl, I.cpmc, I.cpgg1, I.cpgg2, I.cpgg3 , cpxx.jhj, cpxx.pmh, I.wzlb, I.jldw , getdate() AS rksj, I.bz, ISNULL(I.jzl, 1) jzl, I.txm , I.cfwzxx, I.piz, I.tpbh FROM ck_qckc I(UPDLOCK) LEFT JOIN cpxx ON I.cpbh = cpxx.cpbh WHERE I.zlbh = @p_zlbh AND I.zt != 2; --调用专门存储过程修改库存 EXECUTE p_increaseInventory; -- 记录保管账 DECLARE @v_config TINYINT; SELECT @v_config = ISNULL(MAX(dqz), 2) FROM sys_config WHERE ID_pzx='xtkz_ckbgz_insert'; IF (@v_config > 0) BEGIN DECLARE @v_zy NVARCHAR(20), @v_cpbh type_cpbh, @v_lpxx type_ph, @v_zsl type_sl, @v_rq DATE; SET @v_rq = CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)-- 当前日期的零点 DECLARE c CURSOR FOR SELECT I.cpbh, CASE WHEN @v_config > 1 THEN I.lpxx ELSE NULL END , SUM(I.qcsl) AS zsl, '库位 ' + MAX(I.kwbh) zy FROM ck_qckc I WHERE I.qcsl <> 0 AND I.zt != 2 AND I.zlbh = @p_zlbh GROUP BY I.cpbh, CASE WHEN @v_config > 1 THEN I.lpxx ELSE NULL END; OPEN c; WHILE 1=1 BEGIN FETCH c INTO @v_cpbh, @v_lpxx, @v_zsl, @v_zy; IF @@FETCH_STATUS <> 0 BREAK; EXEC p_bgjz @v_cpbh, @v_lpxx, '1', @v_zsl, @v_zy, '期初', @v_rq, @p_zlbh, '2'; END; CLOSE c; DEALLOCATE c; END; RETURN; END; ELSE IF (@p_table = 'ckzl') BEGIN -- 2015-12-1 jzx 如果安排的出库库位被临时清空,则不能完成指令 IF EXISTS(SELECT 2 FROM ckzl WHERE zlbh=@p_zlbh AND kwbh IS NULL) BEGIN RAISERROR('未指定具体库位', 16, 1); RETURN; END; UPDATE ckzl SET zt = 2, wcsj = GETDATE(), czr = ISNULL(@p_czr, czr), tpcrk=@p_tpcrk WHERE zlbh = @p_zlbh AND zt <> 2; IF @@ROWCOUNT = 0 BEGIN RAISERROR ('出库指令 %d 已经完成', 16, 1, @p_zlbh); END; -- 2015-12-7 jzx 在“@p_实际入库库位 IS NOT NULL”后面增加实际转入库位号是否定义检查。 IF (@p_实际入库库位 IS NOT NULL AND EXISTS(SELECT 2 FROM kwjbxx WHERE kwbh=@p_实际入库库位)) BEGIN DECLARE @v_原出库库位 type_kwbh; SELECT @v_原出库库位 = kwbh FROM ckzl WHERE zlbh = @p_zlbh; IF @v_原出库库位 <> @p_实际入库库位 BEGIN EXEC p_生成整托盘转库指令 @p_zlbh OUT, @v_原出库库位, @p_实际入库库位; END; END; RETURN; END; ELSE IF(@p_table = 'cprkzl') BEGIN -- 2015-12-1 jzx IF EXISTS(SELECT 2 FROM cprkzl WHERE zlbh=@p_zlbh AND kwbh IS NULL) BEGIN RAISERROR('未指定具体库位', 16, 1); RETURN; END; UPDATE cprkzl SET zt = 2, wcsj = GETDATE(), czr = ISNULL(@p_czr, czr), tpcrk=@p_tpcrk WHERE zlbh = @p_zlbh AND zt <> 2; IF @@ROWCOUNT = 0 BEGIN RAISERROR ('入库指令 %d 已经完成', 16, 1, @p_zlbh); RETURN; END; -- 329 项目,客户要求自动审核。自动审核需要需要记录保管帐 DECLARE @rkdh VARCHAR(20), @rklx CHAR(2), @rkwzzl CHAR(1), @sflzRkd BIT, @ghs NVARCHAR(60), @ysrq DATE; DECLARE @jzl INT; SELECT TOP 1 @rkdh = pzbh, @rklx = lx, @rkwzzl = d.zl, @sflzRkd = d.sflz, @ghs = d.ghs, @ysrq = d.ysrq FROM cprkzl z LEFT JOIN cprkd d ON z.pzbh=d.ysdh WHERE z.zlbh=@p_zlbh; IF (@rkdh IS NOT NULL) BEGIN IF NOT EXISTS(SELECT 2 FROM cprkdmx WHERE ysdh = @rkdh AND (rksl>yapsl OR rksl=0)) AND NOT EXISTS(SELECT 2 FROM cprkzl WHERE pzbh=@rkdh AND zt!=2) BEGIN IF EXISTS(SELECT 2 FROM dual WHERE 封账标记=1) RETURN; EXEC p_finishRkd @rkdh, 1; IF @@ERROR <> 0 RETURN; UPDATE cprkd SET shsj=GETDATE(),shr='系统自动' WHERE ysdh=@rkdh; DECLARE @c CURSOR, @cp type_cpbh, @ph type_ph, @scrq varchar(10) , @yxqz varchar(10), @sl type_sl, @rklxmc NVARCHAR(20); SET @c = CURSOR FOR SELECT cpbh cp, lpxx ph, jzl, CASE @sflzRkd WHEN 1 THEN yapsl ELSE -yapsl END rksl, scrq, yxqz FROM cprkdmx m WHERE ysdh=@rkdh AND yapsl!=0 AND @rklx!='01' ORDER BY mxbh; OPEN @c; WHILE 1=1 BEGIN FETCH @c INTO @cp, @ph, @jzl, @sl, @scrq, @yxqz; IF @@FETCH_STATUS <> 0 BREAK; IF (LEN(@ph) > 1) INSERT INTO phxx(cpbh,lpxx,ghdw,jzl,rkdh,jhrq, scrq, yxqz) SELECT @cp, @ph, @ghs, @jzl, @rkdh, @ysrq, @scrq, @yxqz WHERE NOT EXISTS(SELECT 2 FROM phxx WHERE cpbh = @cp AND lpxx = @ph); -- 记录保管账 EXEC p_bgjz @cp, @ph, 1, @sl, @ghs, @rklxmc, NULL, @rkdh, @rkwzzl; END; CLOSE @c; DEALLOCATE @c; END; END; ELSE -- 不生成入库单据,直接组盘入库情形。需要立即更新库位库存数据 BEGIN INSERT INTO #inserted SELECT Z.ckmc, Z.kwbh, Z.cpbh, Z.lpxx, ISNULL(Z.zlzt,'2') zlzt, MAX(Z.gydw) , NULL , SUM(Z.sl) , MAX(M.cpmc), MAX(M.cpgg1), MAX(M.cpgg2) , MAX(M.cpgg3), MAX(M.jhj), MAX(M.pmh) , MAX(M.wzlb), MAX(M.jldw) , ISNULL(MAX(Z.kc_rksj), getdate()), MAX(Z.kcbz) , MAX(ISNULL(Z.bzl, M.jzl)) jzl, MAX(Z.txm) txm, MAX(Z.cfwzxx), MAX(Z.piz) , Z.tpbh, MIN(scsj) rkzbsj,Z.scrq,Z.hth,Z.maoz,Z.hjzt,Z.ywy,Z.mxcc,Z.gdh,Z.yt,Z.gx,Z.scfc,Z.bc FROM cpRkzl Z JOIN kwjbxx k ON z.kwbh = k.kwbh AND k.xnkw!=4 -- 2016-7-31 LEFT JOIN cpxx M ON z.cpbh = M.cpbh WHERE zlbh = @p_zlbh GROUP BY Z.ckmc, Z.kwbh, Z.cpbh, Z.lpxx, Z.zlzt, Z.tpbh,Z.scrq,Z.hth,Z.maoz,Z.hjzt,Z.ywy,Z.mxcc,Z.piz,Z.gdh,Z.yt,Z.gx,Z.scfc,Z.bc; --调用专门存储过程修改库存 EXECUTE p_increaseInventory; /* DECLARE @flagLpxx TINYINT; SET @c = CURSOR FOR SELECT m.cpbh cp, m.lpxx ph, m.jzl, m.zlzt, MAX(m.gydw) gydw, SUM(m.sl) rksl, c.flagLpxx FROM #inserted m JOIN cpxx c ON m.cpbh = c.cpbh AND c.flagSfdc=0 -- 2016-4-26 增加flagSfdc=0筛选条件。 GROUP BY m.cpbh, m.lpxx, m.jzl, m.zlzt, m.gydw, c.flagLpxx; OPEN @c; WHILE 1=1 BEGIN FETCH @c INTO @cp, @ph, @jzl, @rkwzzl, @ghs, @sl, @flagLpxx; IF @@FETCH_STATUS <> 0 BREAK; IF (LEN(@ph) > 1 AND @flagLpxx = 1) -- 2016-4-26 只有当cpxx表的flagLpxx字段值为1时才自动插入phxx记录 INSERT INTO phxx(cpbh,lpxx,ghdw,jzl,jhrq) SELECT @cp, @ph, @ghs, @jzl, GETDATE() WHERE NOT EXISTS(SELECT 2 FROM phxx WHERE cpbh = @cp AND lpxx = @ph); -- 记录保管账 EXEC p_bgjz @cp, @ph, 1, @sl, @ghs, @rklxmc, NULL, @rkdh, @rkwzzl; END; CLOSE @c; DEALLOCATE @c; -- 386 不适用 -- 2015-10-15 添加下一行代码 UPDATE cpxx SET 在途数2=CASE WHEN (ISNULL(在途数2,0)-sumsl)>0 THEN (ISNULL(在途数2,0)-sumsl) ELSE 0 END FROM (SELECT cpbh cpid, SUM(sl) sumsl FROM #inserted WHERE zlzt='2' GROUP BY cpbh)t WHERE cpbh=cpid -- 2015-10-17 添加下面 IF ELSE 语句块 IF EXISTS(SELECT 2 FROM sys_config WHERE id_pzx='xtkz_lpxx_usage' AND dqz='1') UPDATE 物料供应商关系 SET ybzKcs = ISNULL(ybzKcs,0) + ybzYks, dfqKcs = ISNULL(dfqKcs,0) + dfqYks FROM (SELECT cpbh,lpxx,SUM(CASE WHEN K.xnkw!=2 THEN m.sl ELSE 0 END) AS ybzYks , SUM(CASE WHEN K.xnkw =2 THEN m.sl ELSE 0 END) AS dfqYks FROM #inserted m JOIN kwjbxx K on M.kwbh = K.kwbh WHERE m.zlzt = '2' GROUP BY m.cpbh, m.lpxx)T WHERE 物料ID=cpbh AND 供应商ID=lpxx; ELSE BEGIN UPDATE cpxx SET ybzKcs = ISNULL(ybzKcs,0) + ybzYks, dfqKcs = ISNULL(dfqKcs,0) + dfqYks FROM (SELECT m.cpbh cpid, SUM(CASE WHEN k.xnkw!=2 THEN m.sl ELSE 0 END) AS ybzYks , SUM(CASE WHEN k.xnkw =2 THEN m.sl ELSE 0 END) AS dfqYks FROM #inserted m JOIN kwjbxx k ON m.kwbh=k.kwbh WHERE m.zlzt='2' GROUP BY m.cpbh) T WHERE cpbh = cpid; -- 2015-12-13 debug:之前忘记加上这个WHERE子句 -- 2015-12-13 增加下面的一条UPDATE语句。处理入库口托盘直接放入待发区库口设备情景 UPDATE khcpxx SET dfqKcs = dfqKcs + rksl FROM (SELECT m.cpbh cpid, ISNULL(k.sjcrkdz, k.kwbh) rkkw, SUM(m.sl) AS rksl FROM #inserted m JOIN kwjbxx k ON m.kwbh=k.kwbh WHERE m.zlzt='2' AND k.xnkw=2 GROUP BY m.cpbh, ISNULL(k.sjcrkdz, k.kwbh))T WHERE cpdm = cpid AND dfkw = rkkw; END;*/ --UPDATE sc_cells SET runStatus='进行中' FROM #inserted i WHERE cellNo = i.lpxx; -- DROP TABLE #inserted; END; -- 2016-8-5 将修改语句放到最后。因为针对直接组盘到xnkw=4库位的,前面的库存操作语句块不会进入 -- 从而导致sywz不会改成null,后面這个托盘就无法再组盘 UPDATE sc_cells SET runStatus='进行中', sywz=null, -- 2016-8-7 将zjjrwz,jrwz,jrsj赋值操作从触发器t_cpkcxx_IU移入到这里 zjjrwz=CASE WHEN jrwz!=i.kwbh THEN jrwz ELSE zjjrwz END, jrwz = CASE WHEN xnkw!=4 THEN i.kwbh ELSE NULL END, jrsj = CASE WHEN xnkw!=4 THEN getdate() ELSE NULL END, dczt3_kssj = CASE WHEN i.zlzt='3' THEN i.wcsj ELSE dczt3_kssj END, dczt4_kssj = CASE WHEN i.zlzt='4' THEN i.wcsj ELSE dczt4_kssj END, dczt5_kssj = CASE WHEN i.zlzt='5' THEN i.wcsj ELSE dczt5_kssj END, dczt6_kssj = CASE WHEN i.zlzt='6' THEN i.wcsj ELSE dczt6_kssj END, dczt7_kssj = CASE WHEN i.zlzt='7' THEN i.wcsj ELSE dczt7_kssj END, dczt8_kssj = CASE WHEN i.zlzt='8' THEN i.wcsj ELSE dczt8_kssj END, dczt9_kssj = CASE WHEN i.zlzt='9' THEN i.wcsj ELSE dczt9_kssj END, dcztA_kssj = CASE WHEN i.zlzt='A' THEN i.wcsj ELSE dcztA_kssj END, dcztB_kssj = CASE WHEN i.zlzt='B' THEN i.wcsj ELSE dcztB_kssj END, recipeID = i.recipeID -- 2017-2-9 jzx 可以在组盘时指定接下来检测工艺的编号 FROM cprkzl i JOIN kwjbxx k ON i.kwbh = k.kwbh WHERE cellNo = i.lpxx AND zlbh = @p_zlbh; --UPDATE sc_cells SET runStatus='进行中',sywz=null FROM #inserted i WHERE cellNo = i.lpxx; RETURN; END; ELSE IF(@p_table = 'cpZkzl') BEGIN DECLARE @zcck type_ck , @zckw type_kwbh , @zrck type_ck , @zrkw type_kwbh , @v_zlztBgfx CHAR(3) , @v_ckZlzt CHAR(1) , @v_rkZlzt CHAR(1) , @v_bz NVARCHAR(50) , @v_djbh VARCHAR(40) DECLARE @zl CHAR(1) --入库物资的质量 , @zrtp varchar(50)--转入托盘 , @v_zctp varchar(50)-- 转出托盘 , @ERR INT , @cpbh type_cpbh , @lpxx type_ph , @zlzt CHAR(1) , @zysl type_sl , @kcjlh BIGINT , @v_kcsl type_sl , @v_txm VARCHAR(30) , @v_分隔符位置 INT SELECT @old = zt, @zcck = zcck, @zckw = zckw, @zrck = zrck , @zrkw = zrkw, @zrtp = zrtp , @v_zlztBgfx = zlztBgfx, @v_bz = bz, @v_djbh = cpZkzl.djbh FROM cpZkzl (UPDLOCK) WHERE zlbh = @p_zlbh; -- 2015-12-1 jzx IF @zrkw IS NULL BEGIN RAISERROR('未指定转入库位', 16, 1); RETURN; END; --修改库存时的游标 DECLARE c_zkzl CURSOR FOR SELECT B.zcck, B.zckw, A.cpbh,A.lpxx,A.zlzt,A.sl,A.jlh,A.txm,B.zctp FROM cpZkzlMx A,cpZkzl B WHERE A.zlbh=B.zlbh AND B.zlbh=@p_zlbh; SET @ERR=0; OPEN c_zkzl; WHILE 1 = 1 BEGIN FETCH c_zkzl INTO @zcck, @zckw,@cpbh,@lpxx,@zlzt,@zysl,@kcjlh,@v_txm,@v_zctp; IF @@FETCH_STATUS <> 0 BREAK; IF @zlzt IS NULL AND @kcjlh = 0 BEGIN SELECT @v_kcsl = ISNULL(MAX(zsl),0) FROM kwjbxx WHERE ckmc=@zcck AND kwbh=@zckw AND sfwzzl='T'; /*IF EXISTS(SELECT 2 FROM cpkcxx WHERE ckmc=@zrck AND kwbh=@zrkw) BEGIN -- 2015-9-24 jzx 两个有货库位互转时,允许发生 RAISERROR ('空托盘转库时,转入库位 %s 上不能有物资库存', 16, 1, @zrkw) SET @ERR=1; BREAK ; END*/ END ELSE BEGIN SELECT @v_kcsl = ISNULL(MAX(sl), 0) FROM cpkcxx WHERE kwbh=@zckw AND ckmc=@zcck AND cpbh=@cpbh AND zlzt=@zlzt AND ISNULL(lpxx, ' ') = ISNULL(@lpxx, ' ') AND ISNULL(txm, ' ') = ISNULL(@v_txm, ' ') AND ISNULL(tpbh, ' ') = ISNULL(@v_zctp, ' '); END IF @zysl > @v_kcsl BEGIN DECLARE @v_zyslStr VARCHAR(50), @v_kcslStr VARCHAR(50) SET @v_zyslStr = CAST(@zysl AS VARCHAR(20)); SET @v_kcslStr = CAST(@v_kcsl AS VARCHAR(20)); RAISERROR ('库位 %s 上(产品:%s, 批号:%s)的当前库存数 %s 小于需要转移的数量 %s', 16, 1, @zckw, @cpbh, @lpxx, @v_kcslStr, @v_zyslStr) SET @ERR=1; BREAK ; END END CLOSE c_zkzl; DEALLOCATE c_zkzl; IF @ERR=1 RETURN; IF (@old != 2) BEGIN --解除锁定 EXEC p_unlockCell @zcck, @zckw, @p_zlbh; EXEC p_unlockCell @zrck, @zrkw, @p_zlbh; IF LEN(@v_zlztBgfx) = 3 BEGIN SET @v_ckZlzt = SUBSTRING(@v_zlztBgfx, 1, 1) SET @v_rkZlzt = SUBSTRING(@v_zlztBgfx, 3, 1) END; UPDATE cpZkzl SET zt = 2, wcsj = GETDATE(), tpcrk=@p_tpcrk WHERE zlbh = @p_zlbh AND zt <> 2; IF @@ROWCOUNT = 0 BEGIN RAISERROR ('转库指令 %d 已经完成', 16, 1, @p_zlbh); RETURN; END; -- 2015-9-11 jzx 对pzbh字段值为"ckzl.#####"值的特殊处理。深货位托盘转库结束后,需要将出库指令表中原出库库位改回来 IF @v_djbh LIKE 'ckzl.[1-9]%' UPDATE ckzl SET kwbh = @zrkw WHERE zlbh = SUBSTRING(@v_djbh, 6, 14) AND zt=0 AND kwbh IS NULL; -- 2016-3-12 添加下面IF语句块 IF @v_djbh LIKE '@%.%' AND NOT EXISTS(SELECT 2 FROM cpZkzl WHERE zlbh!=@p_zlbh AND zt!=2 AND djbh = @v_djbh) BEGIN DECLARE @Time CHAR(16), @Axis VARCHAR(10); SET @v_分隔符位置 = CHARINDEX('.', @v_djbh); SET @Time = SUBSTRING(@v_djbh, 2, @v_分隔符位置 - 2); SET @Axis = SUBSTRING(@v_djbh, @v_分隔符位置 + 1, LEN(@v_djbh) - @v_分隔符位置 + 1); UPDATE FIRE_ALERT SET Finish=1 WHERE [Time]=@Time AND Axis = @Axis; INSERT INTO FIRE_FINISH([Time], Axis) VALUES(@Time, @Axis); END; IF @zckw = @zrkw -- 2015-9-16 如果转出转入库位相同,则直接返回 RETURN; IF @v_djbh LIKE 'cpZkzl.[1-9]%'-- 2015-9-14 jzx 实现库位库存对调 BEGIN DECLARE @zlbh2 INT, @v_djbh2 VARCHAR(20); SET @v_分隔符位置 = CHARINDEX(' ', @v_djbh); IF @v_分隔符位置 = 0 SET @v_分隔符位置 = LEN(@v_djbh); SET @zlbh2 = SUBSTRING(@v_djbh, 8, @v_分隔符位置 - 8); SET @v_djbh2 = SUBSTRING(@v_djbh, @v_分隔符位置 + 1, LEN(@v_djbh) - @v_分隔符位置 + 1); -- 2015-9-16 必须转入库位有货才生成。因为对调过程中,如果出现满入,可能用户将其改放到空库位上了 IF EXISTS(SELECT 2 FROM kwjbxx WHERE kwbh=@zrkw AND zsl>0) EXEC p_生成整托盘转库指令 @zlbh2, @zrkw, @zckw, '自动程序', @v_djbh2, @v_bz; END; IF @zlzt IS NULL AND @kcjlh = 0 -- 空托盘转库是成立 BEGIN UPDATE kwjbxx SET zsl=zsl+@zysl, sfwzzl=ISNULL(sfwzzl, 'T') WHERE ckmc = @zrck AND kwbh = @zrkw; UPDATE kwjbxx SET zsl=zsl-@zysl, sfwzzl=CASE WHEN @v_kcsl=@zysl THEN NULL ELSE sfwzzl END WHERE ckmc = @zcck AND kwbh = @zckw; RETURN; END --转出转入到新库位上的库存数据 INSERT INTO #inserted SELECT T.zrck AS ckmc, T.zrkw AS kwbh, M.cpbh, M.lpxx , CASE WHEN @v_rkZlzt IS NOT NULL THEN @v_rkZlzt ELSE M.zlzt END zlzt, M.gydw, NULL , M.sl, M.cpmc, M.cpgg1, M.cpgg2, M.cpgg3 , M.jhj, M.pmh, M.wzlb, M.jldw , M.rksj, M.bz, M.jzl, M.txm , M.cfwzxx, M.piz , T.zrtp AS tpbh -- 2016-4-18 jzx debug: 之前忘记加上托盘编号字段 , T.scsj AS rkzbsj, null scrq,null hth, null maoz,null hjzt,null ywy,null mxcc,null gdh,null yt,null gx,null scfc,null bc FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh AND M.sl>0 WHERE T.zlbh = @p_zlbh; --从转出库位删除的库存数据 SELECT M.jlh AS kcjlh, T.zcck AS ckmc, T.zckw AS kwbh, M.cpbh, M.lpxx, M.txm, M.jzl , CASE WHEN @v_ckZlzt IS NOT NULL THEN @v_ckZlzt ELSE M.zlzt END zlzt , M.sl, ISNULL(M.piz, 0) AS piz, T.zctp tpbh INTO #deleted FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh AND M.sl>0 WHERE T.zlbh = @p_zlbh; --调用专门过程递减库存 EXECUTE p_decreaseInventory; --调用专门过程增加转入库位上的库存 EXECUTE p_increaseInventory; --更新库位上的托盘号(所放物资种类、总数量和质量状态字段的更改由存储过程p_increaseInventory完成) UPDATE kwjbxx SET tpbh=@zrtp WHERE ckmc = @zrck AND kwbh = @zrkw; --AND flagKzkw = 0 AND xnkw = 0; -- 2016-4-18 jzx 不限制库位类型了 IF ISNULL(@v_ckZlzt, ' ') != ISNULL(@v_rkZlzt, ' ') BEGIN -- 记录保管账 SELECT @v_config = ISNULL(MAX(dqz), 2) FROM sys_config WHERE ID_pzx='xtkz_ckbgz_insert'; IF (@v_config > 0) BEGIN DECLARE @v_jzrq DATETIME; SET @v_jzrq = CONVERT(CHAR(10), GETDATE(), 120); DECLARE c_zkzl CURSOR FOR SELECT A.cpbh,CASE WHEN @v_config > 1 THEN A.lpxx ELSE NULL END AS lpxx,A.sl FROM cpZkzlMx A,cpZkzl B WHERE A.zlbh=B.zlbh AND B.zlbh=@p_zlbh; SET @ERR=0; OPEN c_zkzl WHILE 1 = 1 BEGIN FETCH c_zkzl INTO @cpbh,@lpxx,@zysl IF @@FETCH_STATUS <> 0 BREAK; EXEC p_bgjz @cpbh, @lpxx, 2, @zysl, @zrkw, '转库', @v_jzrq, @p_zlbh, @v_ckZlzt; EXEC p_bgjz @cpbh, @lpxx, 1, @zysl, @zckw, '转库', @v_jzrq, @p_zlbh, @v_rkZlzt; END; CLOSE c_zkzl; DEALLOCATE c_zkzl; END; -- 记帐结束 -- 记录质量状态转换记录 INSERT INTO ckZlztZhjl(rq,djlx,djbh,cpbh,lpxx,ckmc,kwbh,zhsl,yszlzt,mbzlzt,zhsj) SELECT @v_jzrq, 'Z', @p_zlbh, cpbh, lpxx, ckmc, kwbh, sl, @v_ckZlzt, @v_rkZlzt, GETDATE() FROM #inserted; END; /* 386 项目不适用 -- 2014-8-17 jzx 更改cpkcXhxx表记录 UPDATE cpkcXhxx SET kwbh=' ' FROM #deleted D -- 2015-5-11 jzx 考虑到一个库位(虚拟库位)上有多种物料,所以需要加上cpid/ph/zlzt筛选条件 WHERE cpkcXhxx.kwbh = @zckw AND cpkcXhxx.cpid = d.cpbh AND cpkcXhxx.ph = d.lpxx AND cpkcXhxx.zlzt = d.zlzt; UPDATE cpkcXhxx SET kwbh=@zckw FROM #deleted D -- 2015-5-11 jzx 考虑到一个库位(虚拟库位)上有多种物料,所以需要加上cpid/ph/zlzt筛选条件 WHERE cpkcXhxx.kwbh = @zrkw AND cpkcXhxx.cpid = d.cpbh AND cpkcXhxx.ph = d.lpxx AND cpkcXhxx.zlzt = d.zlzt; UPDATE cpkcXhxx SET kwbh=@zrkw FROM #deleted D -- 2015-5-11 jzx 考虑到一个库位(虚拟库位)上有多种物料,所以需要加上cpid/ph/zlzt筛选条件 WHERE cpkcXhxx.kwbh = ' ' AND cpkcXhxx.cpid = d.cpbh AND cpkcXhxx.ph = d.lpxx AND cpkcXhxx.zlzt = d.zlzt; -- -- 329 项目特性,需要调整供应商零件的原包装库存数和待发区库存数。 -- xnkw=2的库位上存放的待发区库存;xnkw!=2的为原包装库位库存 IF EXISTS(SELECT 2 FROM sys_config WHERE id_pzx='xtkz_lpxx_usage' AND dqz='1') BEGIN UPDATE 物料供应商关系 SET ybzKcs = ISNULL(ybzKcs,0) + ybzYks, dfqKcs = ISNULL(dfqKcs,0) + dfqYks , 剩余未翻包装数量=剩余未翻包装数量 + dfqYks FROM (SELECT cpbh,lpxx,SUM(CASE WHEN R.xnkw!=2 THEN sl ELSE 0 END) AS ybzYks , SUM(CASE WHEN R.xnkw =2 THEN sl ELSE 0 END) AS dfqYks FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh INNER JOIN kwjbxx R ON T.zrkw = R.kwbh INNER JOIN kwjbxx C ON T.zckw = C.kwbh WHERE T.zlbh = @p_zlbh AND M.sl <> 0 AND M.zlzt='2' AND case when R.xnkw=2 then 1 else 0 end <> case when C.xnkw=2 then 1 else 0 end AND (@v_rkZlzt IS NULL OR @v_rkZlzt='2') GROUP BY m.cpbh, m.lpxx)T WHERE 物料ID=cpbh AND 供应商ID=lpxx; IF @@ROWCOUNT > 0 UPDATE 物料供应商关系 SET ybzKcs = ISNULL(ybzKcs,0) - ybzYks, dfqKcs = ISNULL(dfqKcs,0) - dfqYks , 剩余未翻包装数量=剩余未翻包装数量 - dfqYks FROM (SELECT cpbh,lpxx,SUM(CASE WHEN C.xnkw!=2 THEN sl ELSE 0 END) AS ybzYks , SUM(CASE WHEN C.xnkw =2 THEN sl ELSE 0 END) AS dfqYks FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh INNER JOIN kwjbxx C ON T.zckw = C.kwbh WHERE T.zlbh = @p_zlbh AND M.sl <> 0 AND M.zlzt='2' GROUP BY m.cpbh, m.lpxx)T WHERE 物料ID=cpbh AND 供应商ID=lpxx; END ELSE -- 2015-10-17 增加了这个分支 BEGIN UPDATE cpxx SET ybzKcs = ISNULL(ybzKcs,0) + ybzYks-ybzYks2, dfqKcs = ISNULL(dfqKcs,0) + dfqYks-dfqYks2 , 待发数 = CASE WHEN 待发数 > ISNULL(dfqKcs,0) + dfqYks-dfqYks2 AND 待发数 + dfqYks - dfqYks2 > 0 THEN 待发数 + dfqYks - dfqYks2 ELSE 待发数 END FROM (SELECT cpbh cpid,SUM(CASE WHEN R.xnkw!=2 THEN sl ELSE 0 END) AS ybzYks , SUM(CASE WHEN R.xnkw =2 THEN sl ELSE 0 END) AS dfqYks , SUM(CASE WHEN C.xnkw!=2 THEN sl ELSE 0 END) AS ybzYks2 , SUM(CASE WHEN C.xnkw =2 THEN sl ELSE 0 END) AS dfqYks2 FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh INNER JOIN kwjbxx R ON T.zrkw = R.kwbh INNER JOIN kwjbxx C ON T.zckw = C.kwbh WHERE T.zlbh = @p_zlbh AND M.sl <> 0 AND M.zlzt='2' AND case when R.xnkw=2 then 1 else 0 end <> case when C.xnkw=2 then 1 else 0 end AND (@v_rkZlzt IS NULL OR @v_rkZlzt='2') GROUP BY m.cpbh)T WHERE cpbh=cpid; -- 2015-11-21 增加对khcpxx表dfqKcs字段的修改 UPDATE khcpxx SET dfqKcs = dfqKcs + dfqYks , 待发数 = CASE WHEN 待发数 > dfqKcs + dfqYks AND 待发数 + dfqYks > 0 THEN 待发数 + dfqYks ELSE 待发数 END FROM (SELECT cpbh cpid, R.kwbh , SUM(CASE WHEN R.xnkw =2 THEN sl ELSE 0 END) AS dfqYks FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh INNER JOIN kwjbxx R ON T.zrkw = R.kwbh INNER JOIN kwjbxx C ON T.zckw = C.kwbh WHERE T.zlbh = @p_zlbh AND M.sl <> 0 AND M.zlzt='2' AND case when R.xnkw=2 then 1 else 0 end <> case when C.xnkw=2 then 1 else 0 end AND (@v_rkZlzt IS NULL OR @v_rkZlzt='2') GROUP BY m.cpbh, r.kwbh)T WHERE cpdm=cpid AND dfkw = t.kwbh; IF @@ROWCOUNT > 0 UPDATE khcpxx SET dfqKcs = dfqKcs -dfqYks2 , 待发数 = CASE WHEN 待发数 > dfqKcs-dfqYks2 AND 待发数 - dfqYks2 > 0 THEN 待发数 - dfqYks2 ELSE 待发数 END FROM (SELECT cpbh cpid, C.kwbh , SUM(CASE WHEN C.xnkw =2 THEN sl ELSE 0 END) AS dfqYks2 FROM cpZkzl T INNER JOIN cpZkzlMx M ON T.zlbh = M.zlbh INNER JOIN kwjbxx R ON T.zrkw = R.kwbh INNER JOIN kwjbxx C ON T.zckw = C.kwbh WHERE T.zlbh = @p_zlbh AND M.sl <> 0 AND M.zlzt='2' AND R.xnkw != 2 AND C.xnkw = 2 AND (@v_rkZlzt IS NULL OR @v_rkZlzt='2') GROUP BY m.cpbh, C.kwbh)T WHERE cpdm=cpid AND dfkw = T.kwbh; END; */ -- 2016-8-7 UPDATE sc_cells SET dczt=ISNULL(@v_rkZlzt, dczt), zjdczt=CASE WHEN @v_rkZlzt IS NOT NULL THEN dczt ELSE zjdczt END, zjjrwz=i.zckw, lksj = getdate(), jrwz = CASE WHEN k.xnkw!=4 THEN i.zrkw ELSE NULL END, jrsj = CASE WHEN k.xnkw!=4 THEN getdate() ELSE NULL END FROM cpzkzl i JOIN kwjbxx k ON i.zrkw = k.kwbh WHERE sc_cells.tpbh = i.zrtp AND i.zlbh = @p_zlbh AND sc_cells.isBinding='Y'; -- 2016-8-27 debug:之前没有加上这个条件,导致历史解除了托盘绑定记录都改掉了 END DROP TABLE #inserted; RETURN; END; ELSE IF(@p_table = 'qtzl') BEGIN DECLARE @lx TINYINT --指令类型 , @ckdm type_ck -- 修改后的仓库代码 , @kwbh type_kwbh -- 修改后的库位编号 , @tpbh varchar(20) --托盘编号 , @tpsl type_sl --实际出入库数 , @kcs type_sl --出库前出库库位上的总库存数 SELECT @old = zt, @ckdm = ckdm, @kwbh = kwbh, @lx = lx , @tpsl = sl, @kcs = ykcs, @tpbh = tpbh FROM qtzl (UPDLOCK) WHERE zlbh = @p_zlbh; -- 变更状态 UPDATE qtzl SET zt = 2, wcsj = GETDATE(), tpcrk=@p_tpcrk WHERE zlbh = @p_zlbh AND zt <> 2; IF @@ROWCOUNT = 0 BEGIN RAISERROR ('空托盘出入库指令 %d 已经完成', 16, 1, @p_zlbh); RETURN; END; IF (@old != 2) BEGIN --解除锁定 EXEC p_unlockCell @ckdm, @kwbh, @p_zlbh --更新库位上的总数量 IF @lx=0 --出库 UPDATE kwjbxx SET zsl = 0--zsl - @tpsl -- 2016-8-29 jzx 不存在出部分空托盘情况 WHERE ckmc = @ckdm AND kwbh = @kwbh AND sfwzzl = 'T'; ELSE --入库 BEGIN UPDATE kwjbxx SET zsl = /*zsl + 2016-8-29 jzx 不存在空托盘追加入库情况 */@tpsl , sfwzzl = 'T', sjwzlx=NULL , tpbh = CASE WHEN flagKzkw=0 AND xnkw=0 THEN @tpbh ELSE tpbh END WHERE ckmc = @ckdm AND kwbh = @kwbh AND (sfwzzl IS NULL OR sfwzzl = 'T'); IF @@rowcount = 0 RAISERROR('不允许将空托盘放入存放了其它物资的库位', 16, 1); END END END; ELSE BEGIN RAISERROR ('无效表参数 %s', 16, 1, @p_table); RETURN; END; END; go