一、表结构
表A(零件库)
零件编号  库存量
A7788250    12
B7788250 10
C7788250 15表B:(库存调整)
ID 调整单号 零件编号 调整数量
表C:(零件变动)
ID   DH   零件编号    数量    日期      种类二、要进行的操作
新开一张库存调整单,数据如下
ID      调整单号         零件编号      调整数量
1       DT081120001      A7788250      2
2       DT081120001      C7788250      -6要求根据库存调整单[DT081120001]中的内容,对零件库进行更新,并将本次调整内容写入[零件变动]表三、操作后结果如下:
表A(零件库)
--------------------------------------------------
零件编号       库存量
A7788250       14
B7788250       10
C7788250       9表C:(零件变动)
-----------------------------------------------------------------------------------
ID      DH           零件编号   数量     日期       种类
1       DT081120001  A7788250   2        getdate()  调库
2       DT081120001  C7788250   -6       getdate()  调库
四、要求:不能使用游标

解决方案 »

  1.   

    create table #a(零件编号 varchar(50),库存量 int)
    insert #a
    select 'A7788250', 12 union all
    select 'B7788250', 10 union all
    select 'C7788250', 15 create table #b(ID int,调整单号 varchar(50),零件编号 varchar(50),调整数量 int)
    insert #b
    select 1,      'DT081120001',      'A7788250',      2  union all
    select 2,      'DT081120001',      'C7788250',      -6 --表A(零件库)
    update #a  
    set 库存量=库存量+(select sum(调整数量) from #b  where 零件编号=a.零件编号 and 调整单号='DT081120001')
    from #a a,#b b
    where a.零件编号=b.零件编号
    and b.调整单号='DT081120001'select * from #a
    /**
    零件编号                                               库存量         
    -------------------------------------------------- ----------- 
    A7788250                                           14
    B7788250                                           10
    C7788250                                           9
    **/
    select ID,调整单号 as DH,零件编号,调整数量 as 数量,getdate() as 日期,'调库' as 种类 into #c from #bselect * from #c
    /**
    ID          DH                                                 零件编号                                               数量          日期                                                     种类   
    ----------- -------------------------------------------------- -------------------------------------------------- ----------- ------------------------------------------------------ ---- 
    1           DT081120001                                        A7788250                                           2           2008-11-21 22:27:37.293                                调库
    2           DT081120001                                        C7788250                                           -6          2008-11-21 22:27:37.293                                调库
    **/
      

  2.   


    --表A(零件库)
    update #a  
    set 库存量=库存量+(select sum(调整数量) from #b  where 零件编号=a.零件编号 and 调整单号=b.调整单号)
    from #a a,#b b
    where a.零件编号=b.零件编号
    and b.调整单号='DT081120001'
      

  3.   

    create proc tzkc(@tzdh char(50))
    as
    select 零件编号,原库存量=库存量,tzsl=0,xkcsl=0  into #tmp from a --生成临时表update #tmp
    set tzsl=tz.调整数量
    from #tmp kc,b tz
    where kc.零件编号=tz.零件编号 and tz.调整单号=@tzdh --更新临时表调整数量update #tmp
    set xkcsl=原库存量+tzsl  --更新临时表新库存update a
    set 库存量=t.xkcsl
    from a kc,#tmp t
    where kc.零件编号=t.零件编号  --回写到A表中insert into c
    select ID,调整单号 as DH,零件编号,调整数量 as 数量,getdate() as 日期,'调库' as 种类  from b where 调整单号=@tzdh
    --更新变动纪录
    --结束存储过程
      

  4.   

    我的想法:DECLARE
    @DH char(11)SELECT @DH='DT081120001'BEGIN TRANSACTION
      UPDATE 零件库 
      SET 库存量=库存量+库存调整.调整数量
      FROM 零件库 INNER JOIN 库存调整 ON 零件库.零件编号=库存调整.零件编号
      WHERE 库存调整.DH=@DH  INSERT 零件变动(DH,零件编号,数量,日期,种类)
      SELECT DH,零件编号,调整数量,GETDATE(),'调库'
      FROM 库存调整
      WHERE DH=@DHCOMMIT TRANSACTIONIF @@ERROR<>0
    BEGIN
      ROLLBACK TRANSACTION
      RAISERROR('%s库存调整出错,操作被取消。',16,1,@DH)
    END