日前,在对某市直单位预算执行审计中,审计人员发现该单位所使用的财务软件为"畅捷通T++"财务软件网络版,版本号为12.3,后台数据库为MS SQLServer2008。审计人员未能在AO2011提供的数据转换模板库中找到可用的转换模板,在通过对系统数据库结构的深入分析的基础上,审计人员编写标准化的SQL脚本抽取出凭证表、科目余额表标准表,运用AO2011的财务软件数据库数据导入功能,将该财务备份数据快速导入AO2011。
一、数据结构分析及注意事项
一般情况下存储凭证的表的行数在整个数据库中应该是比较多的,较为简单的是先通过“查看”菜单—“对象资源管理器详细信息”—表—查看“行计数”—行数降序排列,能够直观的看到数据量较大的若干表,然后通过查看内容和数据字典分析,判断出凭证主表和分录表。在该数据库中,通过分析发现GL_Doc为凭证主表、GL_Entry为凭证分录、GL_Journal为凭证的辅助明细账、AA_Account为科目表、GL_AccountPeriodBegin为科目期初余额表。
根据数据结构发现结合实际情况发现,本次数据转化存在以下几点注意事项:
(1)AA_Account表中ID字段非常重要。分析发现余额表和凭证表都必须通过该字段与科目表产生关联,进而补全科目信息。
(2)GL_AccountPeriodBegin表中科目代码部分缺失。除2014年科目代码是完整的外,其他年度科目代码一栏为空值,无法判断是数据丢失还是该表设计的原因。
(3)很难通过凭证主表GL_Doc、分录表GL_Entry生成凭证标准表,凭证标准表从凭证辅助信息表
二、SQL数据处理的抽取脚本(以生成2014年科目余额表、凭证表为例)
(一)生成科目表临时表(temp_kmb2014)
通过AA_Account表分析发现,有用字段大概有5个:code表示科目代码、name表示科目名称、accounttingyear表示年度、dcdirection表示借贷(652代表“借”、653代表“贷”)、id表示科目的编号。这里重点强调id这个字段,刚开始分析的时候并没有特别关注这个字段,认为该字段仅仅是一个顺序编号,但是后面做余额表和凭证表分析的时候发现余额表中部分科目编码缺失、凭证表内无科目代码。该字段为表内编号,别于科目代码,是科目代码的一个顺序编号。科目余额表和凭证表则通过该字段关联科目代码和科目名称。
通过进一步处理,生成科目代码临时表,SQL语句及结果如下:
select code,name,id,dcdirection=case
when dcdirection='652' then '借'
when dcdirection='653' then '贷' end
into temp_kmb2014
from AA_Account
where accountingyear='2014'
(二)生成余额表临时表(temp_yeb2014)
通过查看GL_AccountPeriodBegin(科目余额初期表)发现,除2014年外其他年度科目代码为空,无法通过单表生成科目余额表。进一步分析发现,表内有id和idaccountDT+O两个字段可能与科目代码表中的id字段有关联,通过分析特定的科目代码和结合2014年度存在科目代码的情况发现idaccountDT+O字段应该是对应科目代码表中的id字段。
生成余额表临时表temp_yeb2014,SQL语句及结果如下:
select idaccountDT+O,yearbeginbalanceamount into temp_yeb2014
from GL_AccountPeriodBegin where accountingyear='2014'
(三)根据科目代码临时表(temp_kmb2014)和余额临时表(temp_yeb2014)生成科目代码余额表(kmyeb2014),SQL语句及结果如下:
select code 科目代码,name 科目名称,dcdirection 借贷方向,
cast(isnull(yearbeginbalanceamount,0) as money)期初余额
into kmyeb2014
from temp_kmb2014 full join temp_yeb2014 on id=idaccountDT+O
(四)验证科目余额完整性
通过分析发现,发现该年度科目余额表中余额仅在末级科目有金额,上级科目无余额。执行以下语句可查找到存在这种情况的科目:
select LEFT(科目代码,4),COUNT(*),SUM(期初余额) from kmyeb2014
group by LEFT(科目代码,4) having COUNT(*)>1 and SUM(期初余额)>0
select LEFT(科目代码,6),COUNT(*),SUM(期初余额) from kmyeb2014
group by LEFT(科目代码,6) having COUNT(*)>1 and SUM(期初余额)>0
select LEFT(科目代码,8),COUNT(*),SUM(期初余额) from kmyeb2014
group by
LEFT(科目代码,8) having COUNT(*)>1 and SUM(期初余额)>0
根据上面查找的结果发现,存在这样情况的科目不多,所以通过执行以下语句进行修改相应科目的期初余额:
update kmyeb2014 set 期初余额='1566881.35' where 科目代码='1215'
update kmyeb2014 set 期初余额='61810.00' where 科目代码='2302'
update kmyeb2014 set 期初余额='82207.44' where 科目代码='2305'
update kmyeb2014 set 期初余额='1427533.75' where 科目代码='3101'
(五)生成凭证表(pzb2014)
通过查看凭证主表(GL_Doc)和凭证分录表(GL_Entry)发现,两表无法通过有效的字段建立联系。而分析凭证辅助信息表(GL_Journal)发现该表能满足生成凭证标准表的基本条件,通过关联科目表(AA_Account)能够获取完整的科目代码。
SQL语句和执行结果如下:
select year 年份,currentperiod 月份,docno 凭证号,rowno 分录号
,b.code 科目代码,b.name 科目名称,summary 摘要
,cast(isnull(amountDr,0) as
money) 借方金额
, cast(isnull(amountCr,0) as
money) 贷方金额,madedate 制单日期
into pzb2014 from GL_Journal ,AA_Account b
where idaccount=b.id and year=2014 and currentperiod <>0
order by
1,2,3,4
三、导入AO2011
根据审计署计算机中级教材《AO2011实用手册》中的“第5章采集转换”中的“5.1.3财务软件数据库数据采集转换”的步骤和图解,将上述生成数据导入AO2011。
导入过程详细操作步骤如下:
1、打开AO2011,依次选择
采集转换—财务数据—财务软件数据库数据—采集数据
2、选择数据源(SQLSERVER)—服务器名称—填写用户名和密码—选择数据库—测试连接,然后点击下一步
3、选择要导入的表(也就是前面整理的科目余额表和凭证表),然后点击下一步
4、点击采集,采集成功后会提示采集完成,然后生成临时表
5、填写会计数据信息,确定后完成新建。
6、选择导入方式,然后确定
7、进行“会计期间定义”,从该项开始选择“辅助导入”,设置完毕后保存和关闭
8、设置“科目余额表”,选择 “辅助导入”,选择源表,完成各项信息填写。
9、设置“会计科目表”,选择 “辅助导入”,选择源表,完成各项信息填写。
10、进行科目设置,辅助导入—批量生成—检查科目级次和长度—生成科目
11、验证—无错误后点击确定—保存(提示保存成功)
12、进行凭证库的导入
13、凭证库导入成功后,点击关闭,然后确认关闭向导。
14、进行科目调整,检查会计期间、科目方向和科目余额,确认无误后进行“账表重建”
15、“账表重建”完成后,依次打开“审计分析”—“账表分析”菜单下的科目明细账审查、会计科目审查、凭证审查、报表审查等菜单,与纸质账表进行核对,检查是否一致。