CREATE TRIGGER T_WL_WLRK_UPDATE ON dbo.T_WL_WLRK 
FOR UPDATE
ASDECLARE @o_rkdh CHAR(11)     --旧的入库单号
DECLARE @n_rkdh  CHAR(11)    --新的入库单号
DECLARE @o_wlbh  CHAR(13)    --旧的物料编号
DECLARE @n_wlbh  CHAR(13)    --新的物料编号
DECLARE @o_djlx   VARCHAR(10)   --旧的单据类型
DECLARE @n_djlx   VARCHAR(10)   --新的单据类型
DECLARE @o_djbh  CHAR(11)    --旧的单据编号
DECLARE @n_djbh  CHAR(11)    --新的单据编号
DECLARE @o_jyph  CHAR(11)    --旧的检验批号
DECLARE @n_jyph  CHAR(11)    --新的检验批号
DECLARE @n_ckh  CHAR(11)    --仓库号DECLARE @o_sl  DECIMAL(18,4)    --旧的入库数量
DECLARE @n_sl  DECIMAL(18,4)    --新的入库数量
DECLARE @sl  DECIMAL(18,4)    --现有库存数量
DECLARE @qr bit /*当前记录是否被结存*/BEGIN TRANSACTIONSELECT @o_rkdh=入库单号, @o_wlbh=物料编号, @o_djlx=单据类型, @o_djbh=单据编号, @o_jyph=检验批号, @o_sl=入库数量,@qr=确认 FROM deleted
SELECT @n_rkdh=入库单号, @n_wlbh=物料编号, @n_djlx=单据类型, @n_djbh=单据编号, @n_jyph=检验批号, @n_sl=入库数量,@n_ckh=仓库号 FROM inserted--结存确认后的数据不能被修改
/******主要就是以下这段******/
IF @qr=1
     BEGIN
            RAISERROR('数据已结存,您不能再修改',16,1)
            ROLLBACK
           RETURN
    END
COMMIT TRANSACTION

