成品库的先进先出算法

zj8092 2006-06-22 06:10:16
问题描述:
同一个产品在成品时分多次入库。出库时希望能按先进先出原则来实现(自动减分批入库数据)。

入库表的表结构:

名称 代号 工号 批次 入库数量 库存数据 入库时间
a1 ab ac p06 30 30 2006-5-12
a1 ab ac p06 50 50 2006-5-13
a1 abc ac p06 230 230 2006-5-13

目的:
在出库时候,出a1、ab、ac 数量40
入库结果是:
名称 代号 工号 批次 入库数量 库存数据 入库时间
a1 ab ac p06 30 0 2006-5-12
a1 ab ac p06 50 40 2006-5-13
a1 abc ac p06 230 230 2006-5-13
请大家帮忙
用存储过程怎么实现
谢谢
...全文
334 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LouisXIV 2006-06-22
  • 打赏
  • 举报
回复
如果有同一天内多批入库,需要唯一区分字段来代替min(入库时间)
LouisXIV 2006-06-22
  • 打赏
  • 举报
回复
if exists(select 1 from sysobjects where id=object_id('input') and xtype='U') drop table input
go
create table Input
(
名称 varchar(2),
代号 varchar(3),
工号 varchar(2),
批次 varchar(3),
入库数量 int,
库存数据 int,
入库时间 varchar(10)
)
insert into input
select 'a1','ab','ac','p06',30,30,'2006-05-12' union all
select 'a1','ab','ac','p06',50,50,'2006-05-13' union all
select 'a1','ab','ac','p06',50,50,'2006-05-14' union all
select 'a1','abc','ac','p06',230,230,'2006-05-13'

select * from input

declare @a varchar(2),@b varchar(3),@c varchar(2),@d int
select @a='a1',@b='ab',@c='ac',@d=100



declare @char1 varchar(10),@char2 int
select @char1=min(入库时间),@char2=min(库存数据)
from
(
select 入库时间,(select sum(库存数据) from input where 名称=a.名称 and 代号=a.代号 and 代号=a.代号 and 入库时间<=a.入库时间)as 库存数据
from input a
where 名称=@a and 代号=@b and 工号=@c
)a
where 库存数据>@d


update input
set 库存数据=0
where 入库时间<@char1
and 名称=@a and 代号=@b and 工号=@c

update input
set 库存数据=@char2-@d
where
入库时间=@char1 and 名称=@a and 代号=@b and 工号=@c

select * from input


drop table input

/*
名称 代号 工号 批次 入库数量 库存数据 入库时间
---- ---- ---- ---- ----------- ----------- ----------
a1 ab ac p06 30 30 2006-05-12
a1 ab ac p06 50 50 2006-05-13
a1 ab ac p06 50 50 2006-05-14
a1 abc ac p06 230 230 2006-05-13

名称 代号 工号 批次 入库数量 库存数据 入库时间
---- ---- ---- ---- ----------- ----------- ----------
a1 ab ac p06 30 0 2006-05-12
a1 ab ac p06 50 0 2006-05-13
a1 ab ac p06 50 30 2006-05-14
a1 abc ac p06 230 230 2006-05-13
*/
fcuandy 2006-06-22
  • 打赏
  • 举报
回复
DECLARE @tb TABLE(
名称 CHAR(10),
代号 CHAR(10),
工号 CHAR(10),
批次 CHAR(10),
入库数量 INT,
库存数据 INT,
入库时间 DATETIME)
INSERT @tb
SELECT 'a1', 'ab' , 'ac' , 'p06', 30 , 30, '2006-5-12'
UNION SELECT 'a1', 'ab' ,'ac' , 'p06' , 50 , 50 , '2006-5-13'
UNION SELECT 'a1', 'abc' , 'ac', 'p06' , 230, 230 , '2006-5-13'

SELECT * FROM @tb

DECLARE @i INT
SET @i=40 --出货数
DECLARE @dt DATETIME,@rk INT,@kc INT --再加上你那些其它的乱七八早的条件,什么工号,批次之类的,全留成参数,因为没主健,而入库时间又可能有重复值,所有信息才能确定一条记录
SELECT TOP 1 @dt=入库时间,@rk=入库数量,@kc=库存数据 FROM @tb a WHERE (SELECT SUM(入库数量) FROM @tb b WHERE b.入库时间<=a.入库时间)>@i
UPDATE @tb SET 入库数量=0 WHERE 入库时间<=@dt AND 入库数量<>@rk AND 库存数据<>@kc AND /*你的其它字段用来与上面所取的这条记录区别,中间全是<>*/ AND /*名称=.. AND 代号=...AND .. 用来确定是否你出货的种类,这里全是=*/

UPDATE @tb SET 入库数量=(SELECT SUM(入库数量) FROM @tb b WHERE b.入库时间<=入库时间)-@i WHERE 入库时间=@dt AND 入库数量=@rk /* AND ... 这里条件用来确定更新刚才上面取的那条TOP 1的记录*/


做法基本就是这样了。 我没有测试。
数据量不大的话,就写入临时表生成一个 IDENTITY值, 这样可以用来区别记录,操作方便多了。

不写临时表的话,就要多定义几个变量,以所有字段联合起来以确定唯一的一条记录,就如我上面写的这样。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