Files
old_jintiantongye_wms/db/数据库更新20171107.sql
2025-09-12 17:30:18 +08:00

357 lines
30 KiB
Transact-SQL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****** 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