龚泽平
2016年8月,曲靖市审计局在对某县县长离任进行经济责任审计时,采集到某单位用友A++财政财务管理软件(V5.2)备份XML财务数据,采用AO2011数据采集模板和SQL数据库转换等多种方法,始终无法导入A02011系统。
偶然间,笔者想到既然能用Microsoft Excel 2007电子表格处理XML文件,那么也许Microsoft Access 2007数据库也能处理XML数据,于是试了一下,果然成功,且过程十分简单,现将该方法介绍如下。
一、利用Microsoft Access 2007数据导入功能将被审计单位提供的XML格式财务数据导入Access,还原成一个完整的财务数据库
1.在Microsoft Access 2007中新建一个Access数据库XXGA.accdb,鼠标右键点击右边“表1:表”→“导入(M)” →“XML文件(M)”,选择要导入的XML文件“公共档案类”,将其包含的文件全部导入Access数据库XXGA.accdb。
2.点击“创建”→“表”新建表,按(一)步骤导入“总账类”全部文件。
二、Microsoft Access 2007数据库升迁
XML数据转换完成后,利用Microsoft Access 2007据库升迁功能,将Microsoft Access 2007数据库XXGA.accdb升迁到SQL Server 2008 R2中。具体步骤如下:
1.更改安全设置。点击“安全警告 已禁用了数据库的某些内容”后的“选项”按钮,点击“启用此内容”更改安全设置。
2.点击工具栏上的“SQL Server”按钮,启动数据库升迁向导。
3.选择(或输入)SQL数据库服务器名称、登录账户、密码和升迁后的SQL Server数据库名称(XXGA2014)。
4.按>>按钮,将可用表全部选择到“导出SQL Server”中,点击“下一步”完成数据升迁。
需要注意的是,在升迁Microsoft Acess 2007数据库前要关闭所有已打开的数据表,否则会出现“任何数据库对象处于打开状态时升迁向导均无法运行。请关闭打开的对象并重试”如下错误提示信息:
三、SQL数据整理与AO数据采集
完成Access数据库升迁后,即可启动SQL Server 2008 R2,对升迁后的数据库XXGA2014进行数据整理,重点检查科目表、科目余额表有无编码重复情况,科目余额表各级科目余额是否齐全,凭证表、余额表借贷是否平衡;以及时间、金额等字段类型是否正确。
科目编码重复与各级科目余额不全,是造成AO账表重建失败的主要原因之一。如果各级科目余额不全,需要按照末级科目→一级科目的顺序逐级汇总。有关数据整理语句如下:
(一)科目表
select 科目编号,科目名称,余额方向 into XXGA2014.dbo.审计_会计科目表 from XXGA2014.dbo.会计科目
(二)凭证表
SELECT 会计年度,会计期间号 as 会计期间,left(记账凭证日期,4)+'-'+substring(记账凭证日期,5,2)+'-'+right(记账凭证日期,2) as 凭证日期, case when 记账凭证类型编号='JZ' then '记账' end as 凭证类型,记账凭证编号 as 凭证编号,记账凭证行号 as 分录号,记账凭证摘要 as 摘要,科目编号, 辅助项1编号 as 辅助核算代码,cast(借方本币金额 as decimal(18,2)) as 借方金额,cast(贷方本币金额 as decimal(18,2)) as 贷方金额,附件数,制单人,审核人,记账人,记账标志,作废标志 into XXGA2014.dbo.审计_会计凭证表 FROM XXGA2014.dbo.记账凭证 where 记账标志=1 and 作废标志=0 order by 会计年度,会计期间号,left(记账凭证日期,4)+'-'+substring(记账凭证日期,5,2)+'-'+right(记账凭证日期,2)
(三)余额表
1.原始数据转换
SELECT 会计年度,会计期间号 as 会计期间,科目编号,case when 期初余额方向='借' then cast(期初本币余额 as decimal(18,2)) else '0.00' end as 期初借方余额,case when 期初余额方向='贷' then abs(cast(期初本币余额 as decimal(18,2))) else '0.00' end as 期初贷方余额 into #科目余额 FROM XXGA2014.dbo.科目余额及发生额 where 会计期间号='1' order by 会计年度,会计期间号,科目编号
2.查看科目编码长度及重复情况
select distinct 会计年度,LEN(科目编号) as 码长 from #科目余额 group by 会计年度,科目编号 order by 会计年度,LEN(科目编号) ---科长分别 为目6、8、10、12共4级,无1级科目
select distinct 会计年度,科目编号,count(科目编号) as 次数 from #科目余额 group by 会计年度,科目编号 having count(科目编号)>1 order by 会计年度,科目编号
(1)查询末级明细科目,生成5级科目余额
SELECT会计年度,科目编号,sum(期初借方余额) as 期初借方余额,sum(期初贷方余额) as 期初贷方余额 into XXGA2014.dbo.审计_科目余额表 FROM #科目余额 group by 会计年度,科目编号 order by 会计年度,科目编号
(2)汇总5级科目,生成4级科目余额
insert into XXGA2014.dbo.审计_科目余额表 select 会计年度,left(科目编号,10) as 科目编号,sum(期初借方余额) as 期初借方余额,sum(期初贷方余额) as 期初贷余额 from XXGA2014.dbo.审计_科目余额表 where len(科目编号)=12 group by 会计年度,left(科目编号,10) order by 会计年度,left(科目编号,10)
(3)汇总4级科目,生成3级科目余额
insert into XXGA2014.dbo.审计_科目余额表 select 会计年度,left(科目编号,8) as 科目编号,sum(期初借方余额) as 期初借方余额, sum(期初贷方余额) as 期初贷余额 from XXGA2014.dbo.审计_科目余额表 where len(科目编号)=10 group by 会计年度,left(科目编号,8) order by 会计年度,left(科目编号,8)
(4)汇总3级科目,生成2级科目余额
insert into XXGA2014.dbo.审计_科目余额表 select 会计年度,left(科目编号,6) as 科目编号,sum(期初借方余额) as 期初借方余额, sum(期初贷方余额) as 期初贷余额 from XXGA2014.dbo.审计_科目余额表 where len(科目编号)=8 group by 会计年度,left(科目编号,6) order by 会计年度,left(科目编号,6 )
(5)汇总2级科目,生成1级科目余额
insert into XXGA2014.dbo.审计_科目余额表 select 会计年度,left(科目编号,4) as 科目编号,sum(期初借方余额) as 期初借方余额,sum(期初贷方余额) as 期初贷余额 from XXGA2014.dbo.审计_科目余额表 where len(科目编号)=6 group by 会计年度,left(科目编号,4) order by 会计年度,left(科目编号,4)
(四)辅助核算信息
由于各单位辅助核算设置不一致,因此难形成统一的转换脚本。以下脚本仅供参考。
1.辅助信息
SELECT distinct 档案名称 as 辅助类别,档案值编码 as 辅助代码,档案值名称 as 辅助名称 into XXGA2014.dbo.审计_辅助信息表 FROM XXGA2014.dbo.自定义档案项 a left join XXGA2014.dbo.自定义档案值 b on a.档案编码=b.档案编码 order by 档案值编码。
2.辅助余额表
SELECT 会计年度,会计期间号,科目编号,辅助项编号 as 辅助代码,期初余额方向, cast(期初本币余额 as decimal(18,2)) as期初余额 into 辅助余额表 FROM XXGA2014.dbo.科目余额及发生额。
3.辅助凭证
SELECT会计年度,会计期间号,cast (substring(记账凭证日期,1,4)+'-' + substring(记账凭证日期,5,2)+'-'+ substring(记账凭证日期,7,2) as DATE) as 记账凭证日期,记账凭证类型编号,记账凭证编号,记账凭证行号,科目编号,记账凭证摘要,辅助项编号, cast(借方本币金额 as decimal(18,2)) as 借方金额, cast(贷方本币金额as decimal(18,2)) as贷方金额,附件数,制单人,审核人,记账人 into 辅助凭证表 FROM XXGA2014.dbo.记账凭证 where 记账标志=1 and 作废标志=0
整理完成后即可利用AO2011系统辅助导入功能将科目表、凭证表、余额表及辅助核算信息导入AO系统进行账表重建,供AO审计分析。
(作者单位:云南省曲靖罗平县审计局)