1010 lines
82 KiB
Transact-SQL
1010 lines
82 KiB
Transact-SQL
/****** 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 |