在单价管理的实际应用中,因单价变更后不会马上执行,会有一个正式开始执行日期,所以,在单价表需要添加一个执行日期的字段,在单价表中,同一编号的物品会存在一个以上的单价。业务单据业务单据发生时,要准确获取当时正在使用的单价信息(有效单价),就不能靠简单的SQL表连接来查询
思路:
根据业务单据的发生日期过滤出目前正在使用的单价,在SQL中的获取方法是使用MAX函数得到某个编号物品的最接近业务单据日期的执行开始日单价
分析:
1、如果只查一张单据所包含物品的单价,处理起来就比较简单。假设有单据表(编号,数量,日期)和单价表(编号,单价,执行日期),实现如下:
select 单据表.编号,单价.单价 from 单据表 join (select a.编号,a.单价 from 单价表 a join
(select 编号,max(执行日期) as 执行日期 from 单价表 where 执行日期<'2008-10-1' group by 编号) b
on a.编号=b.编号 and a.执行日期=b.执行日期 ) as 单价
on 单据表.编号=单价.编号
以上代码是查询某一日期正在使用的单价列表,日期可以通过程序传入
2、以上代码可以查询某一张单据的使用单价,但是有时候要对历史单据进行汇总分析,就需要查多张单据的当时使用单价,采用以上的方法就无效了。可以使用游标的方法,逐条记录处理,再把结果插入新表中,实现代码如下
declare @NO char(10)
declare @qty numeric(18,3)
declare @d smalldatetime
declare cur1 cursor for
select 编号,数量,日期 from 库存量
open cur1
fetch next from cur1 into @NO,@QTY,@D
while (@@fetch_status=0)
begin
insert into #temp1(编号,数量,单价,日期)
select a.编号,数量=@QTY,a.单价,@D from 单价表 a join
(select 编号,max(执行日期) as 执行日期 from 单价表 where 执行日期<@d group by 编号) as b
on (a.编号=b.编号 and a.执行日期=b.执行日期) where a.编号=@NO
fetch next from cur1 into @NO,@QTY,@D
end
close cur1
deallocate cur1