我搜索过以前别人的贴子,也试过取消唯一索引,试过adodataset.refresh和adodataset.close
adodataset.open.
都没有用.我认真检查过表中,没有重复的记录.我采用的是使用事务提交方式.
但是问题总是存在.

解决方案 »

  1.   

    CREATE TRIGGER st_sp_UPDATE ON dbo.st_sp 
    FOR UPDATE
    AS
    if @@rowcount>0
      begin
        declare @qty float
        declare @per float
        declare @spcode varchar(10)
        declare @detcode  varchar(10)
       declare @sp bit
        select @spcode=sp_Code,@detcode=det_code from deleted
        select @sp=sp from st_prd_mstk where prd_code=@spcode
        if @sp<>(1) 
           begin
                raiserror('此成品不是促销品,不能保存!',16,1)
                return
           end
        select  @qty=qty from st_sp where (sp_code=@spcode) and ((qty is null) or (qty=0))
           if @@rowcount>0 
               begin
                        raiserror('各单品的数量不能小于1,请重新设定各单品数量!',16,1)
                        return
               end
        select @per=sum(per) from st_sp where (sp_code=@spcode)
          if @per<>100
               begin
                   raiserror('各单品所占促销品百分比的总和不等于100,请重新设定各单品所占促销品的百分比率!',16,1)    
                   return
               end    
      end
    请问,我这个触发器这样写有何错误?
      

  2.   

    这个问题是老问题
    问题关键是在数据表中出现重复记录
    当Delphi6.0刚刚推出来的时候,很多宣传资料说解决了这个问题,但是在最残酷的测试下,依然出现此问题!
    最容易出现的地方是:当新增记录的时候,表里面添加了默认值,然后保存。因为Delphi默认不添加空的重复记录(当年FoxPro程序员转Delphi的时候被这个限制搞的头晕脑胀),但是只要有值就可以添加(大量出现在主从关系的从表中,关联字段默认添加),然后就死掉了!所以你的触发器有点是在“FOR UPDATE”上,只有更新时触发,那么INSERT时如何处理,其实这个问题最容易出现在这里!据我的使用及测试经验,一般解决方案有如下几点:
    1、及时升级你的MDAC(目前是2.7 Refresh 2)及开发工具补丁,通过ADO方式连接数据库这是没有办法的办法,当然不会很彻底;
    2、给数据库建立唯一索引,这种方法根据实际情况而定,因为很多情况下必须要添加自动递增字段,象有些基础资料数据库根本就不可取
    3、比较好的办法,全部用手工控制不出现重复记录一般情况下,控制方法主要有:
    1、尽量不使用DB控件,尤其是DBNavigate控件,通过ADO的时候那玩意实在太弱智;
    2、多数数据控制可以通过键值控制或者通过触发器控制!
      

  3.   

    首先谢谢楼上兄弟的解答!对于触发器,我其实写了两个,分别为UPDATE和INSERT,因为它们处理时差不多都是一样的,唯一的区别是把select @spcode=sp_Code,@detcode=det_code from deleted改成了select @spcode=sp_Code,@detcode=det_code from inserted,所以我上面就只列一个触发器的代码.
    另外呢,我想各位兄弟还是没有看到我写的.在写这贴之前我搜索了以前所有有关这类问题的旧贴子,并按别人的解答方式认真的检查过:试过取消唯一索引,试过adodataset.refresh和adodataset.close
    adodataset.open.
    都没有用.我认真检查过表中,没有重复的记录.我采用的是使用事务提交方式.
    但是问题总是存在.
    不得已才重新把这问题发贴出来.在这我说明下:
    1. 在我的表中绝对不存在重复的记录.
    2.我在表中已建了唯一索引.
    所以我在这只好还向各位高手问一句.是不是我的上面的触发器写错了?