CREATE TRIGGER trig_L1 ON dbo.L1 
FOR INSERT, UPDATE
AS
update L2 set L2.数量 = L2.数量 + inserted.数量,L2.总价 = L2.总价+inserted.总价 from inserted where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位 and L2.单价 = inserted.单价
update L2 set L2.数量 = L2.数量 + inserted.数量,L2.总价 = L2.总价+inserted.总价,L2.单价 = 0 from inserted where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位 and L2.单价 <> inserted.单价

解决方案 »

  1.   

    回复人: ken2002(尖刀) 
    您写的触发器我研究了一下!真是太谢谢你了!呵呵!
    但,我发现一个问题,就是(如果L2中没有符合条件的记录,则把L1中的记录直接写到L2中。)这一句的功能没有实现,应该怎么做?需不需要在在这个L2中建立一个新的触发器,然后INSERT???还是直接在原有的上。???
    语句应该怎么写??
    谢谢!!!!
      

  2.   

    CREATE TRIGGER trig_L1 ON dbo.L1 
    FOR INSERT, UPDATE, DELETE
    AS
        if not exists(select 0 from L2 where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位)
        begin
            --以下這個只是適用於單筆增加L1時可用, 否則需要用游標
            insert into L2(类别,项目,品名,规格,单位,数量,单价,总价)
            values(inserted.类别项目, inserted.品名, inserted.规格, inserted.单位, inserted.数量, inserted.单价, inserted.总价)
        end
        else 
        begin
             --如果修改需要減掉舊值
         update L2 set L2.数量 = L2.数量 - deleted.数量,L2.总价 = L2.总价- deleted.总价 
            from inserted where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位      update L2 set L2.数量 = L2.数量 + inserted.数量,L2.总价 = L2.总价+inserted.总价 
            from inserted where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位 
                and L2.单价 = inserted.单价

            update L2 set L2.数量 = L2.数量 + inserted.数量,L2.总价 = L2.总价+inserted.总价,L2.单价 = 0 
            from inserted where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位 
                and L2.单价 <> inserted.单价
        end
      

  3.   

    sorry
    以下這句應該放在if not exists(...之前--如果修改需要減掉舊值
         update L2 set L2.数量 = L2.数量 - deleted.数量,L2.总价 = L2.总价- deleted.总价 
            from inserted where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位 
      

  4.   

    sorry, 真是頭昏了應該為如下--如果修改需要減掉舊值
         update L2 set L2.数量 = L2.数量 - deleted.数量,L2.总价 = L2.总价- deleted.总价 
            from deleted where L2.类别 = deleted.类别 and  L2.项目 = deleted.项目 and L2.品名 = deleted.品名 and L2.规格 = deleted.规格 and L2.单位 = deleted.单位 
      

  5.   

    如果我一次写入多条记录的话!游标怎么用啊??
    我才学SQL就遇到了这样的麻烦!!
    谢谢您能帮助我!
    谢谢!
      

  6.   

    if not exists(select 0 from L2 where L2.类别 = inserted.类别 and  L2.项目 = inserted.项目 and L2.品名 = inserted.品名 and L2.规格 = inserted.规格 and L2.单位 = inserted.单位)
        begin
            --以下這個只是適用於單筆增加L1時可用, 否則需要用游標
            insert into L2(类别,项目,品名,规格,单位,数量,单价,总价)
            values(inserted.类别项目, inserted.品名, inserted.规格, inserted.单位, inserted.数量, inserted.单价, inserted.总价)
        end这段中有错误啊!
            values(inserted.类别项目, inserted.品名, inserted.规格, inserted.单位, inserted.数量, inserted.单价, inserted.总价)
    报错为:类别,项目。不能做为表中的列,只能是变量,表达式。。
    怎么解决啊??
      

  7.   

    如果每次只插入一条记录:
    CREATE TRIGGER trig_L1 ON dbo.L1 
    FOR INSERT
    AS
    update L2 set L2.数量 = L2.数量 + inserted.数量,
                  L2.总价 = L2.总价 + inserted.总价,
                  L2.单价 = case when L2.单价 = inserted.单价 
                                      then L2.单价
                                 else 0 end
    from inserted 
    where L2.类别 = inserted.类别 and 
          L2.项目 = inserted.项目 and 
          L2.品名 = inserted.品名 and 
          L2.规格 = inserted.规格 and 
          L2.单位 = inserted.单位if @@rowcount = 0
        insert into L2(类别,项目,品名,规格,单位,数量,单价,总价)
        select 类别,项目,品名,规格,单位,数量,单价,总价
        from inserted
      

  8.   

    如果每次有多条记录:(上面写错字了)
    CREATE TRIGGER trig_L1 ON dbo.L1 
    FOR INSERT
    AS
    update L2 set L2.数量 = L2.数量 + inserted.数量,
                  L2.总价 = L2.总价 + inserted.总价,
                  L2.单价 = case when L2.单价 = inserted.单价 
                                      then L2.单价
                                 else 0 end
    from inserted 
    where L2.类别 = inserted.类别 and 
          L2.项目 = inserted.项目 and 
          L2.品名 = inserted.品名 and 
          L2.规格 = inserted.规格 and 
          L2.单位 = inserted.单位    insert into L2(类别,项目,品名,规格,单位,数量,单价,总价)
        select 类别,项目,品名,规格,单位,sum(数量),
               单价 = case count(distinct 单价) when 1 then max(单价)
                                               else 0 end,
               sum(总价)
        from inserted
        where 类别+项目+品名+规格+单位 not in
             (select 类别+项目+品名+规格+单位 from L2)
        group by 类别,项目,品名,规格,单位注:如果类别、项目、品名、规格、单位有空值,或有varchar类型,最后的where语句应作相应修改:    ltrim(rtrim(isnull(类别,'')))+......
      

  9.   

    如果要把同一品种每次插入多条的情况考虑进去:
    CREATE TRIGGER trig_L1 ON dbo.L1 
    FOR INSERT
    AS
    update L2 set L2.数量 = L2.数量 + T3.数量,
                  L2.总价 = L2.总价 + T3.总价,
                  L2.单价 = case when L2.单价 = T3.单价 
                                      then L2.单价
                                 else 0 end
    from  (select 类别,项目,品名,规格,单位,数量=sum(数量),
           单价 = case count(distinct 单价) when 1 then max(单价)
                                           else 0 end,
           总价=sum(总价)
           from inserted
           group by 类别,项目,品名,规格,单位) as T3
    where L2.类别 = T3.类别 and 
          L2.项目 = T3.项目 and 
          L2.品名 = T3.品名 and 
          L2.规格 = T3.规格 and 
          L2.单位 = T3.单位insert into L2(类别,项目,品名,规格,单位,数量,单价,总价)
    select 类别,项目,品名,规格,单位,sum(数量),
           单价 = case count(distinct 单价) when 1 then max(单价)
                                           else 0 end,
           sum(总价)
    from inserted
    where 类别+项目+品名+规格+单位 not in
         (select 类别+项目+品名+规格+单位 from L2)
    group by 类别,项目,品名,规格,单位注:如果类别、项目、品名、规格、单位有空值,或有varchar类型,最后的where语句应作相应修改:    ltrim(rtrim(isnull(类别,'')))+......