日期:2014-05-16  浏览次数:20785 次

写一算法思路
如果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      出  &nb