利用游标进行简单的数据先进先出操作

来源:互联网 发布:粒子群聚类算法matlab 编辑:程序博客网 时间:2024/05/16 00:28

创建数据库


 

 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  --释放资源

原创粉丝点击