CREATE TRIGGER [更新分仓库存表] ON dbo.事务明细
   FOR INSERT, UPDATE, DELETE
   AS

   /* 如果是未生效的,不做处理即可.
    * 如果是已生效的,作为供应者的,Inserted 要减库存,Deleted 要加库存.
    * 如果是已生效的,作为接受者的,Inserted 要加库存,Deleted 要减库存.  
    增加了对虚实的判断,只有 虚实 = 1,即执行单才能改变库存。这样就不需要判断单据属性了。
    增加了对 已接收,已发出 字段的判断。并做了测试。
   */
   /* 其它出入仓单,可能造成客户或者供应商有货物库存。
   */
   SELECT 仓库Id_, 货物Id_, SUM(数量) AS 变动数量 INTO #库存变动
   FROM
   (
    SELECT 物id_ AS 货物Id_, 接收者Id_ AS 仓库Id_, 数量, 虚实
     FROM Inserted INNER JOIN 实体 ON Inserted.接收者Id_ = 实体.Id_
     WHERE Inserted.生效=1 And Inserted.已接收 = 1
    UNION ALL
    SELECT 物id_ AS 货物Id_, 接收者Id_ AS 仓库Id_,  - 数量, 虚实
     FROM Deleted INNER JOIN 实体 ON Deleted.接收者Id_ = 实体.Id_
     WHERE Deleted.生效=1 And Deleted.已接收 = 1
    UNION ALL
    SELECT 物id_ AS 货物Id_, 供应者Id_ AS 仓库Id_, - 数量, 虚实
     FROM Inserted INNER JOIN 实体 ON Inserted.供应者Id_ = 实体.Id_
     WHERE Inserted.生效=1 And Inserted.已发出 = 1
    UNION ALL
    SELECT 物id_ AS 货物Id_, 供应者Id_ AS 仓库Id_, 数量, 虚实
     FROM Deleted INNER JOIN 实体 ON Deleted.供应者Id_ = 实体.Id_
     WHERE Deleted.生效=1 And Deleted.已发出 = 1
   ) AS curTemp
   WHERE (虚实 = 1)
   GROUP BY 货物Id_, 仓库Id_ 

   ----------------------------------------
   IF @@ROWCOUNT = 0
    RETURN

   /* 已有库存数据, 则更新 */
   UPDATE 实体_分仓库存表
    SET 库存数量 = 库存数量 + #库存变动.变动数量
    FROM 实体_分仓库存表 INNER JOIN #库存变动
     ON 实体_分仓库存表.货物Id_ = #库存变动.货物Id_ AND 实体_分仓库存表.仓库Id_ = #库存变动.仓库Id_
--------------------------------------------

   /* 没有库存数据的, 则 Insert 一条记录 */
   INSERT INTO 实体_分仓库存表 (货物Id_, 仓库Id_, 库存数量)
    SELECT #库存变动.货物Id_, #库存变动.仓库Id_, #库存变动.变动数量
     FROM #库存变动
     WHERE NOT EXISTS (SELECT Id_ FROM 实体_分仓库存表
        WHERE 实体_分仓库存表.货物Id_ = #库存变动.货物Id_
         AND 实体_分仓库存表.仓库Id_ = #库存变动.仓库Id_)

Posted on 2010-02-24 15:15  谢金龙  阅读(188)  评论(0编辑  收藏  举报