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 --出庫數量
asbegin
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
endlaber1:
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
endend
else --當前位置的商品數量小於要求的數量時
begin
set @num = @num - @curnum
set @totprice = @totprice + @curprice*@curnum
set @curtotnum = @curtotnum - @curnum
set @curnum = 0
set @pos1 = @pos1 + 1
endif @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
endif @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 --如果需要的商品數量還沒有得到,則回到前面部分,進而得到迴圈的目的
endprint '出貨成功--'
print '出貨數量為:'
print @totnum - @curtotnum
print '出貨總價為:'
print @totprice
end
建立作業的通用儲存過程
if exists select from dbo.sysobjects where id object id n dbo p jobset and objectproperty id,n isprocedure 1 drop procedure dbo p jobset go 定時呼叫儲存過程 建...
建立作業的通用儲存過程
if exists select from dbo.sysobjects where id object id n dbo p jobset and objectproperty id,n isprocedure 1 drop procedure dbo p jobset go 定時呼叫儲存過程 建...
建立作業的通用儲存過程
if exists select from dbo.sysobjects where id object id n dbo p jobset and objectproperty id,n isprocedure 1 drop procedure dbo p jobset go 定時呼叫儲存過程 建...