780 lines
36 KiB
Transact-SQL
780 lines
36 KiB
Transact-SQL
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
|