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

320 lines
23 KiB
Transact-SQL
Raw Blame History

This file contains invisible Unicode characters

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

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

/****** Object: StoredProcedure [dbo].[p_生成同巷道多托盘深浅存放的转库指令] Script Date: 2017/9/30 星期六 13:48:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[p_生成同巷道多托盘深浅存放的转库指令]
(
@操作用户名 varchar(20),
@排除巷道列表 VARCHAR(50),
@限定存放分区 VARCHAR(50),
@转移指令个数 INT,
@成功转库数 INT OUTPUT,
@转库指令号 INT OUTPUT -- 生成多条转库指令时,返回第一条转库指令号
)
AS
/**
* 将分布在不配对的深浅货位托盘归并到一对深浅货位存放
* 转出库位要么在深货位,要么在浅货位。
* Created by jzx on 2015-9-16
* Used by CkczManager类
* Modified by jzx on 2015-10-15 转出库位增加“库位个数”字段筛选,以及是否被未审核出入库单据占用
* Modified by jzx on 2017-9-30 之前未考虑qysx字段值为null的库位
*/
BEGIN
IF LEN(@排除巷道列表)>0
BEGIN
IF @排除巷道列表 NOT LIKE ',%'
SET @排除巷道列表 = ',' + @排除巷道列表;
IF @排除巷道列表 NOT LIKE '%,'
SET @排除巷道列表 = @排除巷道列表 + ',';
END;
SET NOCOUNT ON
DECLARE c CURSOR FOR
SELECT x.kwbh,x.hdh,r.cpbh,ISNULL(r.lpxx, ''),r.zlzt,r.rksj,cpxx.cfkwFqsx,x.qysx,x.kfwpgd,x.kfwpzl
, '将分布在不配对的深浅货位托盘归并到一对深浅货位存放' bz
FROM kwjbxx x join (select kwbh kw, max(b.cpbh)cpbh,max(b.lpxx)lpxx,max(b.zlzt)zlzt,count(*)jls, min(rksj) rksj
from cpkcxx b where b.zlzt='2' and b.sl > 0 and isnumeric(b.cpbh)=1
group by kwbh
having count(*)=1 -- 库位上值存放了一种产品
)r on x.kwbh=r.kw
join cpxx on r.cpbh=cpxx.cpbh
WHERE x.zsl>0 AND x.sfsd=0 AND x.xnkw=0
AND (wckw IS NOT NULL OR nckw IS NOT NULL)
AND x.双伸位都有货 = 0
AND (@排除巷道列表 IS NULL OR @排除巷道列表 NOT LIKE '%,'+CAST(hdh AS varchar(2))+',%')
AND (@限定存放分区 IS NULL OR @限定存放分区=x.qysx)
AND x.托盘个数>0 -- 确保托盘在库位上
AND NOT EXISTS(SELECT 2 FROM v_未完成指令 v WHERE v.kwbh=x.kwbh) -- 确保没有其他未审核单据操作此库位
ORDER BY storeDist desc;
DECLARE @zckw VARCHAR(20), @zrkw VARCHAR(20), @hdh TINYINT, @zlbh INT
, @cpbh type_cpbh, @lpxx type_ph, @zlzt char(1), @限定存放分区值 varchar(20)
, @kfwpgd int, @kfwpzl int, @match char(1), @cntRows INT, @zcyy VARCHAR(200)
, @rksj DATE, @库位分区值 varchar(20);
SET @cntRows = 0;
SET @成功转库数 = 0;
SET @转库指令号 = NULL;
IF ISNULL(@转移指令个数, 0) < 1
SET @转移指令个数 = 1;
OPEN c;
WHILE 1=1
BEGIN
FETCH c INTO @zckw, @hdh, @cpbh, @lpxx, @zlzt, @rksj, @限定存放分区值, @库位分区值, @kfwpgd, @kfwpzl, @zcyy;
IF @@FETCH_STATUS <> 0
BREAK;
SET @cntRows = @cntRows + 1;
-- 遍历库位所在巷道必有存放有同产品的多个库位
IF NOT EXISTS(select count(*)jls
from cpkcxx b join kwjbxx k on b.kwbh=k.kwbh
where b.zlzt='2'
AND b.sl > 0 -- 入库指令完成后入库单没有审核前会出现sl=0的情形
AND b.sl=k.zsl -- 库位上只存放一种产品是成立
AND (wckw IS NOT NULL OR nckw IS NOT NULL)
AND k.双伸位都有货 = 0
AND k.hdh=@hdh AND b.cpbh=@cpbh AND ISNULL(b.lpxx,'')=@lpxx AND b.zlzt=@zlzt
having count(*) > 1)
begin
PRINT '找不到和出库库位' + @zckw + '上存放产品相同的库位'
CONTINUE;
end;
SET @zrkw = NULL;
SET @zlbh = NULL;
SET @match = 0
SELECT TOP 1 @zrkw=kwbh
,@match = case when k.kw is not null and substring(kwbh,3,4)=substring(kw,3,4) AND hdh=@hdh and nckw is null then 4
when k.kw is not null and substring(kwbh,3,4)=substring(@zckw,3,4) AND hdh=@hdh and nckw is null then 3
when k.kw is not null then 2
when substring(kwbh,3,4)=substring(@zckw,3,4) then 1
else 0 end
FROM kwjbxx m left join (select distinct k.kwbh kw from cpkcxx k join kwjbxx r on k.kwbh=r.kwbh
-- 浅货位有先入库的同物资深库位,优先存放
where k.rksj < @rksj and cpbh=@cpbh and ISNULL(lpxx,'')=@lpxx and k.zlzt=@zlzt and nckw is not null
and ISNULL(r.qysx, @限定存放分区值)=@限定存放分区值 and xnkw=0 and r.hdh=@hdh
)k
on m.wckw=k.kw
WHERE hdh=@hdh AND (ISNULL(qysx,@限定存放分区值)=@限定存放分区值) AND zsl=0 AND sfsd=0 AND xnkw=0
AND isnull(kfwpgd,0)>=isnull(@kfwpgd,0) AND isnull(kfwpzl,0)>=isnull(@kfwpzl,0)
AND EXISTS(SELECT 2 FROM cpkcxx x JOIN kwjbxx k ON x.kwbh=k.kwbh
WHERE x.kwbh IN(m.wckw,m.nckw) AND x.kwbh != @zckw
AND x.sl=k.zsl AND x.sl>0
AND k.sfsd = 0
AND x.cpbh=@cpbh AND ISNULL(x.lpxx,'')=@lpxx AND x.zlzt=@zlzt
)
ORDER BY 2 desc -- 浅货位存放同物资库位最优先,其次同列层库位优先
, case when wckw is null then 0 else 1 end -- 浅货位优先
, storeDist;
IF @zrkw IS NOT NULL
BEGIN
EXEC p_生成整托盘转库指令 @zlbh output, @zckw, @zrkw, @操作用户名, null, @zcyy;
SET @成功转库数 = @成功转库数 + 1;
IF @转库指令号 IS NULL
SET @转库指令号 = @zlbh;
print @zckw + '>>' + @zrkw;
END
SET @cntRows = @cntRows + 1;
--PRINT CAST(@cntRows AS CHAR(4)) + '. ' + @zckw + ' > ' + ISNULL(@zrkw, ' ') + ' 配对=' + @match + ',' + @zcyy + ', 分区匹配?' + @限定存放分区值 + ' ' + @库位分区值
-- + ',hdh=' + cast(@hdh as varchar(2)) + ',cffq=' + @限定存放分区值 + ',cpbh=' + @cpbh + ',lpxx=' + @lpxx + ',zlzt=' + @zlzt;
IF @转移指令个数 <= @成功转库数
BREAK;
END;
CLOSE c;
DEALLOCATE c;
END
go
/****** Object: StoredProcedure [dbo].[p_自动生成有货库位的转库指令] Script Date: 2017/9/30 星期六 15:01:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[p_自动生成有货库位的转库指令]
(
@操作用户名 varchar(20),
@转出库位限定条件 INT, -- 1深浅货位存放物资不同将深货位货物转走|2浅货位为空库位时深货位托盘转出|4将分区不匹配的托盘转走
@转出产品限定条件 VARCHAR(50),
@排除巷道列表 VARCHAR(50),
@限定存放分区 VARCHAR(50),
@转移指令个数 INT,
@成功转库数 INT OUTPUT,
@转库指令号 INT OUTPUT -- 生成多条转库指令是,返回第一条转库指令号
)
AS
/**
* 将深浅货位上存放不同货物的深货位或分区不匹配的浅货位托盘转走
* Created by jzx on 2015-9-16
* Used by CkczManager类
* Modified by jzx on 2015-10-15 转出库位增加“库位个数”字段筛选,以及是否被未审核出入库单据占用
* Modified by jzx on 2017-9-30 之前未考虑qysx字段值为null的情况另增加一个深货位托盘转入浅货位的分支
*/
BEGIN
IF LEN(@排除巷道列表) > 0
BEGIN
IF @排除巷道列表 NOT LIKE ',%'
SET @排除巷道列表 = ',' + @排除巷道列表;
IF @排除巷道列表 NOT LIKE '%,'
SET @排除巷道列表 = @排除巷道列表 + ',';
END;
SET NOCOUNT ON
DECLARE c CURSOR FOR
SELECT kwbh,hdh,r.cpbh,ISNULL(r.lpxx, ''),r.zlzt,rksj,cpxx.cfkwFqsx,x.qysx,x.kfwpgd,x.kfwpzl
,CASE WHEN wckw IS NOT NULL AND (r.cpbh <> r2.cpbh OR ISNULL(r.lpxx,'')<>ISNULL(r2.lpxx,'') OR r.zlzt<>r2.zlzt) THEN '深浅货位存放物资不同,将深货位货物转走'
WHEN wckw IS NOT NULL AND r2.cpbh IS NULL AND r2.zsl=0 THEN '浅货位为空库位时,深货位托盘转出'
ELSE '将分区不匹配的托盘转走' END bz
FROM kwjbxx x join (select kwbh kw, max(b.cpbh)cpbh,max(b.lpxx)lpxx,max(b.zlzt)zlzt,count(*)jls, min(rksj) rksj
from cpkcxx b where zlzt='2' and sl > 0 and isnumeric(cpbh)=1
group by kwbh
having count(*)=1
)r
on x.kwbh=r.kw
LEFT join (select a.kwbh 浅货位, a.zsl, a.sfsd, max(b.cpbh)cpbh,max(b.lpxx)lpxx,max(b.zlzt)zlzt,count(*)jls
from kwjbxx a LEFT join cpkcxx b on a.kwbh = b.kwbh
where nckw is not null
group by a.kwbh, a.zsl, a.sfsd
)r2
on x.wckw=r2.浅货位
join cpxx on r.cpbh=cpxx.cpbh
WHERE x.zsl>0 AND x.sfsd=0 AND x.xnkw=0
-- 存放不同物资的转走
AND ( (x.wckw IS NOT NULL AND ((@转出库位限定条件&1) != 0) AND (r.cpbh <> isnull(r2.cpbh,'') OR r.lpxx<>isnull(r2.lpxx,'') OR r.zlzt<>isnull(r2.zlzt,3)))
-- 浅货位没货物的转走
OR (x.wckw IS NOT NULL AND ((@转出库位限定条件&2) != 0) AND r2.cpbh IS NULL AND r2.zsl=0 AND r2.sfsd=0)
-- 存放同物资,但分区不匹配的也转走
OR (x.qysx<>cpxx.cfkwFqsx AND ((@转出库位限定条件&4) != 0))
)
AND (@转出产品限定条件 IS NULL OR r2.cpbh+'.'+ISNULL(r2.lpxx,'')=@转出产品限定条件)
AND (@排除巷道列表 IS NULL OR @排除巷道列表 NOT LIKE '%,'+CAST(hdh AS varchar(2))+',%')
AND (@限定存放分区 IS NULL OR @限定存放分区=ISNULL(x.qysx,@限定存放分区))
AND x.托盘个数>0 -- 确保托盘在库位上
AND NOT EXISTS(SELECT 2 FROM v_未完成指令 v WHERE v.kwbh=x.kwbh) -- 确保没有其他未审核单据操作此库位
ORDER BY CASE WHEN (x.wckw IS NOT NULL AND r.cpbh <> r2.cpbh OR ISNULL(r.lpxx,'')<>ISNULL(r2.lpxx,'') OR r.zlzt<>r2.zlzt) THEN 0
WHEN ISNULL(x.qysx,'')<>ISNULL(cpxx.cfkwFqsx,'') THEN 1
WHEN (x.wckw IS NOT NULL AND r2.cpbh IS NULL AND r2.zsl=0) THEN 2
ELSE 3 END
, CASE WHEN wckw IS NOT NULL THEN 0 ELSE 1 END, storeDist desc;
DECLARE @zckw VARCHAR(20), @zrkw VARCHAR(20), @hdh TINYINT, @zlbh INT
, @cpbh type_cpbh, @lpxx type_ph, @zlzt char(1), @限定存放分区值 varchar(20)
, @kfwpgd int, @kfwpzl int, @match char(1), @cntRows INT, @zcyy VARCHAR(200)
, @rksj DATE, @库位分区值 varchar(20);
SET @cntRows = 0;
SET @成功转库数 = 0;
SET @转库指令号 = NULL;
IF ISNULL(@转移指令个数, 0) < 1
SET @转移指令个数 = 1;
OPEN c;
WHILE 1=1
BEGIN
FETCH c INTO @zckw, @hdh, @cpbh, @lpxx, @zlzt, @rksj, @限定存放分区值, @库位分区值, @kfwpgd, @kfwpzl, @zcyy;
IF @@FETCH_STATUS <> 0
BREAK;
SET @cntRows = @cntRows + 1;
SET @zrkw = NULL;
SET @zlbh = NULL;
SET @match = 0
SELECT TOP 1 @zrkw=kwbh
,@match = case when k.kw is not null and substring(kwbh,3,4)=substring(kw,3,4) AND hdh=@hdh and nckw is null then 4
when k.kw is not null and substring(kwbh,3,4)=substring(@zckw,3,4) AND hdh=@hdh and nckw is null then 3
when k.kw is not null then 2
when substring(kwbh,3,4)=substring(@zckw,3,4) then 1
else 0 end
FROM kwjbxx m left join (select distinct k.kwbh kw from cpkcxx k join kwjbxx r on k.kwbh=r.kwbh
-- 浅货位有先入库的同物资深库位,优先存放
where k.rksj < @rksj and cpbh=@cpbh and ISNULL(lpxx,'')=@lpxx and k.zlzt=@zlzt and nckw is not null
and r.qysx=@限定存放分区值 and xnkw=0 and r.hdh=@hdh
)k
on m.wckw=k.kw
WHERE hdh>=@hdh AND (ISNULL(qysx,@限定存放分区值)=@限定存放分区值 OR @限定存放分区值 IS NULL)
AND zsl=0 AND sfsd=0 AND xnkw=0
AND isnull(kfwpgd,0)>=isnull(@kfwpgd,0) AND isnull(kfwpzl,0)>=isnull(@kfwpzl,0)
AND NOT EXISTS(SELECT 2 FROM cpkcxx x WHERE x.kwbh IN(m.wckw,m.nckw)
AND (x.cpbh<>@cpbh OR x.lpxx<>@lpxx OR x.zlzt<>@zlzt))
ORDER BY case hdh when @hdh then 0 else 1 end
, 2 desc -- 浅货位存放同物资库位最优先,其次同列层库位优先
, case when wckw is null then 0 else 1 end -- 浅货位优先
, storeDist;
IF @zrkw IS NOT NULL
BEGIN
EXEC p_生成整托盘转库指令 @zlbh output, @zckw, @zrkw, @操作用户名, null, @zcyy;
SET @成功转库数 = @成功转库数 + 1;
IF @转库指令号 IS NULL
SET @转库指令号 = @zlbh;
PRINT @zckw + '>>' + @zrkw;
END
ELSE
PRINT @zckw + '>>NULL';
SET @cntRows = @cntRows + 1;
--PRINT CAST(@cntRows AS CHAR(4)) + '. ' + @zckw + ' > ' + ISNULL(@zrkw, ' ') + ' 配对=' + @match + ',' + @zcyy + ', 分区匹配?' + @限定存放分区值 + ' ' + @库位分区值
-- + ',hdh=' + cast(@hdh as varchar(2)) + ',cffq=' + @限定存放分区值 + ',cpbh=' + @cpbh + ',lpxx=' + @lpxx + ',zlzt=' + @zlzt;
IF @转移指令个数 <= @成功转库数
BREAK;
END;
CLOSE c;
DEALLOCATE c;
-- 2017-9-30 新增分支:如果没有的,则自动将深货位有货,浅货位没有货的托盘转走
IF @成功转库数 = 0
BEGIN
DECLARE c2 CURSOR FOR
SELECT x.kwbh, x.nckw,x.hdh,r.cpbh,ISNULL(r.lpxx, ''),r.zlzt,rksj,x.kfwpgd,x.kfwpzl, '自动将浅货位托盘转入深货位' AS bz
FROM kwjbxx x JOIN cpkcxx r ON x.kwbh=r.kwbh
WHERE x.zsl>0 AND x.sfsd=0 AND x.xnkw=0 AND x.nckw IS NOT NULL
AND x.双伸位都有货 = 0
AND x.托盘个数>0 -- 确保托盘在库位上
AND NOT EXISTS(SELECT 2 FROM v_未完成指令 v WHERE v.kwbh=x.kwbh) -- 确保没有其他未审核单据操作此库位
AND NOT EXISTS(SELECT 2 FROM kwjbxx n WHERE n.kwbh=x.nckw AND n.zsl=0 AND n.sfsd=0 AND n.托盘个数=0)
ORDER BY r.rksj DESC, storeDist desc;
OPEN c2;
WHILE 1=1
BEGIN
FETCH c2 INTO @zckw, @zrkw, @hdh, @cpbh, @lpxx, @zlzt, @rksj, @kfwpgd, @kfwpzl, @zcyy;
IF @@FETCH_STATUS <> 0
BREAK;
SET @zlbh = NULL;
EXEC p_生成整托盘转库指令 @zlbh output, @zckw, @zrkw, @操作用户名, null, @zcyy;
SET @成功转库数 = @成功转库数 + 1;
IF @转库指令号 IS NULL
SET @转库指令号 = @zlbh;
PRINT @zckw + '>>>' + @zrkw;
SET @cntRows = @cntRows + 1;
IF @转移指令个数 <= @成功转库数
BREAK;
END;
CLOSE c2;
DEALLOCATE c2;
END;
END
go