--明细科目的借方发生额合计数填入汇总表
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;
更多推荐
会计信息系统——SQL server 分类逐级汇总程序,实现过账
发布评论