0

私は SQL Server 2008 を使用しています。SKU の注文が記録されるテーブル、カウントを持つ在庫のテーブル、および販売された SKU と在庫アイテムの関係が記録されるテーブルがあります。

最終的にこんな報告が来ました

 Inventory CurrentQuantity OpenedOrder
   SKU1        300             50
   SKU2        100             10

各注文は個別に処理されます。注文が処理されるたびに、データベースが在庫タブレットを自動的に更新するようにするにはどうすればよいですか?

すなわち

注文に 2 つの SKU1 が含まれている場合、在庫表には自動的に 298 が表示されます。

ありがとう

4

5 に答える 5

2

ストアド プロシージャを使用して、注文の挿入と数量の更新を 1 回のヒットで実行します。

CREATE PROC dbo.ProcessOrder
    @Item int,
    @Quantity int
AS
BEGIN
    --Update order table here
    INSERT INTO dbo.Orders(ItemID,Quantity)
    VALUES (@ItemID, @Quantity)

    --Update Inventory here
    UPDATE dbo.Inventory
    SET CurrentQuantity = CurrentQuantity - Quantity
    WHERE ItemID = @ItemID


END
于 2012-03-31T19:26:06.793 に答える
1

あなたが探しているのはトリガーだと思います

基本的に、指定された挿入/更新データを使用して適切な列を更新するトリガーを設定します。完全なスキーマ セットがなければ、これが現時点で私ができる最善の答えです。

于 2012-03-31T19:18:31.403 に答える
0

私はこのためのトリガーを自分で見ているわけではありません。

私のチェックアウトプロセス

Start a transaction
Check stock level.
If OK, (optional validation / authorisation)
Add a check out record
Reduce the stock
Possibly add some record to invoice teh recipent etc.
Commit the transaction

トリガーを使用してそれを行うこともできますが、要点がわかりません。単純でクリアで、すべてが 1 か所にある SP_CheckOut ストアド プロシージャは、目的の場所です。

于 2012-03-31T19:29:46.417 に答える
0

トリガーを使用することも、手順を使用することも、上部の特定の手順を使用することもできます。手順を使用して、master DB で atuo exec 機能を開く必要があります。

于 2012-04-01T01:39:21.033 に答える
0

私は通常、トリガーを使用することをお勧めしますが、在庫操作は通常、バッチで何度も実行される操作であり、これは正直なトリガーの最適なシナリオではありません。

PKG のアイデアは非常に優れていると思いますが、それにトランザクション制御を追加することを決して忘れてはなりません。

CREATE PROC dbo.ProcessOrder
    @Item int,
    @Quantity int
AS
BEGIN
    begin transaction my_tran
    begin try 
        --Update order table here
        INSERT INTO dbo.Orders(ItemID,Quantity)
        VALUES (@ItemID, @Quantity)

        --Update Inventory here
        UPDATE dbo.Inventory
        SET CurrentQuantity = CurrentQuantity - Quantity
        WHERE ItemID = @ItemID
        commit transaction
    end try
    begin catch
        rollback transaction
        --raise error if necessary
    end catch
END
于 2012-03-31T22:08:39.560 に答える