在物料管理过程中,往往不同的物料库的盘库功能实现的数据库表基本上是一样的。只不过是各自有各自的物料盘库表。如果细分析一下SQL,发现除了表名称以外,其他字段均相同,这时就可以通过使用exec sp_executesql来高度封装SQL语句,减少SQL语句的错误。提高开发速度。
做为单品管理,数量很大,通常一两天内不可能盘完,所以需要系统能够在不影响正常出入库的前提下,支持动态盘库,以下是实现盘库出库标记的一段代码:该功能主要用的exec sp_executesql
代码实现功能:
首先判断是否在盘库状态,如果不是,则直接返回,不再执行后续动作。
在盘库状态,如果物料是本期盘库之前的入库的,则需要将其标为出库盘库,以便复原本期盘库时的真实库存。其中还涉及到平库(数据库与实物核对不上时,需要做平库处理,实现数据库与实物保持一致)处理动作。
DECLARE @strPro char(30)
DECLARE @ID_Pro bigint
DECLARE @BillType bigint
SET @strPro = 'AADA01A02NJP'
SET @ID_Pro = 12100101010100200
DECLARE @Tab_Inventory char(100)
DECLARE @Tab_Inventory_ST char(100)
DECLARE @Tab_IBG char(100)
DECLARE @Tab_IBL char(100)
DECLARE @Tab_IBH char(100)
SET @Tab_Inventory_ST = 'WH_WP_Inventory_ST'
SET @Tab_IBG = 'WH_WP_IBG'
SET @Tab_IBL = 'WH_WP_IBL'
SET @Tab_IBH = 'WH_WP_IBH'
DECLARE @strSQL nchar(1000)
DECLARE @strValue nchar(50)
-- 1. 判断是否在盘库状态
SET @strSQL = 'SELECT TOP 1 @strValue = EndTime FROM ' + RTRIM(@Tab_Inventory_ST) + ' ORDER BY StartTime DESC'
EXEC SP_EXECUTESQL @strSQL , N'@strValue nchar(50) output',@strValue output
IF @strValue IS NOT NULL
RETURN;
-- PRINT '正在盘库...'
-- 2. 判断该片是否为盘库单据
IF @BillType = 0
BEGIN -- 盘库单
SET @strSQL =
'UPDATE ' + RTRIM(@Tab_Inventory) + char(10)
+ 'SET Flag2 = 2500' + char(10)
+ 'WHERE Name =' + @strPro
EXEC (@strSQL);
RETURN;
END
-- 3. 判断该片是否为盘库之前的入库片
SET @strSQL =
'SELECT @strValue = T101.ID_Wafer ' + char(10)
+ 'FROM ' + RTRIM(@Tab_IBG) + ' AS T101' + char(10)
+ 'INNER JOIN ' + RTRIM(@Tab_IBL) + ' AS T102 ON T102.ID_BList = T101.ID_BList' + char(10)
+ 'INNER JOIN ' + RTRIM(@Tab_IBH) + ' AS T103 ON T103.BillNo = T102.BillNo' + char(10)
+ 'WHERE'+ char(10)
+ ' T101.ID_Wafer = ' + RTRIM (CONVERT(CHAR(30),@ID_Pro))+ char(10)
+ ' AND ' + char(10)
+ ' ( ' + char(10)
+ ' -- 00.1 在盘库开始后入库,不算本期盘库' + char(10)
+ ' T103.DT_MoveOut <= (SELECT MAX(StartTime) FROM ' + RTRIM(@Tab_Inventory_ST) + ' )' + char(10)
+ ' )'
EXEC SP_EXECUTESQL @strSQL , N'@strValue nchar(50) output',@strValue output
IF @strValue IS NOT NULL
RETURN; -- 物料为盘库之后入库片
-- 3.1 判断该片是否为未盘库或为已经盘库,修改为出库标记
SET @strSQL =
'SELECT @strValue = Name ' + char(10)
+ 'FROM ' + RTRIM(@Tab_Inventory) + char(10)
+ ' WHERE Name = ' + @strPro + char(10)
EXEC SP_EXECUTESQL @strSQL , N'@strValue nchar(50) output',@strValue output
IF @strValue IS NULL
BEGIN
-- 未盘库
SET @strSQL =
'INSERT INTO ' + RTRIM(@Tab_Inventory) + char(10)
+ '(Name,Flag1)'+ char(10)
+ 'VALUES(' + @strPro + ',11)'+ char(10)
EXEC (@strSQL)
RETURN
END
ELSE
BEGIN
-- 已经盘库,修改为出库标记
SET @strSQL =
'UPDATE ' + RTRIM(@Tab_Inventory) + char(10)
+ 'SET Flag1 = 11 WHERE Name = ' + @strPro+ char(10)
EXEC (@strSQL)
RETURN
END
RETURN
把以上SQL做成一个SP,嵌入在出库环节,就可以实现动态盘库了。不同的物料库对于盘库动作也是一样的,仅修改相关对应的表就是了。
SP_EXECUTESQL 相关用法参见http://technet.microsoft.com/zh-cn/library/ms188001.aspx