如果3月1号入库4000件,然后3月15号出库2000件。
只要库存>0,我可以随意改日期 。即3月1号可改为1号到15号中任意一个日期 。
但改为16号报错。
例:3月1号改为3月14号 4000-2000 >0 OK 可以更改
3月1号改为3月15号 4000-2000>0 OK 可以更改
3月1号改为3月16号 时,15号没法出库报错。
这个怎么写SQL。
------解决方案--------------------
-- 建测试表
create table ly(nid int identity(1,1),ndate varchar(15),ntype varchar(10),nqty int)
-- 建触发器
create trigger tr_ly on ly
for update
as
begin
if update(ndate)
begin
select row_number() over(order by cast(ndate as datetime)) 'rn',ntype,nqty
into #t
from ly
if exists(
select 1 from #t t
where (select sum(case u.ntype
when '入' then u.nqty
when '出' then -1*u.nqty
else 0 end) 'inv'
from #t u
where u.rn<=t.rn)<0
)
begin
print '库存<0,不能调整.'
rollback tran
end
end
end
-- 测试1
truncate table ly
insert into ly(ndate,ntype,nqty)
select '2014-03-01','入',4000 union all
select '2014-03-15','出',2000
-- 3月1号改为3月14号 4000-2000 >0 OK 可以更改
update ly set ndate='2014-03-14' where nid=1
select * from ly
/*
nid ndate ntype nqty
----------- --------------- ---------- -----------
1 2014-03-14 入 4000
2 2014-03-15 出 2000
(2 row(s) affected)
*/
-- 3月1号改为3月15号 4000-2000>0 OK 可以更改
update ly set ndate='2014-03-15' where nid=1
select * from ly
/*
nid ndate ntype nqty
----------- --------------- ---------- -----------
1 2014-03-15 入 4000
2 2014-03-15 出 2000
(2 row(s) affected)
*/
-- 3月1号改为3月16号 时,15号没法出库报错
update ly set ndate='2014-03-16' where nid=1
/*
(2 row(s) affected)
库存<0,不能调整.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/
select * from ly
/*
nid ndate ntype nqty
----------- --------------- ---------- -----------
1 2014-03-15 入 4000
2 2014-03-15 出 2000
(2 row(s) affected)
*/
-- 测试2
truncate table ly
insert into ly(ndate,ntype,nqty)
select '2014-03-01','入',4000 union all
select '2014-03-15','出',2000 union all
select '2014-03-16','入',1000 union all
select '2014-03-17','出',3000
-- 若把1号入的4000调到15号后都报错。
update ly set ndate='2014-03-16' where nid=1
/*
(4 row(s) affected)
库存<0,不能调整.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/
select * from ly
/*
nid ndate ntype nqty