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

1010 lines
82 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: 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