有几个问题,不知你如何考虑:
1、这个触发器只能处理一次插入一条记录的情况。
2、VALUE的生成方式有问题,两台机一起插入时会有问题。
3、MINM表的主键是不是ID。是就没问题。

解决方案 »

  1.   

    修改第二个问题的方法之一,把对F_Arithmometer表的更新提前,这样锁住了F_Arithmometer表(就一条记录),能解决并发的情况,但第一个问题你要考虑清楚:
      DECLARE @ID INT                    --当明插入的单据的ID
      DECLARE @Fac_id SMALLINT        --基地ID
      DECLARE @Msort_ID SMALLINT        --物料类别ID
      DECLARE @YearNO SMALLINT            --年度
      DECLARE @Folio VARCHAR(15)          --最终生成的单据号  SELECT  @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date)  
        FROM Inserted  UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and  
        msort_id=@Msort_ID and YearNo=@YearNO
      IF @@ERROR<>0 
      BEGIN
        ROLLBACK TRANSACTION
        RETURN
      END  SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+
        STR (value,5),' ','0') FROM  F_Arithmometer(TABLOCKX) 
        WHERE fac_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO
      IF @@ROWCOUNT=0  --没有生成单号,回滚事务
      BEGIN
        ROLLBACK TRANSACTION
        RETURN
      END  UPDATE MINM SET Folio=@Folio WHERE ID=@ID
      IF @@ERROR<>0 
      BEGIN
        ROLLBACK TRANSACTION
        RETURN
      END
      

  2.   

    想保証完全連續的流水號,非得專門建個table不可。否則只是靠Trigger恐怕不是很可靠。
      

  3.   

    在你个触发器里应该使用游标,因为SQL是批量修改的,所以要使用游标处理。
    而且你个表里有主键吗?
      

  4.   

    就算建专门的TABLE恐怕都不好解决:(
      

  5.   

    我只想到了把begin换个位置,不妨试一试:
      DECLARE @ID INT                    --当明插入的单据的ID
      DECLARE @Fac_id SMALLINT           --基地ID
      DECLARE @Msort_ID SMALLINT         --物料类别ID
      DECLARE @YearNO SMALLINT           --年度
      DECLARE @Folio VARCHAR(15)         --最终生成的单据号
      
      BEGIN
       SELECT  @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date)  
         FROM Inserted
      ----------------------------------------------------------------------------
       SELECT  @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+
                            STR (value,5),' ','0') 
         FROM  F_Arithmometer(TABLOCKX)   --锁住该表
         WHERE Fac_id=@Fac_id and Msort_id=@Msort_ID and YearNo=@YearNO
       IF @@ROWCOUNT<>0                   --没有生成单号,回滚事务
         ROLLBACK TRANSACTION
         RETURN
      END
      -----------------------------------------------------------------------------
      BEGIN
       UPDATE MINM SET Folio=@Folio 
         WHERE ID=@ID
       IF @@ERROR<>0 
        ROLLBACK TRANSACTION
        RETURN
      END
      -----------------------------------------------------------------------------
      BEGIN
       UPDATE F_Arithmometer SET VALUE=VALUE+1 
         WHERE fact_id=@Fac_id and  
               msort_id=@Msort_ID and YearNo=@YearNO
       IF @@ERROR<>0 
        ROLLBACK TRANSACTION
        RETURN
      END
      

  6.   

    to: Haiwer(海阔天空) 
    对不起,高手是有原则的,怎么能因为你多给分就破坏自己的原则呢?
    在高手眼中,分数只是过眼云烟。
    但考虑到我的云烟目前比较少,连过眼都不够,所以你要是答应给个20000分,我会考虑一次给你10个签名。
      

  7.   

    TO zzao() :
    你的问题到底是什么呢,可以说下你的出错提示么???
      

  8.   

    To: mmzxg(超级笨蛋) 
        他的问题是"有没有高手",现在的答案是:有,bluepower2008(蓝色力量) TO:bluepower2008(蓝色力量) 
    你好象数学没学好,亏本生意都做的??
    我要是你,签一个名不累,3000够了,签10个名多累呀,至少每个4000!
      

  9.   

    强烈推荐bluepower2008(蓝色力量)和Haiwer(海阔天空)参加明年的春节联欢晚会!
      

  10.   

    哈哈!
    bluepower2008(蓝色力量),去不去?到时一不小心你要我的签名了,那时非涨价不可!
      

  11.   

    对不起,昨天忙得屁股都没离椅子(高手也要为生计而拼命),所以也没及时上来卖我的签名。
    to: Haiwer(海阔天空)
    你还是很厉害嘛,我唯一的罩门都被你发现了。我打小就没学好数学,以前买鸡蛋就只知道5毛钱俩,至打老师告诉我签名要20000分10个后,我就一直用这个价格,你冷不丁给我一个3000分1个的价格,我把脚趾头都用上,也没算清楚哪个便宜,只好用老价钱,反正应该不会亏,老师说的嘛!:)至于春节联欢晚会这种小场面,我一般是不去的,但考虑到导演也不容易,如果他能给我20000分买我10个签名,我会考虑的。
      

  12.   

    DECLARE @ID INT                    --当明插入的单据的ID
      DECLARE @Fac_id SMALLINT        --基地ID
      DECLARE @Msort_ID SMALLINT        --物料类别ID
      DECLARE @YearNO SMALLINT            --年度
      DECLARE @Folio VARCHAR(15)          --最终生成的单据号SELECT  @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date)  
        FROM Inserted  SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+
        STR (value,5),' ','0') FROM  F_Arithmometer(TABLOCKX) 
        WHERE fac_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO
      IF @@ROWCOUNT=0  --没有生成单号,回滚事务
      BEGIN
      
        ROLLBACK TRANSACTION
        RETURN
      END  UPDATE MINM SET Folio=@Folio WHERE ID=@ID
      IF @@ERROR<>0 
      BEGIN
        ROLLBACK TRANSACTION
        RETURN
      END  UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and  
        msort_id=@Msort_ID and YearNo=@YearNO
      IF @@ERROR<>0 
      BEGIN
        ROLLBACK TRANSACTION
        RETURN
      END
    上面的语句我认为没有问题
    我想你的问题出在minm表里,设置一个自动加一的主键,或者你别的表的触发器涉及到了你这个触发器里的某个表.不知对不对
      

  13.   

    谢谢大家这么积极,我的MinM 表的ID是设为主键的,并且考虑到这是一个主表,在输入时每次都只是插入一条记录,因此没有考虑批量插入的情况,因而没有使用游标。
    我后来发现,原来出错的原因不是这个引起,而是打印机出错提示‘已经有一个激活的事务’,操作员对我报告这个错误时,我神经过敏所致,因为我刚刚在数据库中加上了这个触发器。现经过多次测试,绝对没有问题,如有人认可此法可大胆使用。
    另外,我还想请教,各位大侠在处理单号连续这个问题的时候是怎样做的,说出来交交流流也好。
    To  zhaohe(霹雳五号)
    你说要使用 Tablockx锁住此表,我开始也是这么做的,后来有一次发现所有的用户都提示连接超时错,我花了两个小时的时间,发现就是因为锁住这个表出了问题,我也看过书上讲,事务提交或回流后将会自动解锁,可是它没有自动解锁,我只好去掉了这个锁,不知有没有什么方法能手动地在事务结束后解锁而不依赖系统。