注册 登录
编程论坛 SQL Server论坛

请大家帮忙写一个同一种材料加总数的触发器

davyxjc 发布于 2012-04-19 14:22, 398 次点击
生产订单有主表及子表,子表保存订单需要用于生产的物料及数量。
如子表B有很多字段,现列出主要字段:
modid(主表ID),allocalteid(子表ID),invcode(材料编码),free1(宽度) ,qty(应领数量),issqty(已领数量),qtylenth(应领长度) 等字段。
现假设某订单需要用以下材料
modid   allocalteid    invcode   free1  qty  issqty      qtylenth
1      4              04-0100   30     1.5               1883.3
1      5              04-0100   30     55                1883.3
1      6              04-0200   45     1.8               240
1      7              04-0020   45     9                 240
modid相同,就表示同一订单需要的物料
现要写一个触发器,保存的时候,判断如果free1<>null或<>0,则计算同一种物料(invcode,free1相同)的长度是多少,填写到qtylenth字段中。
如上面:
04-0010   30   的长度是:(1.5+55)*1000/30=1883.3
04-0020   45   的长度是:(1.8+9)*1000/45=240  
所以上面对应物料qtylenth 的值分别是:1883.3240
请问这样的触发器最简单的写法是怎样的?
急着用,谢谢大家!


1 回复
#2
netlin2012-04-23 01:12
以下是程序段:
拷贝到SQL查询分析器中运行即可。
程序代码:
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE   TRIGGER abc
ON [dbo].[Table1001]
FOR INSERT, UPDATE, DELETE
AS
IF (COLUMNS_UPDATED()&63) >0
update Table1001 set qtylenth=b.qtylenth from
    Table1001 a inner join
    (select modid,invcode,free1,round(sum(qty)*1000/free1,1) as qtylenth from Table1001  where free1>0 group by modid,invcode,free1) b
    on a.modid=b.modid and a.invcode=b.invcode and a.free1=b.free1

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
注意:
1.把程序中的表名:Table1001,换成你自己的表名。
2.如果你的表中的字段数超过8,程序要做一点调整。
3.字段顺序是按你问题中所组顺序,如果你真实表的顺序不同,程序可能也要调整。
1