会计信息系统——SQL server 分类逐级汇总程序,实现过账

--明细科目的借方发生额合计数填入汇总表
update 汇总数据表 set 本期借方发生额合计=
(select SUM(借方金额) from 凭证表 group by 科目代码 having 汇总数据表.科目代码=凭证表.科目代码)
where 科目代码 in (select distinct 科目代码 from 凭证表 where 借方金额 is not null);

--明细科目的贷方发生额合计数填入汇总表
update 汇总数据表 set 本期贷方发生额合计=
(select SUM(贷方金额) from 凭证表 group by 科目代码 having 汇总数据表.科目代码=凭证表.科目代码)
where 科目代码 in (select distinct 科目代码 from 凭证表 where 贷方金额 is not null);

--由明细科目数据逐级汇总得到其上级、上上级……一直到总分类科目
declare 
@hz_kemu float,
@hz_j float,
@hz_d float,
@count int;
set @count=(select MAX(级次) from 科目表); --汇总的级数,从末级科目开始一级一级往上汇总

while @count>=2  --外层循环
begin

	declare hz_cursor cursor for 
	select floor(科目代码/100),sum(本期借方发生额合计),sum(本期贷方发生额合计)
	from 汇总数据表 group by floor(科目代码/100) 
	having floor(科目代码/100)>=power(10,2*@count-1);
	--声明游标,对查询结果的每一条记录执行下面的语句块(内层循环)

	open hz_cursor;
	fetch next from hz_cursor into @hz_kemu,@hz_j,@hz_d;
	while @@FETCH_STATUS=0
	begin
		update 汇总数据表 set 本期借方发生额合计=@hz_j where 科目代码=@hz_kemu;
		update 汇总数据表 set 本期贷方发生额合计=@hz_d where 科目代码=@hz_kemu;
		
		fetch next from hz_cursor into @hz_kemu,@hz_j,@hz_d;
	end;
	close hz_cursor;
	deallocate hz_cursor;

	set @count=@count -1;  --这一级次的汇总完成,调整变量值,继续上一级的汇总
end;

科目表:

 

凭证表:

 

汇总数据表:


注:数据汇总表的期初数据由上期的期末数据导入得到,本期发生数据通过上面的逐句汇总程序得到,期末数据由期初数据和本期发生数据计算得到(触发器实现,代码如下)

after insert, update
as
begin
	update 汇总数据表 set 期末借方余额=期初借方余额-期初贷方余额+本期借方发生额合计-本期贷方发生额合计;
	update 汇总数据表 set 期末贷方余额=期末借方余额*(-1) where 期末借方余额<0;
	update 汇总数据表 set 期末借方余额=0 where 期末借方余额<0;	
	update 汇总数据表 set 期末贷方余额=0 where 期末贷方余额 is null;
end;

 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值