CREATE PROCEDURE spOperateInStoreMaterialDetail
@InStockMaterialID nvarchar(64),
@BINID nvarchar(64),
@POID nvarchar(64),
@ItemCode nvarchar(32),
--@UOMID nvarchar(64),
@WHID nvarchar(64),
@VendorID nvarchar(64),
@QuantityInBinSet real,
@PreserveQuantitySet real,
@MFG nvarchar(255),
@PartNo nvarchar(100),
@UnitPricePONatural money,
@UnitPricePOStandard money,
--@AveragePriceNatural money,
--@AveragePriceStandard money,
--@ExpiredDate datetime,
@Status int,
@Comment nvarchar(255),
@flag int, --1 入库 2 出库 
@OperateHistory bit
AS 
BEGIN
DECLARE @UOMID nvarchar(64)BEGIN TRANSACTION tranInStoreMaterialDetail
IF @flag = 1 --入库
BEGIN
IF   LEN(@InStockMaterialID) >0
BEGIN
UPDATE WH_InStoreMaterialDetail SET 
[QuantityInBin] =QuantityInBin + @QuantityInBinSet,[PreserveQuantity] = [PreserveQuantity] +@PreserveQuantitySet
WHERE InStockMaterialID = @InStockMaterialID
IF @@error<>0 
BEGIN
ROLLBACK TRANSACTION tranInStoreMaterialDetail
RETURN -1 --更新库存详细信息失败
END
END
ELSE
BEGIN
 IF exists --如果存在相同的业务主键,则更新
(SELECT * from  WH_InStoreMaterialDetail where 
WHID  = @WHID AND
BINID = @BINID AND
POID =  @POID AND
ItemCode = @ItemCode AND
UnitPricePOStandard = @UnitPricePOStandard)
   BEGIN
UPDATE WH_InStoreMaterialDetail SET 
[QuantityInBin] = [QuantityInBin] + @QuantityInBinSet,[PreserveQuantity] =[PreserveQuantity] +  @PreserveQuantitySet
WHERE WHID  = @WHID AND
BINID = @BINID AND
POID =  @POID AND
ItemCode = @ItemCode AND
UnitPricePOStandard = @UnitPricePOStandard
IF @@error<>0 
BEGIN
ROLLBACK TRANSACTION tranInStoreMaterialDetail
RETURN -1 --更新库存详细信息失败
END


   END
ELSE   --不存在,则插入新的记录
   BEGIN
SELECT @UOMID = UOMID FROM Material WHERE ItemCode = @ItemCode
DECLARE @NEWDetailID VARCHAR(64)
SELECT @NEWDetailID = 'ISM'+RIGHT(1000001+ISNULL(RIGHT(MAX(InStockMaterialID),6),0),6) 
FROM WH_InStoreMaterialDetail WITH(XLOCK,PAGLOCK)  WHERE InStockMaterialID like 'ISM%'
INSERT INTO 
WH_InStoreMaterialDetail(
[InStockMaterialID],[BINID],[POID],[ItemCode],[UOMID],[WHID],[VendorID],[QuantityInBin],[PreserveQuantity],[MFG],[PartNo],[UnitPricePONatural],[UnitPricePOStandard],[Status],[Comment]
)VALUES(
@NEWDetailID,@BINID,@POID,@ItemCode,@UOMID,@WHID,@VendorID,@QuantityInBinSet,@PreserveQuantitySet,@MFG,@PartNo,@UnitPricePONatural,@UnitPricePOStandard,@Status,@Comment
)
IF @@error<>0 
BEGIN
ROLLBACK TRANSACTION tranInStoreMaterialDetail
RETURN -1 --更新库存详细信息失败
END


   END
END
END
IF @flag = 2 --出库 (肯定存在@InStockMaterialID)
BEGIN
UPDATE WH_InStoreMaterialDetail SET 
[QuantityInBin] =QuantityInBin - @QuantityInBinSet,[PreserveQuantity] = [PreserveQuantity] -@PreserveQuantitySet
WHERE InStockMaterialID = @InStockMaterialID
IF @@error<>0 
BEGIN
ROLLBACK TRANSACTION tranInStoreMaterialDetail
RETURN -1 --更新库存详细信息失败
END
END

IF 1  = 1
BEGIN 
DECLARE @NEWHistoryID VARCHAR(64)
SELECT @NEWHistoryID = 'SH'+RIGHT(1000001+ISNULL(RIGHT(MAX(StockHistoryID),6),0),6) 
FROM WH_InStockMaterialHistory WITH(XLOCK,PAGLOCK)  WHERE StockHistoryID like 'SH%'
INSERT INTO WH_InStockMaterialHistory(StockHistoryID,ItemCode,UOMID,WHID,StockTotal,StockDate,AvePriceNatural,AvePriceStandard) 
SELECT @NEWHistoryID,a.ItemCode,@UOMID,a.WHID,a.StockTotal AS StockTotal,getdate(),a.AveragePriceNatural,a.AveragePriceStandard
FROM
(SELECT WHID,SUM(QuantityInBin) AS StockTotal,ItemCode,
SUM(QuantityInBin*UnitPricePONatural)/SUM(QuantityInBin) as AveragePriceNatural,
SUM(QuantityInBin*UnitPricePOStandard)/SUM(QuantityInBin) as AveragePriceStandard
FROM WH_InStoreMaterialDetail WHERE ItemCode = @ItemCode AND WHID = @WHID
GROUP BY WHID, ItemCode  ) a
     
IF @@error<>0 
BEGIN
ROLLBACK TRANSACTION tranInStoreMaterialDetail
RETURN -2 --更新库存历史信息失败(这里只插入不删除)
END

END
commit transaction tranInStoreMaterialDetail
return 1
END
GO
------------------------------------
IF 1  = 1 下面始终不执行,为什么?

解决方案 »

  1.   

    我在本机大致测了一下,可以执行啊,会不会是你下面的insert 
    回滚的原因啊? 你可以把你所有的对象加上所有者,这样可以提高执行效率~~
    IF @FLAG = 2 --出库 (肯定存在@InStockMaterialID)这个地方 建议修改为
    ELSE IF @FLAG = 2 --出库 (肯定存在@InStockMaterialID)
    这样逻辑更为清晰