创建数据库
if exists (select * from sysobjects where id = OBJECT_ID('[入库信息]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) DROP TABLE [入库信息]
CREATE TABLE [入库信息] ( [名称] [varchar] (40) NULL , [规格型号] [varchar] (40) NULL , [入库数量] [int] NULL , [出库数量] [int] NULL , [库存数量] [int] NULL , [入库时间] [datetime] NULL )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '内存1' , 'PC530' , 520 , 0 , 520 , '2010-02-10 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '内存1' , 'PC100' , 100 , 0 , 10 , '2010-02-02 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '内存' , 'PC100' , 20 , 0 , 20 , '2010-10-01 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '内存' , 'PC200' , 50 , 0 , 50 , '2010-10-02 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '内存' , 'PC200' , 80 , 0 , 80 , '2010-10-04 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '内存' , 'DDR2' , 82 , 0 , 82 , '2010-10-03 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '主板' , 'P43' , 532 , 0 , 532 , '2010-08-09 00:00:00.000' )
INSERT [入库信息] ( [名称] , [规格型号] , [入库数量] , [出库数量] , [库存数量] , [入库时间] ) VALUES ( '主板' , 'P35' , 84 , 0 , 84 , '2010-10-25 00:00:00.000' )
代码
--利用游标对数据进行先进先出
--按时间排序库存物资,逐条记录进行出库,当前行库存不够对下一行库存进行出库,直到出库完成
use temp
Declare @入库时间 DateTime
Declare @名称 varchar(40)
Declare @入库数量 int
declare @库存数量 int
declare @出库数量 int
Declare @i int --定义出库数量变量,传入的参数
set @i=82 --设置传入的出库数量
Declare cur_Depart Cursor For --定义游标
Select [名称] , [入库时间] ,[入库数量] ,[库存数量] , [出库数量] from 入库信息 Where 名称 = '内存' and 库存数量 <> 0 Order by 入库时间 desc
Open cur_Depart --创建游标
Fetch From cur_Depart into @名称 , @入库时间 , @入库数量 , @库存数量 ,@出库数量
While @@Fetch_Status = 0 --循环读取
Begin
--判断是否已经出库完成或出库数量是否为0
if @i > 0
begin
if @库存数量 >=@i --如果当前记录的库存大于或等于要出库数量则执行
begin
update 入库信息 set 库存数量 = 库存数量 - @i where 入库时间 = @入库时间
update 入库信息 set 出库数量 = 出库数量 + @i where 入库时间 = @入库时间
set @i = 0
end
if @库存数量 < @i and @库存数量 <> 0 --如果当前记录库存如果小于或等于要出库数量则执行
begin
update 入库信息 set 库存数量 = 0 Where 入库时间 = @入库时间
update 入库信息 set 出库数量 = 出库数量 + @库存数量 where 入库时间 = @入库时间
set @i = @i - @库存数量
end
end
Fetch From cur_Depart into @名称 , @入库时间 , @入库数量 , @库存数量 , @出库数量 --下一条记录
End
Close cur_Depart --关闭游标
Deallocate cur_Depart --释放资源