数据审计方法

巧用Access 2007采集用友A++财政财务管理软件导出XML财务数据

浏览:

2016年8月,曲靖市审计局在对某县县长离任进行经济责任审计时,采集到某单位用友A++财政财务管理软件(V5.2)备份XML财务数据,采用AO2011数据采集模板和SQL数据库转换等多种方法,始终无法导入A02011系统。

笔者从网上查询得知,XML是可扩展标记语言(Extensible Markup Language)的缩写,意为可扩展置标语言、可扩展标记语言或可延伸标示语言,是一种新兴的面向Internet应用并用于描述数据的与平台无关的标记语言。它可以有效描述半结构化,甚至是非结构化的数据,具有操作简便、跨平台、存储与显示分离、易于处理等特点,也是当今处理分布式结构信息的有效工具。目前用友、金蝶等部分财务软件已开始使用XML进行数据传输。有网友介绍用Microsoft Excel 2007进行XML文件数据采集的方法,笔者试了一下,采集转换后的数据不仅没有数据表名称,同时转换后的数据文件过大,处理过程复杂,不利于操作,于是决定放弃这种方法。

偶然间,笔者想到既然能用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账表重建失败的主要原因之一。因此SQL数据整理的重点是检查科目表、科目余额表有无编码重复情况,科目余额表各级科目余额是否齐全,凭证表、余额表借贷是否平衡;以及时间、金额等字段类型是否正确。有关数据整理语句如下:

(一)科目表

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)

检查凭证表平衡性

SELECT 会计年度,sum(借方金额) as 借方发生额,sum(贷方金额) as 贷方发生额,sum(借方金额)-sum(贷方金额) as 差额 from XXGA2014.dbo.审计_会计凭证表 group by 会计年度

(四)余额表

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 会计年度,sum(期初贷方余额) as 期初借方余额,sum(期初贷方余额) as 期初贷方余额,sum(期初借方余额)- sum(期初贷方余额) as 差额 from #科目余额 group by 会计年度

3、查看科目编码长度及重复情况

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 会计年度,科目编号

4.1查询末级明细科目,生成5级科目余额

SELECT 会计年度,科目编号,sum(期初借方余额) as 期初借方余额,sum(期初贷方余额) as 期初贷方余额 into XXGA2014.dbo.审计_科目余额表 FROM #科目余额 group by 会计年度,科目编号 order by 会计年度,科目编号

4.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)

4.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.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 )

4.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)

4.6检查新生成的余额表平衡性

select 会计年度,sum(期初借方余额) as 期初借方余额,sum(期初贷方余额) as 期初贷方余额,sum(期初借方余额)-sum(期初贷方余额) as 差额 from XXGA2014.dbo.审计_科目余额表 where len(科目编号)=4 group by 会计年度 order by 会计年度

4.7检查科目编码重复情况

select distinct 会计年度,科目编号,count(科目编号) as 次数 from XXGA2014.dbo.审计_科目余额表 group by 会计年度,科目编号 having count(科目编号)>1 order by 会计年度,科目编号

(六)辅助核算信息

由于各单位辅助核算设置不一致,因此难形成统一的转换脚本。以下脚本仅供参考。

6.1辅助信息

SELECT distinct 档案名称 as 辅助类别,档案值编码 as 辅助代码,档案值名称 as 辅助名称 into XXGA2014.dbo.审计_辅助信息表 FROM XXGA2014.dbo.自定义档案项 a left join XXGA2014.dbo.自定义档案值 b on a.档案编码=b.档案编码 order by 档案值编码

6.2辅助余额表

SELECT 会计年度,会计期间号,科目编号,辅助项编号 as 辅助代码,期初余额方向, cast(期初本币余额 as decimal(18,2)) as期初余额 into 辅助余额表 FROM XXGA2014.dbo.科目余额及发生额

6.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审计分析。(龚泽平)