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

780 lines
36 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

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.

USE [ASRS_WXZD_JYMH_CPK]
GO
-- 库位信息表增加“物资种类数”字段,用于标识库位上当前库存不同物资种类个数。不同产品、批次种类不同
ALTER TABLE kwjbxx ADD wzzls SMALLINT NOT NULL DEFAULT 0
GO
-- 各类物资的出库方式都统一设定为整托出库
UPDATE wzlb SET chkufs = 2 WHERE chkufs != 2
go
update sys_config set dqz='cpmc,cpbh' where id_pzx='ckdmx_input_srchFlds';
update sys_config set dqz='cpbh,cpmc,cpgg1,lpxx' where id_pzx='srkz.kctj.khzzd';
go
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[p_decreaseInventory]
-- WITH ENCRYPTION
AS
/**
* 在多个库位上递减库存的过程。
* 待递减的库存数据在临时表#deleted中。该临时表的内容在调用该过程前
* 由其他过程或触发器或其他SQL代码负责填入。
*
* Created by 蒋智湘 on 2006-07-31
* Modified by 蒋智湘 on 2007-02-26 库位上库存总量的更新办法改成汇总库位库存总数后的值,而不是简单的递减
* Modified by jzx on 2009-4-12 保留零库位库存记录,达到记忆目的
* Modified by jzx on 2009-4-28 不再保留零库位库存记录,达到记忆目的。因为那样会出现很多零库存记录,操作者很烦。
* 但删除库存前将零库存记录的库位号记录到cpxx表中
* Modified by jzx on 2009-8-22 更新库位信息表上新增kzjrks字段的值
* Modified by jzx on 2010-7-29 扣减库存前,检查库存,给出足够提示信息,而不是通过表上的约束来报错。
* Mofieid by jzx on 2010-9-17 删除对无效表inventory的操作
* Modified by jzx on 2011-5-10 取出库存表中je字段值的处理。该字段设计有问题
* Modified by jzx on 2011-6-30 修改库存不足错误抛出部分
* Modified by jzx on 2014-10-31 删除零库存记录时仅对inserted表操作的库位处理而不是整个当前库存表中所有的库位
* Modified by jzx on 2015-9-17 当库存扣减时同时扣减字段“前批库存数”的值当扣减后的前批库存数字段值小于等于0后
* 更新rksj字段值为“后批入库时间”字段的值。
* Modified by jzx on 2016-4-25 将删除另库存记录从最后移入到循环体中。整盘出库类项目的执行效率。
另外386项目的库存表上删除触发器有对删除记录的sl是否为0的特殊处理
* Modified by jzx on 2016-5-13 查找库存记录时增加txm字段匹配条件
* Modified by jzx on 2017-10-18 给kwjbxx表上新增字段wzzls赋值
*/
BEGIN
DECLARE @ckmc type_ck, @kwbh type_kwbh, @v_txm varchar(30)
, @kc_jlh INT, @cpbh nvarchar(50), @lpxx type_ph,@zlzt CHAR(1)
, @sl type_sl, @v_kcsl type_sl, @v_jzl type_sl, @v_tpbh nvarchar(50)
SET NOCOUNT ON;
DECLARE @delete_0_inventory BIT;
SELECT @delete_0_inventory = dqz FROM sys_config WHERE id_pzx='delete_0_inventory';
--修改库存时的游标
DECLARE c_kc CURSOR FOR
SELECT kcjlh, ckmc, kwbh, cpbh, lpxx, zlzt, sl, jzl, tpbh, txm
FROM #deleted;
--遍历游标,修改库存
OPEN c_kc
WHILE 1 = 1
BEGIN
FETCH c_kc INTO @kc_jlh, @ckmc, @kwbh, @cpbh, @lpxx, @zlzt, @sl, @v_jzl, @v_tpbh, @v_txm
IF @@FETCH_STATUS <> 0 BREAK;
SET @v_kcsl = 0
--修改库位库存
SELECT @v_kcsl = sl, @kc_jlh = jlh
FROM cpkcxx
WHERE ckmc = @ckmc AND kwbh = @kwbh AND cpbh = @cpbh
AND ISNULL(lpxx, ' ') = ISNULL(@lpxx, ' ') AND zlzt = @zlzt
AND ISNULL(tpbh, ' ') = ISNULL(@v_tpbh, ' ')
AND ISNULL(txm, ' ') = ISNULL(@v_txm, ' ');
IF @v_kcsl < @sl
BEGIN
CLOSE c_kc; -- 2015-1-2 jzx 先关闭游标后抛出异常
DEALLOCATE c_kc;
-- 2011-6-30 RAISERROR 不支持DECIMAL类型参数只能先转换成字符串类型。%d只针对整数类型
DECLARE @v_kcslStr VARCHAR(20), @v_slStr VARCHAR(20)
SET @v_kcslStr = @v_kcsl
SET @v_slStr = @sl
RAISERROR('库位 %s 上编码 %s 的当前库存数 %s 小于要出库的数量 %s', 16, 1, @kwbh, @cpbh, @v_kcslStr, @v_slStr)
RETURN; -- 2015-1-2 jzx 将之前的break改成return
END;
-- 删除零库存记录
IF @delete_0_inventory = 1
BEGIN
DELETE cpkcxx WHERE jlh = @kc_jlh AND sl = @sl;
IF @@ROWCOUNT <= 0
UPDATE cpkcxx SET sl = sl - @sl, 前批库存数 = 前批库存数 - @sl
, rksj = CASE WHEN 前批库存数<=@sl AND 后批入库时间>rksj THEN 后批入库时间 ELSE rksj END
WHERE jlh = @kc_jlh;
END
ELSE
BEGIN
UPDATE cpkcxx SET sl = sl - @sl, 前批库存数 = 前批库存数 - @sl
, rksj = CASE WHEN 前批库存数<=@sl AND 后批入库时间>rksj THEN 后批入库时间 ELSE rksj END
WHERE jlh = @kc_jlh;
END;
--修改库位上的总数量,可追加入库数量,实际存放物资的质量状态
UPDATE kwjbxx SET zsl=ISNULL(sumsl, 0), kzjrks = kzjrks + @sl, sjwzlx=zl, wzzls=ISNULL(zls,0) -- 2009-8-22 jzx 增加kzjrks字段的修改
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, MIN(zlzt) AS zl, COUNT(DISTINCT cpbh+ISNULL(lpxx,'')) zls
FROM cpkcxx
WHERE ckmc=@ckmc AND kwbh = @kwbh AND sl!=0
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='update_cpxx_cfkw' AND dqz='1')
UPDATE cpxx SET zjcfkw = kwbh
FROM cpkcxx JOIN ckxx ON cpkcxx.ckmc = ckxx.dm AND ckxx.sfpk=0
WHERE cpxx.cpbh = cpkcxx.cpbh
AND cpkcxx.sl = 0
AND ISNULL(zjcfkw, '') != kwbh;
-- 删除零库存记录 2016-4-25 从386项目开始将其移到前面循环里执行。
--IF EXISTS(SELECT 2 FROM sys_config WHERE id_pzx='delete_0_inventory' AND dqz='1')
-- DELETE cpkcxx FROM (SELECT DISTINCT kwbh FROM #deleted) d WHERE sl=0 AND cpkcxx.kwbh=d.kwbh;
END
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赋值
*/
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
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 VIEW [dbo].[cpkcxx_v]
AS
/**
* 查询所有可出库位的情况
* Created By jzx 2006-05-24
* Used by 出库指令生成界面安排出库库位存储过程ScglManager
* Modified by jzx on 2006-12-19 增加供应单位字段的输出
* Modified by jzx on 2007-02-01 修改计划出库数来此未完成出库单的指令数量和,而不是通过触发器在库存表中记录的计划出库数
* 因为触发器实现有问题
* Modified by jzx on 2007-03-09 如果库位被锁定, 只要不是人工锁定,且是出库锁,也允许出库。有了计划出库数控制数量,这样设计是安全的
* Modified by jzx on 2010-8-8 增加备注信息字段输出
* Modified by jzx on 2010-8-25 库位号不会有NULL值所以去掉对库位的ISNULL处理;对NULL值该用CASE WHEN 处理而不是用和数据库相关的ISNULL函数
* Modified by jzx on 2010-8-26 检查未审核出库单时仅检查7天内的。绝大多数情况下7天前的单子肯定是已经审核了
* 所以让系统去搜索7天前的未审核单子没有必要。
* Modified by jzx on 2011-6-14 增加对有带批次产品的支持,此时批号不为空,且出库时必须输入批号。
* Modified by jzx on 2011-6-18 增加输出字段flagKzkw, xnkw, pai, lie, ceng;不再排除入库锁定的库位
* Modified by jzx on 2011-7-28 计划出库部分把未审核的转库指令也包含进来
* Modified by jzx on 2011-10-15 将txm作为库存记录的唯一值字段
* Modified by jzx on 2011-11-28 将cfwzxx作为库存记录的唯一值字段
* Modified by jzx on 2012-4-13 sfsd字段有等于"-2"的可能因此不能用sfsd!=-1筛选手工锁定库位;
计划出库数添加sc_gcgzb部分的占用
* Modified by jzx on 2012-9-5 计算计划占用量时剔除日期筛选条件2005或更高版本的数据库支持条件索引
可以通过创建zt=0的条件索引提高未审核单据的检索效率
* Modified by jzx on 2013-5-1 增加scJhbh字段输出
* Modified by jzx on 2013-5-29 增加piz,cpgg3字段输出
* Modified by jzx on 2013-12-25 关联库位信息表,滤掉(临时)无效库位对应的库存记录。
* Modified by jzx on 2014-9-16 增加storeDist字段输出
* Modified by jzx on 2014-10-13 增加wckw、nckw、hdh字段输出
* Modified by jzx on 2014-10-15 增加bzl字段输出
* Modified by jzx on 2014-11-22 返回的kwzsl在原来kwjbxx.zsl字段值的基础上扣减计划出库部分。
这样处理后,当一个库位多次安排出库时,程序判断出库指令是否为整盘出库指令的更加准确。
* Modified by jzx on 2014-12-9 增加输出字段:双伸位都有货
* Modified by jzx on 2015-10-10 只有出库自动锁定的库位可以加入结果集
* Modified by jzx on 2016-4-26 增加cfwzxx和piz字段输出
* Modified by jzx on 2016-5-13 增加“预约出库时间”字段输出
* Modified by jzx on 2016-6-18 增加“托盘个数”字段输出
* Modified by jzx on 2016-7-16 将READ PAST锁提示更改成NOLOCK。cpkcxx表的READ PAST提示删除
* Modified by jzx on 2017-10-18 增加ysbj(颜色标记字段输出。1标识库位上存放的是拼箱0标识正常单一物资
*/
SELECT a.ckmc, a.kwbh, a.flagKzkw, a.xnkw, a.pai, a.lie, a.ceng, a.storeDist, b.cpbh, b.lpxx,
B.sl - ISNULL(ck.jhcks,0) AS sl,
b.jlh, b.tpbh, b.zlzt, b.cpmc, b.cpgg1, b.cpgg2, b.cpgg3, b.jldw, b.rksj,
b.wzlb, a.sfsd AS sbh, a.zsl - ISNULL(ck2.jhcks2,0) AS kwzsl, b.gydw, b.bz, b.txm--, b.piz, b.cfwzxx, b.scJhbh
, a.wckw, a.nckw, a.hdh, b.jzl bzl, a.双伸位都有货
, b.cfwzxx, b.piz, b.预约出库时间, a.托盘个数,b.scrq,b.hth,b.hjzt,b.ywy,b.mxcc,b.gdh,b.yt,b.gx,b.scfc,b.bc
, CASE WHEN a.wzzls > 1 THEN 1 ELSE 0 END ysbj
FROM dbo.cpkcxx AS b INNER JOIN dbo.kwjbxx(NOLOCK) AS a ON b.kwbh = a.kwbh AND a.sfyx=1
LEFT JOIN
(SELECT zl, cpbh, lpxx, kwbh, tpbh/*, txm*/, SUM(jhcks) jhcks -- 库位限定物资的计划出库部分
FROM (SELECT D.zl, Z.cpbh, Z.lpxx, Z.kwbh, Z.tpbh/*, Z.txm*/, SUM(Z.sl) AS jhcks
FROM ckzl(NOLOCK) Z INNER JOIN dbo.ckd(NOLOCK) D ON Z.pzbh = D.ckdh
WHERE (D.zt = 0) AND (D.sflz = 1)
GROUP BY D.zl, Z.cpbh, Z.lpxx, Z.kwbh, Z.tpbh--, Z.txm
UNION ALL
SELECT Z.zlzt zl, Z.cpbh, Z.lpxx, D.zckw kwbh, D.zctp tpbh/*, Z.txm*/, SUM(Z.sl) AS jhcks
FROM cpZkzlMx(NOLOCK) AS Z INNER JOIN dbo.cpZkzl(NOLOCK) D ON Z.zlbh = D.zlbh
WHERE D.zt != 2
GROUP BY Z.zlzt, Z.cpbh, Z.lpxx, D.zckw, D.zctp--, Z.txm
) AS T
GROUP BY zl, cpbh, lpxx, kwbh, tpbh/*, txm*/) AS ck
ON b.cpbh = ck.cpbh AND b.zlzt=ck.zl
AND b.kwbh = ck.kwbh
AND ISNULL(b.lpxx, ' ') = ISNULL(ck.lpxx, ' ')
AND ISNULL(b.tpbh, ' ') = ISNULL(ck.tpbh, ' ')
--AND ISNULL(b.txm, ' ') = ISNULL(ck.txm, ' ')
LEFT JOIN
(SELECT kwbh, SUM(jhcks) jhcks2 -- 库位所有物资的计划出库部分
FROM (SELECT Z.kwbh, SUM(Z.sl) AS jhcks
FROM ckzl(NOLOCK) Z INNER JOIN dbo.ckd(NOLOCK) D ON Z.pzbh = D.ckdh
WHERE (D.zt = 0) AND (D.sflz = 1)
GROUP BY Z.kwbh
UNION ALL
SELECT D.zckw kwbh, SUM(Z.sl) AS jhcks
FROM cpZkzlMx(NOLOCK) AS Z INNER JOIN dbo.cpZkzl(NOLOCK) D ON Z.zlbh = D.zlbh
WHERE D.zt != 2
GROUP BY D.zckw
) AS T
GROUP BY kwbh) AS ck2
ON b.kwbh = ck2.kwbh
WHERE --a.sfsd >= 0
(a.sfsd = 0 OR (a.sfsd > 0 AND a.suolx=0))
AND (b.sl > ISNULL(ck.jhcks,0))
GO
ALTER VIEW [dbo].[v_report_kctj]
AS
/**
* 库存汇总查询视图。
* 329项目汇总库存数据不是来自库位库存表而是物料供应商关系表。
* 考虑到其他项目会不一样所以更改成使用视图方式避免修改java代码。
* Created by jzx on 2014-9-22
* Used by 当前合格品/不良品库存汇总查询
* Modified by jzx on 2015-1-29 关联cpxx表读取jxh字段
* Modified by jzx on 2016-4-13 增加kwbh字段输出
* Modified by jzx on 2016-4-21 增加tpbh字段输出
* Modified by jzx on 2016-5-13 debug:返回的ckmc字段值不是固定的'LTCK'而是去cpkcxx.ckmc字段值
* Modified by jzx on 2016-8-29 增加txm、cfwzxx输出字段
* Modified by jzx on 2017-10-18 增加cpgg1,cpgg2,cpgg3,pai,lie,ceng,hdh输出字段
*/
SELECT cpbh,cpmc,cpgg1,cpgg2,cpgg3,pai,lie,ceng,hdh
, CASE WHEN xnkw!=2 THEN sl ELSE 0 END AS ybzKcs
, CASE WHEN xnkw=2 THEN sl ELSE 0 END AS dfqKcs
, sl kczs, lpxx, wzlb, a.zlzt AS zlzt, a.ckmc
, NULL AS jianc, a.gydw AS gysmc, NULL zjm, b.jxh
, a.kwbh, a.tpbh, a.txm, a.cfwzxx
, b.jldw jldw,a.jzl as jzl,a.bz as bz, CAST(a.sl/a.jzl AS DECIMAL(12,1)) js
FROM cpkcxx a-- LEFT JOIN gysxx g ON a.lpxx = g.dm
LEFT JOIN (SELECT jldw,cpbh cpid, jxh FROM cpxx) b ON a.cpbh=b.cpid
LEFT JOIN (SELECT kwbh kwid, xnkw,pai,lie,ceng,hdh FROM kwjbxx) k ON a.kwbh=k.kwid
WHERE a.sl!=0
GO
ALTER PROCEDURE [dbo].[p_autoAllocateRetrieveCells]
@p_dh type_dh
, @p_mxbh INT = NULL --允许只自动安排某个出库单明细记录的出库库位。为NULL则表示指定出库单的所有明细
, @p_kcjlh INT = NULL -- 是否指定出指定记录号的库存记录明细。手动安排时会传递实际值
, @p_czr VARCHAR(20) = NULL
-- WITH ENCRYPTION
AS
/**
* 对选定出库单或其明细记录安排出库库位
*
* Created by jzx on 2006-07-21
* Used by 出库单上的自动出库库位。
* Modified by jzx on 2006-10-20 提取可选库位时,不再需要批号相同;并将批号信息存入出库指令表中
* Modified by jzx on 2006-12-19 更改参数:去除仓库、库位,改用库存记录号;在出库指令中记录入库物资的供应单位
* Modified by jzx on 2006-12-28 在出库指令中记录对应出入库单单号存入ckzl表上的pzbh字段
* Modified by jzx on 2009-8-13 增加对明细确定了供应单位时,所出库位只能是指定供应单位的那部分,而不是全部。
* 当明细确定了批号时,取指定批号的库位
* Modified by jzx on 2009-8-22 将库存记录上的入库时间转出到指令表上
* Modified by jzx on 2010-8-8 将库存备注信息带入ckzl表中
* Modified by jzx on 2010-8-25 使用配置项 ckkw.zdap.kwgs 的当前值,确定安排的库位个数
* Modified by jzx on 2010-9-15 共用同一库位的指令号时,仅对非虚拟库位适用
* Modified by jzx on 2011-6-19 零散数量默认从虚拟库位或者扩展库位上出
* Modified by jzx on 2011-8-6 当确定批次出库时,不再按入库时间排序
* Modified by jzx on 2011-11-4 在手工确定出库库存记录的情况下,不检查批号是否匹配
* Modified by jzx on 2011-11-28 单据记录筛选条件中增加D.sflz=1
* Modified by jzx on 2014-9-26 329项目原包装小件拉动出库(ckd.clfs=1)时,需要往上取整整件出库。
* Modified by jzx on 2014-10-15 329 项目开始在ckzl表中存储bzl字段值该值来自库存记录表而不是ckdmx表
* Modified by jzx on 2014-10-24 在指定批次的情况下,按入库时间排序时,只需要精确到日就可以了,不需要精确到秒;
外侧(靠巷道堆垛机一侧)库位优先安排出库。
* Modified by jzx on 2014-10-31 在wzlb表中指定特定类别的物料是整箱出库还是整盘出库抑或是按实际需求数量出库
* Modified by jzx on 2014-11-6 当某种物料在立库平库都有时,立库库位优先安排。主要考虑特殊物料情况。
* Modified by jzx on 2014-11-11 拉动出库时,特殊物料库位也不能安排。特殊物料出库是在收货确认时在特殊库位上扣减库存
* Modified by jzx on 2014-12-9 仅在双伸位都有货时才优先安排浅库位wckw is null出库
优先安排数量少的库位而不是多的库位,为的是尽量减少拣选回库。
* Modified by jzx on 2015-1-8 增加SET NOCOUNT ON代码行
* Modified by jzx on 2015-9-6 严格按照先进现出原则,即使安排的是深货位
* Modified by jzx on 2015-10-20 重新启用系统配置项ckkw.zdap.kwgs的作用且只安排单个库位情况下自动修改ckdmx.shsl字段值为实际安排数量的值
* Modified by jzx on 2015-10-21 前一次更新代码中忘记更新ckdmx.js字段值
* Modified by jzx on 2015-10-23 将ckd表上新增字段“限定出库口”的值作为ckzl表记录tpcrk字段值的默认值
* Modified by jzx on 2015-10-24 仅对自动生成的拉动出库单明细记录才自动修改ckdmx.shsl字段值为yapsl字段值
* Modified by jzx on 2015-11-20 安排立库实体库位时,如果设定的托盘出入库口不同,则不能共享指令编号
* Modified by jzx on 2015-12-8 增加参数p_czr用于传递调用这个过程的管理系统登录账号
* Modified by jzx on 2015-12-11 当参数@p_kcjlh不为空时允许安排出库的出库数量为0
* Modified by jzx on 2016-1-4 debug: 当需要在立库库位上安排零头出库时,计算立库库位出库整箱(向下取整)数量时,用错了变量。
* Modified by jzx on 2016-3-23 同一入库日期的先按storeDist的值排序然后再按sl排序
* Modified by jzx on 2016-4-26 处理ckdmx表新字段“限定出库托盘”对库位安排的影响将cfwzxx,piz,txm字段存入ckzl表
* Modified by jzx on 2016-4-27 debug 上一次修改代码中,对限定出库托盘条件筛选处理语句有错误。
* Modified by jzx on 2017-10-18 整托出库安排方式如果出库单明细中没有托盘上有的其他物资也需要安排掉同时给ckzl.ysbj字段赋值
*/
BEGIN
DECLARE @v_cpbh type_cpbh, @v_lpxx type_ph, @v_cksl type_sl, @v_zlsl type_sl, @v_kcsl type_sl
, @v_mxbh INT, @v_zlbh INT, @v_zlbh_length TINYINT
, @v_kcjlh INT --库存记录号
, @v_ckmc type_ck, @v_kwbh type_kwbh, @v_tpbh nvarchar(50), @v_zljlh INT --出库指令表的记录号
, @v_zlzt CHAR(1)--出库物资的质量状态
, @v_kwzsl type_sl --出库库位上所有物资的总数量
, @v_kckwxx CURSOR
, @c_sl type_sl --cpkcxx数量
, @v_gydw NVARCHAR(60)
, @v_kc_rksj SMALLDATETIME, @v_kcbz VARCHAR(200)
, @v_config CHAR(1)
, @v_ckck type_ck
, @v_jzl INT
, @v_kzkw TINYINT
, @v_xnkw TINYINT
, @v_hasXnkw TINYINT
, @v_clfs CHAR(1)
, @v_wzlb VARCHAR(15)
, @v_zlsl2 type_sl
, @v_chkufs TINYINT -- 出库方式0按需出库;1整箱出库;2整盘出库
, @v_浅库位 type_kwbh -- 如果不为null则表示遍历的库位为深库位
, @v_浅库位有货 BIT -- 标识浅库位是否有货
, @v_跳过的库位数 INT
, @v_跳过内侧库位 TINYINT -- 0表示没有遍历到深库位1表示跳过一次试图先安排外侧库位2表示跳过两次遍历安排的库位数还不够只好最后尝试安排深库位
, @v_tpcrk NVARCHAR(20)
, @v_限定出库托盘 varchar(12)
, @piz NUMERIC(8,3), @txm VARCHAR(30), @cfwzxx TINYINT, @v_ysbj TINYINT;
DECLARE c_ckdmx CURSOR FOR
SELECT M.mxbh, M.cpbh, M.lpxx, M.shsl - M.yapsl AS cksl, D.zl, M.ghs, M.lpxx, D.ckbh ckck
, ISNULL(D.clfs,'0') clfs, M.wzlb, W.chkufs, D.限定出库口, M.限定出库托盘--, ISNULL(M.jzl, 1) jzl
FROM ckdmx M INNER JOIN ckd D ON M.ckdh = D.ckdh AND D.zt = 0 AND D.sflz=1
LEFT JOIN wzlb W ON M.wzlb = W.dm
WHERE (M.ckdh = @p_dh)
AND (@p_mxbh IS NULL OR mxbh = @p_mxbh)
AND (shsl > yapsl OR (@p_kcjlh IS NOT NULL))
ORDER BY M.cpbh, M.lpxx
SET NOCOUNT ON;
SELECT @v_config = dqz FROM sys_config WHERE ID_pzx = 'ckkw.zdap.kwgs';
OPEN c_ckdmx
WHILE 1 = 1
BEGIN
FETCH c_ckdmx INTO @v_mxbh, @v_cpbh, @v_lpxx, @v_cksl, @v_zlzt, @v_gydw, @v_lpxx, @v_ckck, @v_clfs, @v_wzlb, @v_chkufs
, @v_tpcrk, @v_限定出库托盘--, @v_jzl
IF @@FETCH_STATUS <> 0 BREAK;
SET @v_跳过内侧库位 = 0;
单项库位安排:
IF (@v_lpxx IS NOT NULL)
SET @v_kckwxx = CURSOR FOR
SELECT I.jlh, I.ckmc, I.kwbh, I.sl, I.tpbh, I.kwzsl, I.lpxx, I.gydw, I.rksj, I.bz, I.xnkw, I.bzl, I.wckw, I.双伸位都有货
, I.piz, I.txm, I.cfwzxx, ysbj
FROM cpkcxx_v I
WHERE I.cpbh = @v_cpbh
AND I.zlzt = @v_zlzt
AND I.ckmc = @v_ckck -- 2011-6-19 jzx 必须从指定仓库中出
AND ( (@p_kcjlh IS NULL
--AND (@v_gydw IS NULL OR gydw = @v_gydw) -- 限定出指定供应商的产品
AND lpxx = @v_lpxx
)
OR jlh = @p_kcjlh
)-- 329项目开始拉动出库时不能安排特殊物料库位和待发区库位
-- 2015-12-14 jzx 如果用户手工选定了库位,则可以选择特殊库位
AND (@v_clfs NOT IN('1','2') OR I.xnkw NOT IN(2,CASE WHEN @p_kcjlh IS NULL THEN 3 ELSE 2 END))
AND (@v_限定出库托盘 IS NULL OR (@p_kcjlh IS NOT NULL OR tpbh=@v_限定出库托盘)) -- 2016-1-13 346碧陆斯项目开始支持制单的时候就限定出库托盘
ORDER BY xnkw,CAST(I.rksj AS DATE), storeDist, I.sl, ceng;
ELSE -- 不限定批号出库
SET @v_kckwxx = CURSOR FOR
SELECT I.jlh, I.ckmc, I.kwbh, I.sl, I.tpbh, I.kwzsl, I.lpxx, I.gydw, I.rksj, I.bz, I.xnkw, I.bzl, I.wckw, I.双伸位都有货
, I.piz, I.txm, I.cfwzxx, ysbj
FROM cpkcxx_v I
WHERE I.cpbh = @v_cpbh
AND I.zlzt = @v_zlzt
AND I.ckmc = @v_ckck -- 2011-6-19 jzx 必须从指定仓库中出
AND ( (@p_kcjlh IS NULL
AND (@v_gydw IS NULL OR gydw = @v_gydw) -- 限定出指定供应商的产品
)
OR jlh = @p_kcjlh
)-- 329项目开始拉动出库时不能安排特殊物料库位和待发区库位
-- 2015-12-14 jzx 如果用户手工选定了库位,则可以选择特殊库位
AND (@v_clfs NOT IN('1','2') OR I.xnkw NOT IN(2,CASE WHEN @p_kcjlh IS NULL THEN 3 ELSE 2 END))
AND (@v_限定出库托盘 IS NULL OR (@p_kcjlh IS NOT NULL OR tpbh=@v_限定出库托盘)) -- 2016-1-13 346碧陆斯项目开始支持制单的时候就限定出库托盘
ORDER BY xnkw,CAST(I.rksj AS DATE), storeDist, I.sl, ceng;
OPEN @v_kckwxx
WHILE @v_cksl > 0 OR @p_kcjlh IS NOT NULL -- 2015-12-11 jzx 库存记录号指定情况下,不受@v_cksl是否大于0限制
BEGIN
FETCH @v_kckwxx INTO @v_kcjlh, @v_ckmc, @v_kwbh, @v_kcsl, @v_tpbh, @v_kwzsl, @v_lpxx, @v_gydw, @v_kc_rksj, @v_kcbz, @v_xnkw
, @v_jzl, @v_浅库位, @v_浅库位有货, @piz, @txm, @cfwzxx, @v_ysbj
IF @@FETCH_STATUS <> 0 BREAK;
--确定指令上的出库数量。
SET @v_zlsl = CASE WHEN @v_kcsl >= @v_cksl THEN @v_cksl ELSE @v_kcsl END;
-- 329项目特性从立库出库的小件需要向上取整整包装出库
IF @v_jzl > 1 AND 1=@v_chkufs
BEGIN
SET @v_zlsl2 = CEILING(@v_cksl/@v_jzl) * @v_jzl;
IF @v_kcsl >= @v_zlsl2 AND @v_zlsl <> @v_zlsl2
SET @v_zlsl = @v_zlsl2;
END;
ELSE IF 2=@v_chkufs -- 2014-10-31 支持整盘出库
BEGIN
SET @v_zlsl = @v_kcsl;
END;
-- 2011-6-19 jzx 默认整件出库。不足一件时,则从虚拟货库位上出
ELSE IF @p_kcjlh IS NULL -- 未指定选用单个库存记录行的情况下(手工选择出库库位时,@p_kcjlh IS NOT NULL
AND @v_jzl > 1 AND @v_zlsl > @v_jzl AND @v_zlsl > floor(@v_zlsl/@v_jzl)*@v_jzl
BEGIN
IF @v_hasXnkw IS NULL
BEGIN
SET @v_hasXnkw = 0;
IF EXISTS(SELECT 1 FROM cpkcxx_v I
WHERE I.cpbh = @v_cpbh
AND I.zlzt = @v_zlzt
AND I.ckmc = @v_ckck -- 2011-6-19 jzx 必须从指定仓库中出
AND ISNULL(I.lpxx, ' ') = ISNULL(@v_lpxx, ' ')
AND I.kwbh != @v_kwbh
AND I.xnkw != 0
AND (@v_clfs NOT IN('1','2') OR I.xnkw NOT IN(2,3))
)
BEGIN
SET @v_hasXnkw = 1;
END;
END;
IF (@v_hasXnkw != 0) -- 说明存在虚拟库位库存记录
BEGIN
-- 2016-1-4 jzx debug: 之前用错变量了,不应该是@v_cksl而是@v_kcsl
--SET @v_zlsl = FLOOR(@v_cksl/@v_jzl) * @v_jzl;
SET @v_zlsl = FLOOR(@v_kcsl/@v_jzl) * @v_jzl;
END;
END;
--确定指令号
SET @v_zlbh = NULL;
--共用同仓库库位状态为0的出库指令的指令号
IF @v_xnkw = 0
SELECT @v_zlbh = zlbh FROM ckzl WHERE ckmc = @v_ckmc AND kwbh = @v_kwbh AND zt = 0
AND ISNULL(tpcrk,' ') = ISNULL(@v_tpcrk, ' '); -- 2015-11-20 jzx 必须是同一个出入库口的任务
ELSE -- 虚拟库位共用指令号时,必须是同一出库单
SELECT @v_zlbh = zlbh FROM ckzl WHERE ckmc = @v_ckmc AND kwbh = @v_kwbh AND zt = 0 AND pzbh = @p_dh;
--如果没有找到,则新增一个
IF @v_zlbh IS NULL
EXEC p_instNoCreator @v_zlbh OUT, 1;
--提取指令记录号
SET @v_zljlh = NULL
SELECT @v_zljlh = MAX(jlh) + 1 FROM ckzl;
IF @v_zljlh IS NULL
SET @v_zljlh = 1
--设置出库指令单号(pzbh)
SELECT @p_dh= ckdh FROM ckdmx H WHERE mxbh=H.mxbh AND mxbh=@v_mxbh;
--得到库存可出数量 -07-12-15
--SELECT @c_sl=J.sl FROM cpkcxx J WHERE jlh = @v_kcjlh
SET @c_sl = @v_kcsl;
--插入出库指令
INSERT INTO ckzl(jlh, zlbh, mxbh, kcjlh, ckmc, kwbh, tpbh, ykcs, sl, hkzt,cpbh, lpxx, gydw,pzbh,zlzt
,pkcsl,kc_rksj, kcbz, bzl, tpcrk, czr, cfwzxx, piz, txm, ysbj)
VALUES (@v_zljlh, @v_zlbh, @v_mxbh, @v_kcjlh, @v_ckmc, @v_kwbh, @v_tpbh, @v_kwzsl, @v_zlsl
, CASE WHEN @v_kwzsl > @v_zlsl AND @v_chkufs!=2 THEN 0 ELSE NULL END -- 2017-10-18 增加 AND @v_chkufs!=2 条件
, @v_cpbh, @v_lpxx, @v_gydw, @p_dh,@v_zlzt
, @c_sl,@v_kc_rksj, @v_kcbz, @v_jzl, @v_tpcrk, @p_czr, @cfwzxx, @piz, @txm, @v_ysbj);
-- 2017-10-18 增加下面分支
IF @v_chkufs = 2 AND EXISTS(SELECT 2 FROM cpkcxx_v WHERE kwbh=@v_kwbh AND tpbh=@v_tpbh AND jlh!=@v_kcjlh AND sl>0)
BEGIN
DECLARE @v_mxbh2 INT;
DECLARE c_kckwxxOther CURSOR FOR
SELECT I.jlh, I.sl, I.cpbh, I.lpxx, I.gydw, I.rksj, I.bz, I.bzl
, I.piz, I.txm, I.cfwzxx
FROM cpkcxx_v I
WHERE kwbh=@v_kwbh AND tpbh=@v_tpbh AND jlh!=@v_kcjlh AND sl>0;
OPEN c_kckwxxOther;
WHILE 1=1
BEGIN
FETCH c_kckwxxOther INTO @v_kcjlh, @v_kcsl, @v_cpbh, @v_lpxx, @v_gydw, @v_kc_rksj, @v_kcbz
, @v_jzl, @piz, @txm, @cfwzxx
IF @@FETCH_STATUS <> 0 BREAK;
SET @v_zljlh = @v_zljlh + 1;
-- 如果单据明细上有其他批次的物料,则绑定明细到这条记录上
SET @v_mxbh2 = NULL;
SELECT @v_mxbh2 = mxbh FROM ckdmx WHERE cpbh=@v_cpbh AND ckdh=@p_dh AND mxbh != @v_mxbh;
INSERT INTO ckzl(jlh, zlbh, mxbh, kcjlh, ckmc, kwbh, tpbh, ykcs, sl, hkzt,cpbh, lpxx, gydw,pzbh,zlzt
,pkcsl,kc_rksj, kcbz, bzl, tpcrk, czr, cfwzxx, piz, txm, ysbj)
VALUES (@v_zljlh, @v_zlbh, ISNULL(@v_mxbh2, @v_mxbh), @v_kcjlh, @v_ckmc, @v_kwbh, @v_tpbh, @v_kwzsl, @v_kcsl
, NULL, @v_cpbh, @v_lpxx, @v_gydw, @p_dh, @v_zlzt
, @v_kcsl,@v_kc_rksj, @v_kcbz, @v_jzl, @v_tpcrk, @p_czr, @cfwzxx, @piz, @txm, @v_ysbj);
SET @v_cksl = @v_cksl - @v_kcsl;
END;
CLOSE c_kckwxxOther;
DEALLOCATE c_kckwxxOther;
END;
--递减尚未安排出库的数量
SET @v_cksl = @v_cksl - @v_zlsl;
IF @v_config = '1' -- 如果仅安排一个库位情况下,立马退出循环
BEGIN
-- 2015-10-20 jzx 还要自动修改shsl字段值为yapsl
-- 2015-10-21 jzx 还要更新js字段值
-- 2015-10-24 jzx 仅对自动拉动出库单的出库指令才修改shsl字段值
IF @v_clfs IN('2')
UPDATE ckdmx SET shsl=yapsl,js=CAST(yapsl/jzl AS DECIMAL(10,1)) WHERE mxbh=@v_mxbh AND shsl<>yapsl;
BREAK;
END;
SET @v_hasXnkw = NULL;
END
CLOSE @v_kckwxx;
DEALLOCATE @v_kckwxx;
IF @v_cksl > 0 AND @v_跳过的库位数 > 0
BEGIN
-- 再次打开游标处理
SET @v_跳过内侧库位 = @v_跳过内侧库位 + 1;
GOTO 单项库位安排;
END;
END
CLOSE c_ckdmx
DEALLOCATE c_ckdmx;
END
go