解决方案 »

  1.   


    这样你再试一下~~
    IF @qr=1
    begin 
    ROLLBACK
      RAISERROR('数据已结存,您不能再修改',16,1)
      RETURN
        END
    COMMIT TRANSACTION
      

  2.   

    update 数据的地方触发器也有那一段么?
      

  3.   

    这样写触发器不是很好,你没解决批量UPDATE的问题.
      

  4.   

    TO: xiaonvjing(飞扬)
    是的,我就想当确认字段为1时不允许再修改.什么样表结构对触发器会有影响?TO:iwl() 
    肯定有符合条件的数据,因为用带WHERE子句修改部分记录时也会触发,而不带WHERE时却不触发了.TO: wangdehao(找找找) 
    您能谈谈如何写触发器,才能很好解决批量UPDATE的问题,这方面我不太了解,谢谢!我奇怪的是,同样触发器用在其他表上,一点问题都没有.不知这该做何解释.
      

  5.   

    当你用UPDATE T_WL_WLCK SET 确认 = 0 WHERE 确认 = 1时,
    deleted表里的确认字段都是1,所以SELECT @o_rkdh=入库单号, @o_wlbh=物料编号, @o_djlx=单据类型, @o_djbh=单据编号, @o_jyph=检验批号, @o_sl=入库数量,@qr=确认 FROM deleted
    SELECT @n_rkdh=入库单号, @n_wlbh=物料编号, @n_djlx=单据类型, @n_djbh=单据编号, @n_jyph=检验批号, @n_sl=入库数量,@n_ckh=仓库号 FROM inserted这2个语句可以取得结果 @qr=1
    当你用  UPDATE T_WL_WLCK SET 确认 = 0  时,你是对整个表进行update,这时deleted表 和inserted的表里就不是一条记录了,而是包含多个记录,也就是说deleted表的"确认"字段可能是1也可能是别的数值,而按你的sql,@qr应该是取得deleted表里的最后一条记录的"确认"(第一条还是最后条记录我也不是很确定),所以可能引不起触发不知道这样讲你明白吗?建议了解一下update触发器的过程,以及inserted,deleted 表里的数据
      

  6.   

    部分表内容(这个表会出错)
    出库单号           发货单号           物料号            检验批号       出库数量
           接收单位    出库日期          备注     操作者  仓库号   确认 
    W2004120015 Q2004120020 3.604.160.15  E2003120105 6000 7016 2004-12-9 0:00 NULL ZRD 3 1
    W2004120034 Q2004120043 3.604.160.15  E2003120105 1106 7016 2004-12-16 0:00 NULL zrd 3 1
    W2004120034 Q2004120043 3.604.160.15  E2004120088 894 7016 2004-12-16 0:00 NULL zrd 3 1
    W2005010002 Q2004120081 3.604.160.15  E2004120088 606 7016 2005-12-29 0:00 NULL ZRD 3 0
    W2005010002 Q2004120081 3.604.160.15  E2004120151 4394 7016 2005-12-29 0:00 NULL ZRD 3 0
    W2005020002 Q2005010103 3.604.160.15  E2004120151 3672 7016 2005-1-28 0:00 NULL zrd 3 1
    W2005020002 Q2005010103 3.604.160.15  E2005010133 10000 7016 2005-1-28 0:00 NULL zrd 3 1
    W2005020002 Q2005010103 3.604.160.15  E2005010138 12000 7016 2005-1-28 0:00 NULL zrd 3 1
    W2005020002 Q2005010103 3.604.160.15  E2005010145 13000 7016 2005-1-28 0:00 NULL zrd 3 1
    W2005020002 Q2005010103 3.604.160.15  E2005010151 6328 7016 2005-1-28 0:00 NULL zrd 3 1
    W2005010025 Q2005010010 3.604.160.16  E2005010010 2000 7000 2005-1-5 0:00 NULL zrd 3 1
    W2005010026 Q2005010014 3.604.160.16  E2005010010 3000 7000 2005-1-6 0:00 NULL zrd 3 1
    W2005010026 Q2005010014 3.604.160.16  E2005010018 5000 7000 2005-1-6 0:00 NULL zrd 3 1
      

  7.   

    这是部分入库表数据(触发正常)
    入库单号            物料数量        单据类型  单据编号          入库数量   入库日期
           仓库号      检验批号         存放位置  加工状态  备注    现存数量  操作者  确认
    U2004120306 3.604.050.7   随工单 O2004120315 13000 2004-12-18 0:00 3 E2004120098 * NULL NULL 0 zrd 1
    U2005010005 3.604.050.7   随工单 O2004120316 8000 2005-12-30 0:00 3 E2004120162 * NULL NULL 0 ZRD 0
    U2005020010 3.604.050.7   随工单 O2005010304 10000 2005-1-28 0:00 3 E2005010158 * NULL NULL 0 zrd 1
    U2005020021 3.604.050.7   随工单 O2005020301 15000 2005-1-31 0:00 3 E2005010177 * NULL NULL 0 zrd 1
    U2004110300 3.604.050.7   随工单 O2004110312 15000 2004-11-12 0:00 3 E2004110064 * NULL NULL 0 zrd 1
    U2004120028 3.604.050.7   随工单 O2004120302 13000 2004-11-30 0:00 3 E2004110177 * NULL NULL 0 zrd 1
    U2004120120 3.604.050.7   随工单 O2004120304 7000 2004-12-2 0:00 3 E2004120007 * NULL NULL 0 zrd 1
      

  8.   

    也就是说你的触发器写的是有问题的,可以这样写:CREATE TRIGGER T_WL_WLRK_UPDATE ON dbo.T_WL_WLRK 
    instead of UPDATE  
    AS
     if exists(select * from deleted where 确认 = 1)
      begin
       ROLLBACK
      RAISERROR('数据已结存,您不能再修改',16,1)
      RETURN
      end
      

  9.   

    TO: wangdehao(找找找) 
    谢谢,之前一直以为修改一条触发一次,inserted,deleted 表中只会有一条记录,现在我明白了.