我有三个表:好收货表头、好收货明细表和库存表
TB_GoodsReceive_HDR - Header Table
ID SupplierID
1 1
TB_GoodsReceive_DTL - Details Table
ID GR_HDR_ID ItemID WarehouseID ExpiryDate Qty
1 1 1 1 4/4/2012 20
2 1 2 1 4/4/2012 30
TB_Stock - Stock Table
ID ItemID WarehouseID ExpiryDate StockType GR_HDR_ID Qty
1 1 1 4/4/2012 R 1 20
1 2 1 4/4/2012 R 1 30我已收到物料1- 20数量和Item2 - 30数量。和我的库存表里一样。有很多场景,但我需要这个场景的指导方针
现在,当用户按如下方式更新TB_GoodsReceive_DTL时:仅更新项目(从ItemID 1到ItemID 3)
ID GR_HDR_ID ItemID WarehouseID ExpiryDate Qty
1 1 **3** 1 4/4/2012 20
2 1 2 1 4/4/2012 30
My stock table values should be as follows:
ID ItemID WarehouseID ExpiryDate StockType GR_HDR_ID Qty
1 **3** 1 4/4/2012 R 1 20
1 2 1 4/4/2012 R 1 30但是我的below存储过程插入新行,而不是更新股票主表中的行。同样,用户可以更新仓库或到期日期
以下过程执行以下操作:
当收到货物时,它将检查stock表中的项it、仓库和过期日期,如果存在,它将添加数量,否则将在stock表中插入新项。
问题是,每当Good Receive表更新时(即当用户更新ItemId、过期日期或仓库时),如何更新stock表。请帮帮我,我的头碎了.
Declare
@ItemID int,
@WareHouseID int,
@Qty int,
@StockType nvarchar(30),
@ExpiryDate datetime,
@IsExistsItem int,
@IsExistsWH int,
@IsExistsExpiryDate int,
@IsGR_HDR_ID int,
@GR_HDR_ID int
set @ItemID=1
set @WareHouseID=2
set @Qty=20
set @StockType='R'
set @GR_HDR_ID=2
set @ExpiryDate = '4/4/2012 12:00:00 AM'
set @IsExistsItem = (select count(ItemID) from TB_Stock_Details where
ItemID=@ItemID)
set @IsExistsWH = (select count(WareHouseID) from TB_Stock_Details where
WareHouseID=@WareHouseID)
set @IsExistsExpiryDate = (select count(ExpiryDate) from TB_Stock_Details where
ExpiryDate=@ExpiryDate)
if(@StockType='R')
begin
IF (@IsExistsItem>0) and (@IsExistsWH>0) and (@IsExistsExpiryDate>0)
BEGIN
UPDATE TB_Stock_Details
SET
Qty =Qty + @Qty
WHERE ItemID = @ItemID and GR_HDR_ID = @GR_HDR_ID
END
ELSE
begin
INSERT INTO TB_Stock_Details(ItemID,WareHouseID,Qty,StockType,ExpiryDate)
VALUES(@ItemID,@WareHouseID,@Qty,@StockType,@ExpiryDate)
end
end发布于 2012-04-14 06:07:47
首先,在UPDATE之后,您有两个end语句,一个就足够了。
数量没有增加的原因是,当您插入到stock details表时,您没有设置GR_HDR_ID列的值。在update命令中,您对GR_HDR_ID设置了一个筛选器,但该条件永远不会得到满足,因为它在您的表中没有值。
编辑:
对于您描述的场景,您需要将旧值和新值都作为参数,并且还可以根据这些值更新stock表。没有这些,你就不知道应该改变什么,你只会得到一堆新的数据。
更好的替代方法是在TB_GoodsReceive_DTL表上创建一个update触发器,在该触发器中,您可以访问旧的和新的值(插入的和删除的表),并且可以更新STOCK表中的相关记录。
https://stackoverflow.com/questions/10148127
复制相似问题