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.序列号

解决方案 »

  1.   

    CREATE TRIGGER tri_fqfk_insert  ON [dbo].[fqfk] 
    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.序列号
      

  2.   

    我把程序改为:
    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表才有的。
      

  3.   

    letsflytogether(恨!不能拥有天下所有的财富,然后平分)  兄弟,你的程序不是和我原来的一样吗?
      

  4.   

    CREATE TRIGGER tri_fqfk_insert  ON [dbo].[fqfk] 
    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.序列号
      

  5.   

    程序肯定没有错,我怀疑你测试数据有错,也就是gcb里面找不到你新增记录表里的工程单号、序号
      

  6.   

    有可能,但是同样的程序我用在另外一个程序里:
    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.型号是成功的。
      

  7.   

    奇怪的是为什么程序实现不了呢?
    我在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.序列号不会是有冲突吧?
      

  8.   

    CREATE TRIGGER tri_fqfk_insert  ON [dbo].[fqfk] 
    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
      

  9.   

    当然了,那边先触发,进行对表gcb的UPDATE,这时候改了“欠收工程款 ”
    然后又触发了这边的UPDATE触发器,又将“欠收工程款 ”改回了原来的值
    因为这个过程中应收工程款、实收工程款没有变过
      

  10.   

    CREATE TRIGGER tri_fqfk_insert  ON [dbo].[fqfk] 
    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
      

  11.   

    CREATE TRIGGER tri_fqfk_insert  ON [dbo].[fqfk] 
    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
      

  12.   

    我有个想法,能否把两个表合并起来,把“本次所收工程款”和“本次所收配水主管费”等字段加入到gcb表中,把触发器程序改为:
    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.序列号不知这样是否可行?
    还有我想在触发器里加上更新“备注”字段的语句,作用是每次付款后都把“本次所收工程款”“本次所收配水主管费”“付款时间”等数据列入备注里,每次的数据都是新增上去,而原来备注里的资料不被删除。
      

  13.   

    谢谢 yujohny(踏网无痕) !!!一言点醒梦中人啊!!!请问我该如何解决这个问题呢?
      

  14.   

    yujohny(踏网无痕):
    这个建议很好!请问具体如何填?我是菜鸟,不懂
      

  15.   

    你在企业管理器右击你的gsb表,选择“设计表”
    然后定位到“欠收工程款”那个字段行
    下面就有描述、默认值、……公式
    你就在公式那里填上 isnull(应收工程款,0)-isnull(实收工程款,0)
    这样“欠收工程款”字段的值SQL就会自己计算了
      

  16.   

    yujohny(踏网无痕):
    我采用了你:
    把“欠收工程款”字段在设计表那里的公式里填上:应收工程款-实收工程款
    同理“欠收配水主管费”字段也在公式那里填上:应收配水主管费-实收配水主管费的建议,但是我再次运行程序出发fqfk表的触发器时,它提示:Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]无法修改列 '欠收工程款',因为该列是计算列。 /fenqifukuan.asp,行115 
      

  17.   

    触发器就改为修改“实收”的列
    还有提醒你,这个触发器对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.序列号
      

  18.   

    那么我想在请教一个问题:
    比如我是分三次付清的,“1000”“2000”“3000”
    那么我想它在每次付后,在gcb的“备注”里加上“XXXX年X月X日付工程款1000元”的字样。
    三付清后,“备注”里面应该显示:
    XXXX年X月X日付工程款1000元(回车换行)
    XXXX年X月X日付工程款2000元(回车换行)
    XXXX年X月X日付工程款3000元请问如何实现?
      

  19.   

    那就在触发器里改了,对新增有效,更新的话就有点麻烦了
    还有用“;”来代替回车换行
    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.序列号
      

  20.   

    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),
        a.备注 = ISNULL(a.备注,'')+CONVERT(nvarchar(10), getDate(),120)
                 +'付工程款'+cast(isnull(b.本次所收配水主管费,0) as nvarchar)+'元;'
    from gcb a inner join inserted b on b.序列号=a.序列号
      

  21.   

    你可以将分号替换成 CHAR(13) + CHAR(10) 试试