/****** Object: StoredProcedure [dbo].[p_lockCell] Script Date: 2017/9/27 星期三 15:26:03 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROC [dbo].[p_lockCell] @ckdm type_ck, @kwbh type_kwbh, @wzzl CHAR(1), --'M'=物料, 'P'=成品 @zlbh INT, @kczs type_sl = NULL -- 锁定库位上预期的库存总数。我们用"库存总数"当时戳处理。 -- 由于一个用户提取可用库位到最终使用该库位的过程中可能被其它用户使用, -- 这样就会引起错误,尤其是满货位入库。我们对此情况可以进行如下判定:如果被其它用户 -- 使用了,则库位上的总库存数量会发生改变,则某个用户锁定该库位时,锁定前获得的库位库存数 -- 就不会等于锁定时库位上的当前库存数 , @p_suolx BIT = NULL -- 增加锁类型代码 --WITH ENCRYPTION AS /** * 锁定指定库位。 * * Created by 蒋智湘 ON 05-06-23 * Modified by 蒋智湘 ON 2007-03-09 增加锁类型参数,并调整内部代码,以便正确记录上锁的类型 * Modified by jzx on 2009-5-4 当@wzzl='M'时,目标库位上的sfwwzl可以='T' * Modified by jzx on 2011-7-21 RAISERROR中小数部分替代改用字符串,%d只能用于整数 * Modified by jzx on 2013-12-25 增加三个sfyx=1筛选条件 * Modified by jzx on 2015-1-2 仅对入库锁对比当前库存和参数库存差异。一个库位多次安排出库时,参数传递的库存数不 * 一定是kwjbxx.zsl字段值,但这是允许的。 * Modified by jzx on 2015-9-17 去除参数@ckdm的引用,因为kwjbxx表的关键字段是单个字段kwbh,不是以前的ckdm+kwbh; * 增加对参数@wzzl值的有效性检查 * Modified by jzx on 2016-4-22 允许给xnkw字段值为3的库位上锁。 * Modified by jzx on 2016-7-25 不允许给xnkw字段值为3的库位上入库锁。 * Modified by jzx on 2016-12-23 386比亚迪因为不存在拣选出库和追加入库,锁类型即时相同也不允许再上锁 * Modified by jzx on 2017-9-27 sfwzzl字段值比较时,仅对于zsl>0有效 */ IF @kwbh IS NOT NULL BEGIN SET NOCOUNT ON; -- 不给虚拟货位/扩展库位上锁 IF EXISTS(SELECT 2 FROM kwjbxx WHERE kwbh=@kwbh AND sfyx=1 AND xnkw NOT IN(0,3)) RETURN; IF (@p_suolx = 1) -- 对于入库锁,xnkw字段值为3的不上锁 BEGIN IF EXISTS(SELECT 2 FROM kwjbxx WHERE kwbh = @kwbh AND xnkw=3) RETURN; END; IF @wzzl IS NULL OR (@wzzl <> 'M' AND @wzzl <> 'T') BEGIN RAISERROR('无效的参数@wzzl的值:%s', 16, 1, @wzzl); RETURN; END; UPDATE kwjbxx SET sfsd = @zlbh, suolx = @p_suolx WHERE kwbh = @kwbh AND (zsl = ISNULL(@kczs, 0) OR @p_suolx=0) AND (sfsd = 0 OR sfsd = @zlbh/* OR suolx = @p_suolx */ OR xnkw=3) AND (sfwzzl IS NULL OR sfwzzl = @wzzl OR zsl=0 OR (@wzzl = 'M' AND sfwzzl = 'T')) AND sfyx = 1; IF @@ROWCOUNT = 0 BEGIN DECLARE @sbh INT , @sfwzzl CHAR(1) , @zsl varchar(30), @v_suolxmc NVARCHAR(10) SELECT @sbh = sfsd, @sfwzzl = sfwzzl, @zsl = zsl, @v_suolxmc = CASE sfsd WHEN 1 THEN '人工锁' WHEN -2 THEN '故障锁' ELSE ( CASE suolx WHEN 1 THEN '入库锁' WHEN 0 THEN '出库锁' ELSE '' END) END FROM kwjbxx WHERE kwbh = @kwbh AND sfyx=1; IF @sbh<>0 AND @zlbh<>@sbh RAISERROR ('库位%s已被锁定(锁编号:%d, 锁类型:%s)', 16, 1, @kwbh, @sbh, @v_suolxmc); ELSE IF @sfwzzl <> @wzzl RAISERROR ('不能在一个库位[%s]上混放物料和空盘 %s', 16, 1, @kwbh, @wzzl); ELSE IF @zsl <> @kczs AND @p_suolx=1 BEGIN DECLARE @v_zslStr VARCHAR(20); DECLARE @v_kczsStr VARCHAR(20); SET @v_zslStr = CAST(@zsl AS VARCHAR(20)); SET @v_kczsStr = CAST(@kczs AS VARCHAR(20)); RAISERROR ('操作期间库位已经被其他用户使用,当前库存:%s,而您请求时的预期库存:%s', 16, 1, @v_zslStr, @v_kczsStr); END ELSE BEGIN RAISERROR ('未定义库位%s', 16, 1, @kwbh); END END END