CREATE TRIGGER tri_fqfk_insert ON [dbo].[fqfk]
FOR INSERT, UPDATE--, DELETE这个DELETE是多余的
AS
update b set b.欠收工程款 =isnull(b.欠收工程款,0) - isnull(a.本次所收工程款,0)
from gcb b inner join inserted a on a.工程编号=b.工程编号update a
set a.欠收配水主管费 =isnull(a.欠收配水主管费,0) - isnull(b.本次所收配水主管费,0)
from gcb a inner join inserted b on b.序列号=a.序列号
FOR INSERT, UPDATE--, DELETE这个DELETE是多余的
AS
update b set b.欠收工程款 =isnull(b.欠收工程款,0) - isnull(a.本次所收工程款,0)
from gcb b inner join inserted a on a.工程编号=b.工程编号update a
set a.欠收配水主管费 =isnull(a.欠收配水主管费,0) - isnull(b.本次所收配水主管费,0)
from gcb a inner join inserted b on b.序列号=a.序列号
FOR INSERT
AS
update gcb set 欠收工程款 =欠收工程款 - isnull(a.本次所收工程款,0)
from inserted a
where a.工程编号=gcb.工程编号update gcb set 欠收配水主管费 =欠收配水主管费 - isnull(b.本次所收配水主管费,0)
from inserted b
where b.序列号=gcb.序列号
CREATE TRIGGER tri_fqfk_insert ON [dbo].[fqfk]
FOR INSERT, UPDATE, DELETE
AS
update b set b.欠收工程款 =isnull(b.欠收工程款,0) - isnull(a.本次所收工程款,0)
from gcb b inner join inserted a on a.工程编号=b.工程编号update a
set a.欠收配水主管费 =isnull(a.欠收配水主管费,0) - isnull(b.本次所收配水主管费,0)
from gcb a inner join inserted b on b.序列号=a.序列号但是还是改变不了gcb表里的值。
特别说明:fqfk表里没有“欠收工程款”和“欠收配水主管费”字段,那是gcb表才有的。
FOR INSERT, UPDATE
AS
update gcb set 欠收工程款 = isnull(欠收工程款,0) - isnull(a.本次所收工程款,0)
from inserted a,gcb
where a.工程编号=gcb.工程编号
update gcb set 欠收配水主管费 = isnull(欠收配水主管费,0) - isnull(b.本次所收配水主管费,0)
from inserted b,gcb
where b.序列号=gcb.序列号
CREATE TRIGGER tri_sb_insert ON [dbo].[sb]
FOR INSERT, UPDATE, DELETE
AS
update Child1 set 库存=库存+isnull(a.数量,0)
from inserted a
where a.型号= Child1.型号是成功的。
我在gcb表里本身设置了一个触发器:
CREATE TRIGGER tri_qk2_insert ON [dbo].[gcb]
FOR INSERT, UPDATE, DELETE
AS
update gcb set 欠收工程款 =gcb. 应收工程款 - isnull(a.实收工程款,0)
from inserted a
where a.工程编号=gcb.工程编号
update gcb set 欠收配水主管费 =gcb. 应收配水主管费 - isnull(b.实收配水主管费,0)
from inserted b
where b.序列号=gcb.序列号不会是有冲突吧?
FOR INSERT, UPDATE, DELETE
AS
update gcb set 欠收工程款 =欠收工程款 - isnull(b.本次所收工程款,0)
from gcb a inner join inserted b on a.工程编号=b.工程编号update gcb set 欠收配水主管费 =欠收配水主管费 - isnull(b.本次所收配水主管费,0)
from gcp a inner join inserted b on a.序列号=b.序列号
go
然后又触发了这边的UPDATE触发器,又将“欠收工程款 ”改回了原来的值
因为这个过程中应收工程款、实收工程款没有变过
FOR INSERT, UPDATE, DELETE
AS
update gcb set 欠收工程款 =欠收工程款 - isnull(b.本次所收工程款,0)
from gcb a inner join inserted b on a.工程编号=b.工程编号update gcb set 欠收配水主管费 =欠收配水主管费 - isnull(b.本次所收配水主管费,0)
from gcp a inner join inserted b on a.序列号=b.序列号
go
FOR INSERT, UPDATE, DELETE
AS
update gcb set 欠收工程款 =欠收工程款 - isnull(b.本次所收工程款,0)
from gcb a inner join inserted b on a.工程编号=b.工程编号update gcb set 欠收配水主管费 =欠收配水主管费 - isnull(b.本次所收配水主管费,0)
from gcp a inner join inserted b on a.序列号=b.序列号
go
CREATE TRIGGER tri_qk2_insert ON [dbo].[gcb]
FOR INSERT, UPDATE, DELETE
AS
update gcb set 欠收工程款 =gcb. 应收工程款 - isnull(a.实收工程款,0) - isnull(a.本次所收工程款,0)
from inserted a
where a.工程编号=gcb.工程编号
update gcb set 欠收配水主管费 =gcb. 应收配水主管费 - isnull(b.实收配水主管费,0) - isnull(b.本次所收配水主管费,0)from inserted b
where b.序列号=gcb.序列号不知这样是否可行?
还有我想在触发器里加上更新“备注”字段的语句,作用是每次付款后都把“本次所收工程款”“本次所收配水主管费”“付款时间”等数据列入备注里,每次的数据都是新增上去,而原来备注里的资料不被删除。
这个建议很好!请问具体如何填?我是菜鸟,不懂
然后定位到“欠收工程款”那个字段行
下面就有描述、默认值、……公式
你就在公式那里填上 isnull(应收工程款,0)-isnull(实收工程款,0)
这样“欠收工程款”字段的值SQL就会自己计算了
我采用了你:
把“欠收工程款”字段在设计表那里的公式里填上:应收工程款-实收工程款
同理“欠收配水主管费”字段也在公式那里填上:应收配水主管费-实收配水主管费的建议,但是我再次运行程序出发fqfk表的触发器时,它提示:Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]无法修改列 '欠收工程款',因为该列是计算列。 /fenqifukuan.asp,行115
还有提醒你,这个触发器对DELETE不起作用
因为DELETE时候INSERTED表里没有记录CREATE TRIGGER tri_fqfk_insert ON [dbo].[fqfk]
FOR INSERT, UPDATE--, DELETE这个DELETE是多余的
AS
update b set b.实收工程款 =isnull(b.实收工程款,0) + isnull(a.本次所收工程款,0)
from gcb b inner join inserted a on a.工程编号=b.工程编号update a
set a.实收配水主管费 =isnull(a.实收配水主管费,0) + isnull(b.本次所收配水主管费,0)
from gcb a inner join inserted b on b.序列号=a.序列号
比如我是分三次付清的,“1000”“2000”“3000”
那么我想它在每次付后,在gcb的“备注”里加上“XXXX年X月X日付工程款1000元”的字样。
三付清后,“备注”里面应该显示:
XXXX年X月X日付工程款1000元(回车换行)
XXXX年X月X日付工程款2000元(回车换行)
XXXX年X月X日付工程款3000元请问如何实现?
还有用“;”来代替回车换行
CREATE TRIGGER tri_fqfk_insert ON [dbo].[fqfk]
FOR INSERT, UPDATE--, DELETE这个DELETE是多余的
AS
update b
set b.实收工程款 =isnull(b.实收工程款,0) + isnull(a.本次所收工程款,0),
b.备注 = ISNULL(b.备注,'')+CONVERT(nvarchar(10), getDate(),120)
+'付工程款'+cast(isnull(a.本次所收工程款,0) as nvarchar)+'元;'
from gcb b inner join inserted a on a.工程编号=b.工程编号update a
set a.实收配水主管费 =isnull(a.实收配水主管费,0) + isnull(b.本次所收配水主管费,0),
b.备注 = ISNULL(b.备注,'')+CONVERT(nvarchar(10), getDate(),120)
+'付工程款'+cast(isnull(a.本次所收配水主管费,0) as nvarchar)+'元;'
from gcb a inner join inserted b on b.序列号=a.序列号
FOR INSERT, UPDATE--, DELETE这个DELETE是多余的
AS
update b
set b.实收工程款 =isnull(b.实收工程款,0) + isnull(a.本次所收工程款,0),
b.备注 = ISNULL(b.备注,'')+CONVERT(nvarchar(10), getDate(),120)
+'付工程款'+cast(isnull(a.本次所收工程款,0) as nvarchar)+'元;'
from gcb b inner join inserted a on a.工程编号=b.工程编号update a
set a.实收配水主管费 =isnull(a.实收配水主管费,0) + isnull(b.本次所收配水主管费,0),
a.备注 = ISNULL(a.备注,'')+CONVERT(nvarchar(10), getDate(),120)
+'付工程款'+cast(isnull(b.本次所收配水主管费,0) as nvarchar)+'元;'
from gcb a inner join inserted b on b.序列号=a.序列号