--
库存先进先出简单例子:
create
table
t(
id
int
identity
(
1
,
1
),
name
varchar
(
50
),
--
商品名称
j
int
,
--
入库数量
c
int
,
--
出库数量
jdate
datetime
--
入库时间
)
insert
into
t(name,j,c,jdate)
select
'
A
'
,
100
,
0
,
'
2007-12-01
'
insert
into
t(name,j,c,jdate)
select
'
A
'
,
200
,
0
,
'
2008-01-07
'
insert
into
t(name,j,c,jdate)
select
'
B
'
,
320
,
0
,
'
2007-12-21
'
insert
into
t(name,j,c,jdate)
select
'
A
'
,
100
,
0
,
'
2008-01-15
'
insert
into
t(name,j,c,jdate)
select
'
B
'
,
90
,
0
,
'
2008-02-03
'
insert
into
t(name,j,c,jdate)
select
'
A
'
,
460
,
0
,
'
2008-02-01
'
insert
into
t(name,j,c,jdate)
select
'
A
'
,
510
,
0
,
'
2008-03-01
'
go
create
proc
wsp
@name
varchar
(
50
),
--
商品名称
@cost
int
--
销售量
as
--
先得出该货物的库存是否够
declare
@spare
float
--
剩余库存
select
@spare
=
sum
(j)
-
sum
(c)
from
t
where
name
=
@name
if
(
@spare
>=
@cost
)
begin
--
根据入库日期采用先进先出原则对货物的库存进行处理
update
t
set
c
=
case
when
(
select
@cost
-
isnull
(
sum
(j),
0
)
+
isnull
(
sum
(c),
0
)
from
t
where
name
=
@name
and
jdate
<=
a.jdate
and
j
!=
c)
>=
0
then
a.j
else
case
when
(
select
@cost
-
isnull
(
sum
(j),
0
)
+
isnull
(
sum
(c),
0
)
from
t
where
name
=
@name
and
jdate
<
a.jdate
and
j
!=
c)
<
0
then
0
else
(
select
@cost
-
isnull
(
sum
(j),
0
)
+
isnull
(
sum
(c),
0
)
+
a.c
from
t
where
name
=
@name
and
jdate
<
a.jdate
and
j
!=
c)
end
end
from
t a
where
name
=
@name
and
j
!=
c
end
else
raiserror
(
'
库存不足
'
,
16
,
1
)
return
go
--
测试:
exec
wsp
@name
=
'
A
'
,
@cost
=
180
select
*
from
t
--
drop table t
--
drop proc wsp