还是触发器的问题,上一篇贴子地址:http://topic.csdn.net/u/20090323/17/cbc2dd3e-f08d-4c9b-9e78-0cb83b9ba7d8.html
关于通过触发器修改出货累计数及金额累计数,可能我没有说清楚,是应该按出货单号为外键来累计,我修改后的代码如下:
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
FOR INSERT, UPDATE, DELETE 
AS
BEGIN
    Update 出货单主档 
    set 
        总数量=(select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号),
        总金额=(select sum(金额) from 出货单明细 where 出货单明细.单号=出货单主档.单号)
END问题1:目的已经达到,但我这样写合理吗?与你的写法是一样吗?
    SET 
        总数量=b.数量,
        总金额=b.金额
    FROM 
        出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
    WHERE
问题2:采用这样的触发器后,是否我每插入或修改删除一笔纪录,触发器会对里面的每一条纪录都进行写重新累计?这是样否造成效率低下?问题3:如果是对每一条纪录都重新累计,是否可以有选择性的累计某一出货单号的数据?问题4:是否可以利用触发器来做仓库库存运算?这样做跟在VB里面采用SQL语句来更新库存谁更高效?问题5: 比如我利用触发器按产品来累计生产数,如果我修改了某条纪录的产品号,对触发器来说,是否先删除原来的产品再新增一个新的产品?
谢谢!!非常谢谢!!!

