【问题标题】:After updating Purchase table I want to automatically update my Stock Table更新采购表后,我想自动更新我的库存表
【发布时间】:2021-01-22 07:27:30
【问题描述】:

我正在开发库存管理系统。我必须像这样的表格。

tblPurchase

PurchaseId  |  ItemCode  |   ItemName    | Quantity |
-----------------------------------------------------
 1          |  IMT0003   | Dell Laptop   | 30       |
-----------------------------------------------------
 2          |  IMT0004   | Samsung Phone | 2        |
-----------------------------------------------------
 3          |  IMT0003   | Dell Laptop   | 5        |
-----------------------------------------------------

tblProductStock

    ItemCode  |   ItemName    | Quantity |
    --------------------------------------
    IMT0003   | Dell Laptop   | 35       |
    --------------------------------------
    IMT0004   | Samsung Phone | 2        |
    --------------------------------------

现在我想做这样的事情。现在tblPurchase 表戴尔笔记本电脑数量是35。和tblProductStock 也一样。现在我退回 5 台戴尔笔记本电脑。现在我想更新我的 tblPurchasePurchaseId 1 是 25 或 PurchaseId 3 是 0。因为我返回了 5 项。我不在乎哪个purchaseid。如果我从 30 中扣除,它应该是 25。或者如果我扣除表格 purchaseId 3 。它应该是 0。

而且我的tblProductStock 表也应该根据tblPurchase 表数量进行更改。这意味着现在我的tblProductStock 表戴尔笔记本电脑必须是30。为了实现这个目标,我们可以使用这样的更新查询。

ALTER TRIGGER [dbo].[update_productstock_table_when_updating_purchasequantity] 
ON [dbo].[tblPurchase]
AFTER UPDATE
AS
BEGIN  
    UPDATE ps
    SET Quantity = ps.Quantity
    FROM tblProductStock ps JOIN
         (SELECT i.ItemCode, SUM(quantity) as quantity
          FROM tblPurchase i
          GROUP BY i.itemCode
         ) i
         ON ps.ItemCode = i.ItemCode;
END 

但我的问题不是这个。这是预期的工作。想象一下我的tblPurchase Table 戴尔笔记本电脑数量是 30。我卖一台笔记本电脑。不是我的tblProductStock table 戴尔笔记本电脑是 29。不是 30。现在我从tblPurchase table 退回 5 台戴尔笔记本电脑。现在我的购买数量应该是 25。我的tblProductStock 表必须是 24。因为我卖了一件。为了实现这个目标,我可以使用以下更新语句。

UPDATE ps
    SET Quantity = i.quantity - ps.Quantity
    FROM tblProductStock ps JOIN
         (SELECT i.ItemCode, SUM(quantity) as quantity
          FROM tblPurchase i
          GROUP BY i.itemCode
         ) i
         ON ps.ItemCode = i.ItemCode;

但是我怎样才能将这两个更新查询与触发器一起使用。如果我使用两者都是相同的触发器,它会得到错误的值。因为两个表中的数量相同。我想更新tblProductStock 表。但我的 tblProductStock 桌子数量是 29 并且购买是 30 。在我返回 5 之后,现在我的 tblPurchase 25 和我的 tblProductStock 应该是 24。这就是我问这个问题的原因。有人可以重写此代码,请发给我。我尝试解决这个问题超过 100 次。还是没有解决这个问题。

【问题讨论】:

  • 您的最后一个代码应该可以正常工作。对于退货,数量应该是负数。对于购买,正面的。

标签: sql sql-server-2017 sql-server-2014-express sql-server-2016-express


【解决方案1】:

您可以使用类似的方法来更新您的 Stock 表。

CREATE TABLE #TempPurchase
(   ID INT IDENTITY (1, 1) ,
    ItemCode VARCHAR (10) ,
    Quantity INT );

CREATE TABLE #TempSold
(   ID INT IDENTITY (1, 1) ,
    ItemCode VARCHAR (10) ,
    Quantity INT );

CREATE TABLE #TempStock
(   ID INT IDENTITY (1, 1) ,
    ItemCode VARCHAR (10) ,
    Quantity INT );

INSERT INTO #TempPurchase ( ItemCode ,
                            Quantity )
VALUES ( 'IMT0003', 25 ) ,
       ( 'IMT0004', 2 ) ,
       ( 'IMT0003', 5 );

INSERT #TempSold ( ItemCode ,
                   Quantity )
VALUES ( 'IMT0003', 2 );

INSERT INTO #TempStock ( ItemCode ,
                         Quantity )
VALUES ( 'IMT0003', 30 ) ,
       ( 'IMT0004', 2 );


CREATE TABLE #FinalData
(   ID INT IDENTITY (1, 1) ,
    ItemCode VARCHAR (10) ,
    Quantity INT );

INSERT #FinalData ( ItemCode ,
                    Quantity )
       SELECT   ts.ItemCode ,
                ISNULL (( SUM (tp.Quantity) - ts2.Quantity ), ts.Quantity) AS quantity
       FROM     #TempStock AS ts
                LEFT JOIN #TempPurchase AS tp ON tp.ItemCode = ts.ItemCode
                LEFT JOIN #TempSold AS ts2 ON ts2.ItemCode = ts.ItemCode
       GROUP BY ts.ItemCode ,
                ts2.Quantity ,
                ts.Quantity;

UPDATE ts
SET    ts.Quantity = fd.Quantity
FROM   #FinalData AS fd
       INNER JOIN #TempStock AS ts ON ts.ItemCode = fd.ItemCode;

DROP TABLE #TempStock
DROP TABLE #TempPurchase
DROP TABLE #TempSold
DROP TABLE #FinalData

【讨论】:

  • 非常感谢。我有一个问题。在这里,所有表都是临时表。我对么?更新后所有记录都是删除知道
  • 我使用临时表只是为了向您展示一个示例。在您的案例中,您将使用现有的表。并且,在上述情况下更新后记录不会被删除。只有在会话结束后才会被清除。
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2013-12-21
  • 2015-07-16
  • 2021-08-27
相关资源
最近更新 更多