首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收货时更新库存表

收货时更新库存表
EN

Stack Overflow用户
提问于 2012-04-14 04:49:27
回答 1查看 295关注 0票数 0

我有三个表:好收货表头、好收货明细表和库存表

代码语言:javascript
复制
  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)

代码语言:javascript
复制
      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表。请帮帮我,我的头碎了.

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

发布于 2012-04-14 06:07:47

首先,在UPDATE之后,您有两个end语句,一个就足够了。

数量没有增加的原因是,当您插入到stock details表时,您没有设置GR_HDR_ID列的值。在update命令中,您对GR_HDR_ID设置了一个筛选器,但该条件永远不会得到满足,因为它在您的表中没有值。

编辑:

对于您描述的场景,您需要将旧值和新值都作为参数,并且还可以根据这些值更新stock表。没有这些,你就不知道应该改变什么,你只会得到一堆新的数据。

更好的替代方法是在TB_GoodsReceive_DTL表上创建一个update触发器,在该触发器中,您可以访问旧的和新的值(插入的和删除的表),并且可以更新STOCK表中的相关记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10148127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档