我有tab1 产品表,表字段有id,phid,grade,number1等字段;tab2 入库表,表字段有id,phid,whid,grade,number1,number2 等字段;tab3 产品库存表,表字段有id,phid,whid,grade,number1,number2 等字段。这3张表的结构是这样的,现在的需求是这样的,如果产品A,它的等级是A级,在A库区入库这种产品10个时 ,他的等级A不变,产品库存表tab3也有A库区的等级A的产品A的20个,那么这个产品数量是10+20=30个。如果产品,等级,或库区不同,则新插入一条新的记录。这个需求要用存储过程怎么做?   

解决方案 »

  1.   

    这个应该是业务上的吧。在入库表tab2(应该是一个入库单的样子) 这个状态修改成入库(完成)时,更新产品表 tab3,可以用触发器,也可以直接写sql.
      

  2.   

       我的做法是这样的:
          首先 select a.phid,a.grade,a.number1,number2 into #t from  tab2 left join tab1 on a.phid = b.phid 
         其次
        select b.phid,a.grade,a.number1,number2 into #w from  tab2 left join tab3 on a.phid = b.phid and a.whid = b.whid
         接着
          select @phid =a.phid,@grade=a.grade,@number1=a.number1,@number2=number2 from #t   
       select @phid2 =a.phid,@grade2=a.grade,@number1_1=a.number1,@number2_2=number2 from #2 
         然后
          while  @phid = @phid2 and @grade=@grade2       最后  
        update tab3 set number1=convert(int,@number1)+convert(int,@number1_1) where whid=@whid  
        
         我是这样做的,但是到 while  @phid = @phid2 and @grade=@grade2  循环表字段判断phid ,grade 是否相等时,会有错误。
       
      

  3.   

    在数据库操作做两步:(触发器为例)create trigger up_kucun on ruku
    for insert
    as--第一:修改库存表存在的数据,类似update a
    set a.cnt = a.cnt + b.cnt
    from kucun a join (select code,sum(cnt) cnt from inserted group by code) b 
      on a.code = b.code--第二:插入库存表不存在的codeinsert into kucun
    select code,sum(cnt) 
    from inserted
    group by code当然,这是个比较简单的解决思想,楼主可以引申下。
      

  4.   

    不知道楼主表中各字段是什么意思,自己照样大致写了一个存储过程,供参考:
    create procedure insertporcedure
    (@kq nvarchar(10),  --库区
    @cpid int,    --产品编号
    @dj nvarchar(10),  --等级
    @sl int  --数量
    --可以加其他参数
    )
    as
    begin
    if exists(select 1 from 产品库存表 where 产品编号=@cpid and 库区=@kq and 等级=@dj)
    update 产品库存表 set 数量=数量+@sl where  产品编号=@cpid and 库区=@kq and 等级=@dj
    else
    insert into 产品库存表(产品编号,库区,等级,数量) select @cpid,@kq,@dj,@sl)
    end
      

  5.   

    额。第二步还要加个条件,是:insert into kucun
    select code,sum(cnt)  
    from inserted t
    where not exists (select 1 from kucun where code = t.code)
    group by code
      

  6.   

    1、插入入库表
    insert into tab2(phid,whid,grade,number1,number2) values (@phid,@whid,@grade,@number1,@number2)
    2、修改库存表
    update tab3 set 
      number1 = isnull(number1,0) + @number1
      ,number2 = isnull(number2,0) + @number2
    where phid = @phid
    and whid = @whid
    and grade = @grade3、如果修改记录条数0(没有重复的)
    if @@rowcount <=0
    4、 插入库存表
    insert into tab3(phid,whid,grade,number1,number2) values (@phid,@whid,@grade,@number1,@number2)连接条件没说清楚,可能有些问题
      

  7.   


    “if exists(select 1 from 产品库存表 where 产品编号=@cpid and 库区=@kq and 等级=@dj)
        update 产品库存表 set 数量=数量+@sl where  产品编号=@cpid and 库区=@kq and 等级=@dj”
    这样只能Update一条库存表的记录,如果有2个以上产品id,等级id,库区id一样的话,这样是不行的。
      

  8.   

       
      
      这2个表,phid,whid,grade 都相等,我用 while phid=phid2 and grade=grade2 and whid=whid2 
      只能更新1条记录,而且在这个记录上累加,怎么会这样?要怎么做呢?? 
      

  9.   

            这个就是结果集呀,最上面的那个表是库存表tab3,中间是入库表tab2,最下面的是产品表tab1.
       字段说明:
          phid - 产品id;whid - 库区id ; grade - 产品等级id;  number - 产品数量   
      

  10.   

    最后用临时表+GROUP BY 搞定了。