如有数据库: 产品编号  数量    单位
             001     100       aa
             001     100       bb
             002     200       cc
             003     300       dd
             003     300       ee  
当产品编号为001的任一个产品数量由100改为20时,另一个编号为001的产品数量自动变为100-20=80.
003号产品一样任一个003号的产品比如由300改为150,另一个编号为003的产品数量自动变为300-150=150.能否用触发器实现?
不同单位的同一种产品共同享用数量.

解决方案 »

  1.   

    用触发器好像不太好实现吧
    CREATE PROCEDURE update_tb
    @unit VARCHAR(10),
    @num INT
    AS
    BEGIN
      UPDATE tb5 SET 数量=@num WHERE 单位=@unit
      UPDATE tb5 SET 数量=数量-@num WHERE 单位 NOT IN (SELECT 单位 FROM tb5 WHERE 单位=@unit)
      AND 产品编号 IN (SELECT 产品编号 FROM tb5 WHERE 单位=@unit)
    ENDGO
    EXEC update_tb 'aa',20
      

  2.   

    >>不同单位的同一种产品共同享用数量  想了一下,还是有点问题。如果共享同一种产品的单位>2家,而且可以无限制的更新那上面的存储过程就完全没有意义了。
      考虑中...
      

  3.   

    你的数据库表有问题,应用加入一个唯一标识字段,否则在做触发器修改时,回出现条件无法确定的问题,加上唯一标识字段后,可用触发器来实现,在SQL Server中修改后的记录值是存在一叫做inserted全局临时表中,可利用游标中从中取出修改记录的唯一标识和产品编号以及修改后的数量值,然后利用如下语句做更新就可以了:
    update 表名 set  数量=数量-改变值 where 产品编号='产品编号'and not (标识='更新字段的标识'),就ok了
    游标及触发器的写法可参考sql server2000查询分析器中的帮助,另游标使用完成以后不忘记关闭、释放。
      

  4.   

    create or replace trigger updateNumber
      before insert or update or delete on aTableName  
      for each row
    declare
      l_UpdateNumber  number;
    begin
      l_UpdateNumber := :old.Field - :new.Field ; 
      insert into bTableName(xxx,yyy,zzz,......) 
         values(l_UpdateNumber,......);
    end updateNumber;
    大体上就是这样写的,你自己按需要改一下就行了。
      

  5.   

    TO: li_job() ( )   请教这个触发器如何写呢??
      

  6.   

    现以表product为例,其结构如下:
    FlowId     ProductId      ProductAmount    Dept
    1          001            100              aa
    2          002            100              bb
    3          003            200              cc
    4          004            300              dd
    5          005            300              ee
    其中FlowId为自增1字段,是表的主键
    触发器如下:
    create trigger updateAmount on product 
    for update
    asdeclare @FlowId int
    declare @ProductId varchar(12)
    declare @UpdateAmount numeric(18,2)
    declare updateCur cursor for 
    select FlowId,ProductId,ProductAmount from inserted
    open updateCur
    fetch next from updateCur into @FlowId,@ProductId,@UpdateAmount
    while @@Fetch_status = 0
    begin
      update product set ProductAmount=ProductAmount-@UpdateAmount
      where ProductId=@ProductId and not(FlowId=@FlowId)
      fetch next from updateCur into @FlowId,@ProductId,@UpdateAmount
    end
    close updateCur
    deallocate updateCur