解决方案 »

  1.   

    等待ing....
    SQL版块热心人真多
      

  2.   

    问题1、结果不一样。你的是计算了全部的和,而老大的是计算了单号相同的数量和金额的和
    问题2、是这样的。不过要让两个表进行同步更新的话,还是这样比较好
    问题3、select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号
           这个不是已经选择了吗?
    问题4、还是使用触发器比较好,这样的话省了在vb中麻烦
    问题5、对于修改update而言,是分为两步走的,先删除原来的数据,再插入新的数据。在这个过程当中使用了两个临时表deleted,inserted
      

  3.   

    这个是我写的
    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        Update 出货单主档 
        set 
            总数量=(select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号),
            总金额=(select sum(金额) from 出货单明细 where 出货单明细.单号=出货单主档.单号)
    END这个是老大写的
        SET 
            总数量=b.数量,
            总金额=b.金额
        FROM 
            出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
        WHERE1.老大写的 " from inserted",inserted是什么意思呢?我觉得应该是我写的那个会慢些,因为我查询了两次,但老大写的那个我看不懂。
      我刚刚又依样写了一个,但检查语法的时候一直接示",附近语法错误",请大家帮我看一下:
      CREATE TRIGGER [TRG_MPSDayReport] ON [dbo].[MPSDayReport] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
          UpDate MPSDayReport
          Set SinQTY=b.TotInQTY,
                SOutQTY=b.TotOutQTY,
                SBLQTY=b.TotBLQTY,
                SPSQTY=b.TotPSQTY,
                StoreQTY=B.TotInQTY-b.TotOutQTY-b.TotBlQTY-b.TotPSQTY
          FROM
                 MPSDayReport,(Select sum(INQTY) as TOTInQTY,,sum(OutQTY) as TotOutQTY,,sum(BLQTY) as TOtBLQTY, sum(PsQTY) as TotPSQTY From MPSDayReport  c 
                                            where c.Date_1<=MPSDayReport.Date_1 and c.ProcessID=MPSDayReport.ProcessID and c.MPSID=MPSDayReport.MPSID and c.Prdid=MPSDayReport.Prdid
                                            and c.YSID=MPSDayReport.YSID and c.PackListID=MPSDayReport.PackListID) b
    END
    2.比如说,我现在修改的是出货单号为001的明细数据,那么触发器是只去重新算001的累计数呢还是所有的出货单都在重算?3.同上,我的意思是希望只去重新累计我编辑的出货单号为001的数量和金额4.如2,如果是触发器只要检测有修改,即把所有数据都重算一遍的话,是否采用它来做库存计算会很慢?
      

  4.   

    原来我多写了两个豆号,可能是我的SQL字体太小了,我看没有豆号补了一个,现在放大看知道啦
      

  5.   

    to lz:
    1、你的和李老大的还是稍有差别的,老大的是计算你修改记录的金额和数量。至于用老大的还是你的视乎要看你具体的需求
    2、inserted表和deleted表是在进行数据update的时候要用到的两张临时表。update相当于删除原来的数据,插入新的数据。这样需要用临时表来存储原来的数据(使用deleted),插入新的数据(inserted)另等李老大
      

  6.   

        UPDATE a
        SET 
            总数量=b.数量,
            总金额=b.金额
        FROM 
            出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
        WHERE
            DATEDIFF(DD,GETDATE(),a.出货日期)=0
    现在主要是我不知道判定条件写在哪儿,我只想修改当前出货单号,where条件怎么写呢,或者请看我的另外一篇贴子:http://topic.csdn.net/u/20090323/22/20a4f289-4388-4984-a2ef-f83a5c4ff403.html?seed=1149905067
      

  7.   

    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        UPDATE a
        SET 
            总数量=b.数量,
            总金额=b.金额
        FROM 
            出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
        WHERE
            a.单号=出货单明细.单号
    END这样写?
    注意,不能用日期来作外键,只能用单号
      

  8.   

    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        UPDATE a
        SET 
            总数量=b.总数量,
            总金额=b.总金额
        FROM 
            出货单主档 a,(SELECT SUM(数量) AS 总数量,SUM(金额) AS 总金额,单号 FROM 出货单明细 Group by 单号) b
        WHERE
            a.单号 =b.单号END这样写目的也达到了
    但还是在修改全部单号,没有修改当前的单号
      

  9.   

    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        UPDATE a
        SET 
            总数量=b.总数量,
            总金额=b.总金额
        FROM 
            出货单主档 a,(SELECT SUM(数量) AS 总数量,SUM(金额) AS 总金额,单号 FROM 出货单明细 where 单号 in (select 单号 from inserted)  Group by 单号) b
        WHERE
            a.单号 =b.单号END哈哈,这样写目的达到了,也只修改当前单号的累计,但合理不呢。。
      

  10.   

    刚才才知道Inserted是什么意思
    又修改了一下:
    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        UPDATE a
        SET 
            总数量=b.总数量,
            总金额=b.总金额
        FROM 
            出货单主档 a,(SELECT SUM(出货单明细.数量) AS 总数量,SUM(出货单明细.金额) AS 总金额,出货单明细.单号 FROM  出货单明细 inner join inserted on 出货单明细.单号=inserted.单号  Group by 出货单明细.单号) b
        WHERE
            a.单号 =b.单号END
      

  11.   

    问题1:目的已经达到,但我这样写合理吗?与你的写法是一样吗? 不合理,只需要处理在inserted、deleted虚拟表中包含的单号,修改如下:
    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        Update a 
        set 
            总数量=isnull((select sum(数量) from 出货单明细 where 出货单明细.单号=a.单号),0),
            总金额=isnull((select sum(金额) from 出货单明细 where 出货单明细.单号=a.单号),0)
        from
            出货单主档 a 
        where
            exists(select 1 from inserted where 单号=a.单号)
            or
            exists(select 1 from deleted  where 单号=a.单号)
    END问题2:采用这样的触发器后,是否我每插入或修改删除一笔纪录,触发器会对里面的每一条纪录都进行写重新累计?这是样否造成效率低下? 楼主的会,我在上面给出的那个不会。
    问题3:如果是对每一条纪录都重新累计,是否可以有选择性的累计某一出货单号的数据? 可以。
    问题4:是否可以利用触发器来做仓库库存运算?这样做跟在VB里面采用SQL语句来更新库存谁更高效? 建议不要用触发器,复杂的业务逻辑不妨封装在存储过程中;显然在数据库中处理快。问题5: 比如我利用触发器按产品来累计生产数,如果我修改了某条纪录的产品号,对触发器来说,是否先删除原来的产品再新增一个新的产品? 业务逻辑需要在触发器中定义,触发器只会忠实的执行你所定义的SQL。
      

  12.   


    即时通讯工具目前只能用内网的Communicator,Sorry.
    CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细] 
    FOR INSERT, UPDATE, DELETE 
    AS
    BEGIN
        UPDATE a 
        SET 
            总数量=ISNULL(b.数量,0),
            总金额=ISNULL(b.金额,0)
        FROM
            出货单主档 a
        LEFT JOIN
            (SELECT 
                 c.单号,
                 SUM(c.数量) AS 数量,
                 SUM(c.金额) AS 金额 
             FROM
                 出货单明细 c
             WHERE 
                 EXISTS(SELECT 1 FROM inserted WHERE 单号=c.单号) 
                 or 
                 EXISTS(SELECT 1 FROM deleted  WHERE 单号=c.单号) 
             GROUP BY 
                 c.单号) b
         ON
             a.单号=b.单号
    END
    GO
      

  13.   

    把删除也考虑进来了,多谢!!
    能帮我再看一下另外一个贴子吗?地址:http://topic.csdn.net/u/20090323/22/20a4f289-4388-4984-a2ef-f83a5c4ff403.html?seed=1149905067如果你晚上也上QQ,能加我吗?我不会在你不方便的时候烦你的啦!
      

  14.   

    不用QQ好多年,最近MSN也被禁了;回家上不了网...
      

  15.   

    OK!只能在CSDN上向你请教了,但CSDN有问题啊,在线聊天发私信似乎都不能用了
      

  16.   

    那也是个触发器?
    update a
    set
        生产累计=b.进货累计,
        不良累计=b.不良累计
    from
        生产日报 a,
        (select
             n.产品,
             n.工序,
             n.日期,
             sum(m.生产数) as 进货累计,
             sum(m.不良数) as 不良累计,
             ...
         from
             生产日报 m,生产日报 n
         where
             m.日期<=n.日期 and m.工序=n.工序 and m.产品=n.产品
              and
             (exists(select 1 from inserted where 工序=n.工序 and 产品=n.产品)
              or
              exists(select 1 from deleted  where 工序=n.工序 and 产品=n.产品))
         group by
             n.产品,n.工序,n.日期) b
    where
        a.产品=b.产品 and a.工序=b.工序 and a.日期=b.日期