日期:2014-05-16  浏览次数:20571 次

存储过程作业
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



-- 商品出货
-- 返回: -1  数据 overflow
ALTER PROCEDURE [dbo].[ap_PopPro]
@pro_id  int, --产品ID
@wh_id  int, --仓库号
@num  int     --出库数量

AS
BEGIN
declare
  @pos1  int, --起始位置
  @pos2  int, --可放位置
  @curPos  int, --当前位置
  @totNum  int, --总的数量
  @curNum  int , --当前位置的数量
  @curtotNum  int, --当前商品总数量
  @totPrice money,  --总的出货价
  @curPrice money   --当前批的出货价

declare
  @sqlCmd  nvarchar(200),
  @fldNum  varchar(10),
  @fldPrice varchar(10)
--初始化出货总价
    set @totPrice = 0 

--查找对应产品的记录
select @pos1 = pos1, @pos2 = pos2, @totNum = totNum
  from whproduct
  where pro_id = @pro_id and wh_id = @wh_id
   
if  @totNum < @num   --产品数量不够,刚退出
begin
  print 'The number of the product is not enough'
  return -1
end

laber1:
    set @fldNum = 'num' + Convert(varchar(2), @pos1)  --得到当前num字段
set @fldPrice = 'price' + Convert(varchar(2), @pos1)
set @sqlCmd = 'select ' + '@curNum ='+ @fldNum+ ' ,@curtotNum = totNum'
+ ',@curPrice='+@fldPrice +' from whproduct where pro_id = @pro_id and wh_id = @wh_id'
exec   sp_executesql   @sqlCmd,N'@curNum int output ,@curtotNum int output, @curPrice money output ,@pro_id int,@wh_id int',@curNum output ,@curtotNum output,@curPrice output,@pro_id,@wh_id

set @curPos = @pos1  --一开始的初始化curPos 与@pos1相等,用于后面价格是否需要置0做准备
if @curNum >=@num  --当前位置的商品数量大于或等于要求的数量时
begin
  set @curNum = @curNum - @num
  set @curtotNum = @curtotNum - @num
  set @totPrice = @totPrice + @curPrice*@num
  set @num = 0  --取出数量全总,所以设为0
 

  if @curNum = 0
   begin
    set @pos1 = @pos1 +1
   end
end
else    --当前位置的商品数量小于要求的数量时
  begin
   set @num = @num - @curNum
   set @totPrice = @totPrice + @curPrice*@curNum
   set @curtotNum = @curtotNum - @curNum
   set @curNum = 0
   set @pos1 = @pos1 + 1
  
  end

  if @curPos != @pos1  --当发现当前位置的商品都被取光的时候,该位置的进货价格清0
   begin
    set @fldPrice = 'price' + Convert(varchar(2), @curPos)
    set @sqlCmd = 'update whProduct set ' + @fldprice + ' = ' + Convert(varchar(10), 0)
    +' where  pro_id = @pro_id and wh_id = @wh_id'
    exec sp_executesql @sqlCmd, N'@wh_id int, @pro_id int', @wh_id, @pro_id
   end
 
  if @pos1 = @pos2   --当位置1到达位置2时,也就相当于仓库里面没货了,这时应该把@pos1返回
  begin
   set @pos1 = 1
   set @pos2 = 1
  end

  --当前位置被置0后,修改数据表中的值
 
  set @sqlCmd = 'update whProduct set pos1 = ' + Convert(varchar(2), @pos1) + ',pos2 = ' + Convert(varchar(2), @pos2) +', totNum =  '
   + Convert(varchar(5), @curtotNum)  +  ',' + @fldNum +'='+ Convert(varchar(5), @curNum)+
  ' where  pro_id = @pro_id and wh_id = @wh_id'
  exec sp_executesql @sqlCmd, N'@wh_id int, @pro_id int', @wh_id, @pro_id
 
      
  if @num != 0
  begin
   goto laber1  --如果需要的商品数量还没有得到,则回到前面部分,进而得到循环的目的
  end
 
  print '出货成功--'
  print '出货数量为:'
  print @totN