关于单价的执行日期的处理

来源:互联网 发布:岚锋创视网络 编辑:程序博客网 时间:2024/05/03 20:43

在单价管理的实际应用中,因单价变更后不会马上执行,会有一个正式开始执行日期,所以,在单价表需要添加一个执行日期的字段,在单价表中,同一编号的物品会存在一个以上的单价。业务单据业务单据发生时,要准确获取当时正在使用的单价信息(有效单价),就不能靠简单的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

 

原创粉丝点击