当前位置: 首页 > 审计论坛

财政ORACLE财务备份数据导入AO方法探讨

作者:邓鹏鹏   来源:本站      时间:2019-10-09

一、现实需求

行政事业单位财务核算数据存储在财政部门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数据库中。

image001.png

(3)SQL2008中建立数据库:财务数据2018

(4)右键点击财务数据2018数据库,任务——导入数据——数据源--导入,图例如下:

image003.png

数据源选择.Net Framework Date Provider for Oracle

UserId :system     Password : orcl

image005.png

(5)通过对导入的表进行分析,提取出对我们有用的表,因为该数据是多单位多年度的财务数据,其中:BOOK_SET表存储不同单位的账套号。导入我们需要的表:ACCOUNTANT_SUBJECT(科目表), REMAIN(余额表),GL_VOUCHER(凭证主表),GL_VOUCHER_DETAIL(凭证子表)等。

image007.png

(二)数据处理

在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)

as begin

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 参数的获取方式

image009.png

语句 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变量的值进行确定。

查询结果如下:

image011.png

    可以得知该单位会计科目级次为 4-4-4-4,则@a=4,@b=4,@c=4,@d=4

    提示:本语句对科目级次设置了四个变量,当科目级次小于 4的时候,后面的参数自动为 0 即可,确定上述五个参数的值之后,可先运行创建存储过程的语句。

    --执行存储过程

    exec sjql '240001001','4','4','4','4'

image013.png

    执行后生成a_fzpzb 辅助凭证表 、a_fzyeb辅助余额表、a_kmb科目表、a_pzb凭证表、a_yeb余额表 五张表生成完毕,通过AO2011数据采集辅助导入,将五张表导入到AO2011中。

    数据采集转换过程

    选择数据源SQL SERVER ,身份验证WINDOWS,测试连接成功

image015.png

     选择我们需要导入的表

image017.png

      数据采集完成导入后建立财政财务数据采集模板

image019.png

    帐表重建查看余额表,凭证库经核实数据完整正确

    三、总结

    经核实数据完整正确,将采集过程保存为财政数据采集模板,方便后期同类型数据采集应用

至此 该数据处理完毕。以上方法仅供审计同行参考。(邓鹏鹏)