一、现实需求
我市行政事业单位财务核算数据存储在财政部门3.0系统服务器上,可一次性采集所有单位财务核算数据,采集的数据为ORACLE数据库备份数据。数据采集后,将其导入AO系统是较为复杂而又需多次重复的过程,方法有多种多样,笔者经过多次偿试,探索出一种简洁易行的导入方法,通过ODBC(开放数据库互连功能)将ORACLE数据库财务数据迁移到SQL SERVER 2008,在SQL SERVER 2008数据中库找到需要的表并通过编辑SQL存储过程语句将数据导入AO2011进行账表重建。
二、技术方法
(1)首先通过PLSQL Developer 恢复ORACLE数据。以SYSTEME用户登录,创建名为“DWZW”的表空间,然后创建一个用户“DWZW2018”,最后授予足够的权限(DBA角色)。
(2)通过Oracle imp语句,imp DWZW2018/DWZW2018@ORCL file=D:\dwzw2018.dmp log=D:\dwzw2018.log full=y statistics=none ignore=y将被审计单位的备份文件还原到oracle数据库中。
(3)在SQL2008中建立数据库:财务数据2018
(4)右键点击财务数据2018数据库,任务——导入数据——数据源--导入,图例如下:
数据源选择.Net Framework Date Provider for Oracle
UserId :system Password : orcl
(5)通过对导入的表进行分析,提取出对我们有用的表,因为该数据是多单位多年度的财务数据,其中:BOOK_SET表存储不同单位的账套号。导入我们需要的表:ACCOUNTANT_SUBJECT(科目表), REMAIN(余额表),GL_VOUCHER(凭证主表),GL_VOUCHER_DETAIL(凭证子表)等。
二)数据处理
在SQL2008中 ,编写语句对导入的表进行处理。
创建数据采集存储过程,定义存储过程名为sjql,其SQL语句如下:
---创建存储过程
create proc sjql
@set_code nvarchar(42),@a numeric(1,0),@b numeric(1,0),@c numeric(1,0),@d numeric(1,0)
asbegin
drop table a_kmb,a_yeb,a_pzb,a_fzpzb,a_fzyeb,a_fzxxb
---生成会计科目表(a_kmb)
select SET_Code as 帐套号, IN_CODE as 科目编码, DISP_NAME as 科目名称 ,IS_DEBIT as 科目方向 into a_kmb
from dbo.ACCOUNTANT_SUBJECT where SET_Code like @SET_Code
order by IN_CODE
---生成科目余额表
select SET_Code as 帐套号,convert(varchar(10),SET_YEAR) as 会计年度, AS_CODE as 科目编码 ,SUM(BALANCE) as 科目余额, 余额方向=case when left(AS_CODE,1)=1 OR left(AS_CODE,1)=5 then 1 else 0 end into a_yeb
from dbo.REMAIN where SET_Code like @SET_Code
group by SET_Code, convert(varchar(10), SET_YEAR) , AS_CODE
union all
select SET_Code as 帐套号 ,convert(varchar(10),SET_YEAR) as 会计年度, substring(AS_CODE,1,@a) as 科目编码, SUM(BALANCE) as 科目余额, 余额方向=case when left(substring(AS_CODE,1,@a),1)=1 OR left(substring(AS_CODE,1,@a),1)=5 then 1 else 0 end
from dbo.REMAIN
where SET_Code like @SET_Code and len(AS_CODE)>@a
group by SET_Code, convert(varchar(10),SET_YEAR) , substring(AS_CODE,1,@a)
union all
select SET_Code as 帐套号 ,convert(varchar(10),SET_YEAR) as 会计年度, substring(AS_CODE,1,@a+@b) as 科目编码, SUM(BALANCE) as 科目余额, 余额方向=case when left(substring(AS_CODE,1,@a+@b),1)=1 OR left(substring(AS_CODE,1,@a+@b),1)=5 then 1 else 0 end
from dbo.REMAIN
where SET_Code like @SET_Code and len(AS_CODE)>@a+@b
group by SET_Code, convert(varchar(10),SET_YEAR) , substring(AS_CODE,1,@a+@b)
union all
select SET_Code as 帐套号 ,convert(varchar(10),SET_YEAR) as 会计年度, substring(AS_CODE,1,@a+@b+@c) as 科目编码, SUM(BALANCE) as 科目余额, 余额方向=case when left(substring(AS_CODE,1,@a+@b+@c),1)=1 OR left(substring(AS_CODE,1,@a+@b+@c),1)=5 then 1 else 0 end
from dbo.REMAIN
where SET_Code like @SET_Code and len(AS_CODE)>@a+@b+@c
group by SET_Code, convert(varchar(10),SET_YEAR) , substring(AS_CODE,1,@a+@b+@c)
union all
select SET_Code as 帐套号 ,convert(varchar(10),SET_YEAR) as 会计年度, substring(AS_CODE,1,@a+@b+@c+@d) as 科目编码, SUM(BALANCE) as 科目余额, 余额方向=case when left(substring(AS_CODE,1,@a+@b+@c+@d),1)=1 OR left(substring(AS_CODE,1,@a+@b+@c+@d),1)=5 then 1 else 0 end
from dbo.REMAIN
where SET_Code like @SET_Code and len(AS_CODE)>@a+@b+@c+@d
group by SET_Code, convert(varchar(10),SET_YEAR) , substring(AS_CODE,1,@a+@b+@c+@d)
---生成辅助科目余额表
select SET_Code as 帐套号,convert(varchar(10),SET_YEAR) as 会计年度, AS_CODE as 科目编码, '往来分类' as 辅助核算类型, '往来' as 辅助名称, CR_CODE as 辅助核算编码, BALANCE as 辅助核算余额,余额方向=case when left(AS_CODE,1)=1 OR left(AS_CODE,1)=5 then 1 else 0 end
into a_fzyeb
from dbo.REMAIN
where SET_Code like @SET_Code and CR_CODE is not null
---生成凭证主表
select a.SET_Code 帐套号,convert(varchar(10),a.VOUCHER_ID) as 源凭证关联号,
convert(varchar(10),a.VOUCHER_NO) as 凭证号,
convert(varchar(10),a.DEFINE_ID) as 凭证类型 ,
convert(char(4), a.SET_YEAR) as 会计年度,
convert(char(2),a.V_MONTH) as 会计月份,
convert(char(2), a.V_DAY) as 会计日,
a.BILLS as 附件数,
a.MAKER_CODE as 制单人,
a.AUDITOR_CODE as 审核人,
a.KEEPER_CODE as 记账人,
a.MANAGER_CODE as 会计主管,
a.STATUS as 凭证状态,
convert(varchar(10),b.V_LINE ) as 行号,
convert(varchar(10),b.SORT_LINE) as 顺序号,
b.SUMMARY as 摘要,
b.AS_CODE as 科目编码,
b.DEB_MONEY as 借方发生额,
b.CRE_MONEY as 贷方发生额,
b.dataflag as 删除标志
into a_pzb
from dbo.VOUCHER as a inner join dbo.VOUCHER_DETAIL as b on a.SET_Code=b.SET_Code and a.VOUCHER_ID=b.VOUCHER_ID
where a.SET_Code like @SET_Code
---生成凭证辅助明细表
select a.SET_Code 帐套号,
convert(varchar(10),a.VOUCHER_ID) as 源凭证关联号,convert(varchar(10),a.VOUCHER_NO) as 凭证号,convert(varchar(10),a.DEFINE_ID) as 凭证类型 , convert(char(4), a.SET_YEAR) as 会计年度, convert(char(2),a.V_MONTH) as 会计月份,convert(char(2), a.V_DAY) as 会计日,a.BILLS as 附件数, a.MAKER_CODE as 制单人, a.AUDITOR_CODE as 审核人,a.KEEPER_CODE as 记账人,a.MANAGER_CODE as 会计主管,a.STATUS as 凭证状态,convert(varchar(10),b.V_LINE ) as 行号,
convert(varchar(10),b.SORT_LINE) as 顺序号, b.SUMMARY as 摘要,b.AS_CODE as 科目编码,
b.bS_CODE as 功能分类编码, b.BSI_CODE as 经济分类编码,b.CR_CODE as 往来分类编码,b.OTH_CODE as 自定义分类编码,b.DEB_MONEY as 借方发生额,b.dataflag as 删除标志 into a_fzpzb
from dbo.VOUCHER as a inner join dbo.VOUCHER_DETAIL as b on a.SET_Code=b.SET_Code and a.VOUCHER_ID=b.VOUCHER_ID
where a.SET_Code like @SET_Code
---生成辅助信息表
select '经济分类' as 辅助核算类型,IN_CODE as 辅助核算编码, DISP_NAME as 辅助核算名称
into a_fzxxb
from dbo.BUDGET_SUBJECT_ITEM where SET_Code like @SET_Code
union
select '功能分类' as 辅助核算类型, IN_CODE as辅助核算编码,DISP_NAME as辅助核算名称
from dbo.BUDGET_SUBJECT
union
select '往来分类' as 辅助核算类型, IN_CODE as 辅助核算编码, DISP_NAME as辅助核算名称
from dbo.CURRENTS where SET_Code like @SET_Code
union
select '自定分类' as 辅助核算类型,IN_CODE as 辅助核算编码, DISP_NAME as 辅助核算名称
from dbo.OTHER where SET_Code like @SET_Code
end
(三)数据分析应用
建立存储过程中共涉及到@set_code、@a、@b、@c 和@d 五个参数。
如何执行存储过程中如何获取脚本中的五个参数
这五个参数值需要从有关审计表中进行查询。
@set_code 参数的获取方式
语句 select * from BOOK_SET 查询结果如下:
例如,需要导入黄石市机关事务管理局的账套,则 set_code 为‘240001001’。
@a,@b,@c,@d 参数的获取方式
语句 select distinct LEN(in_code) from
ACCOUNTANT_SUBJECT where SET_Code ='240001001' order
by 1 asc
注:红色的240001001可更改,根据@set_code变量的值进行确定。
查询结果如下:
可以得知该单位会计科目级次为 4-4-4-4,则@a=4,@b=4,@c=4,@d=4
提示:本语句对科目级次设置了四个变量,当科目级次小于 4的时候,后面的参数自动为 0 即可,确定上述五个参数的值之后,可先运行创建存储过程的语句。
--执行存储过程
exec sjql '240001001','4','4','4','4'
执行后生成a_fzpzb 辅助凭证表 、a_fzyeb辅助余额表、a_kmb科目表、a_pzb凭证表、a_yeb余额表 五张表生成完毕,通过AO2011数据采集辅助导入,将五张表导入到AO2011中。
数据采集转换过程
选择数据源SQL SERVER ,身份验证WINDOWS,测试连接成功\
选择我们需要导入的表
数据采集完成导入后建立财政财务数据采集模板
帐表重建查看余额表,凭证库经核实数据完整正确
三、总结
经核实数据完整正确,将采集过程保存为财政数据采集模板,方便后期同类型数据采集应用
至此,该数据处理完毕。