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