0

Good Receiveヘッダー、Good Receive Detailsテーブル、stockテーブルの3つのテーブルがあります

  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 個とアイテム 2 – 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

しかし、以下のストアド プロシージャは、株式マスターの行を更新するのではなく、新しい行を挿入します。同様に、ユーザーは倉庫または有効期限を更新する可能性があります

以下の手順では、次のことを行います。

商品が受け取られるたびに、在庫テーブルのitemid、倉庫、有効期限がチェックされ、存在する場合はQTYが追加され、そうでない場合は在庫テーブルに新しいアイテムが挿入されます。

問題は、Good Receive テーブルが更新されるたびに (つまり、ユーザーが ItemId または Expiry Date または Warehouse を更新したとき)、在庫テーブルを更新する方法です。みんな助けてください、それは私の頭を壊します...

    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
4

1 に答える 1

0

まず、UPDATE の後に 2 つの end ステートメントがありますが、1 つで十分です。

数量が増加しない理由は、在庫詳細テーブルに挿入するときに、GR_HDR_ID 列の値を設定していないためです。更新コマンドで GR_HDR_ID にフィルターを設定しましたが、テーブルに値がないため、条件が満たされることはありません。

編集:

説明したシナリオでは、古い値と新しい値の両方がパラメーターとして必要であり、これらに基づいて在庫テーブルも更新できます。これらがなければ、何を変更すべきかを知ることができず、大量の新しいデータを取得するだけです。

これに代わるより良い方法は、TB_GoodsReceive_DTL テーブルに更新トリガーを作成することです。このトリガーでは、古い値と新しい値 (挿入されたテーブルと削除されたテーブル) の両方にアクセスでき、Stock テーブルの関連レコードを更新できます。

于 2012-04-13T22:07:46.507 に答える