大型审计项目数据采集汇总“阶段工作法”探析,本文主要内容关键词为:探析论文,数据采集论文,阶段论文,项目论文,工作法论文,此文献不代表本站观点,内容供学术参考,文章仅供参考阅读下载。
一、大型审计项目特点
大型审计项目指由审计署统一组织的、参与审计机关多、地域范围广、时间跨度长、审计事项数据量大的项目,如2011年开展的全国地方政府性债务审计等项目,而且从审计发展的趋势来看,大型审计项目以后还会经常开展。大型审计项目通常是针对全国范围内的一个或多个关系到国家体制机制层面、关系到国家发展的全局性问题,由审计署在全国或多数省份统一组织、同时开展,多级审计机关共同参与。大型审计项目具有以下特点:
1.采取统一组织原则。即统一组织领导、统一方案、统一标准口径、统一审计报告、统一对外公告。统一组织领导是大型审计项目的组织指挥由审计署统一负责。统一方案是审计目标、审计内容和审计重点由审计署下发的方案统一规定。统一标准口径是问题定性、处理标准、审计时间等方面是统一的。统一审计报告要素是统一的,如成效分析、同类问题的摆放位置,以及统一出具审计报告的程序要求。统一对外公告即最终审计结果的公布,在时间、内容要求方面是统一的,保证审计结果信息传递的一致性和统一性。
2.参与审计机关多。大型审计项目参与的审计机关从横向上涉及全国各省、自治区、直辖市、计划单列市审计机关,从纵向上涉及从审计署机关到特派办,省级审计厅(局)、州市审计局到县级审计局,从中央到地方的4级审计机关共同参与。
3.涉及审计地域广。大型审计项目审计地域涵盖全国各省、自治区、直辖市、计划单列市行政区划内的各级行政区域,以及同级行政区域内的相关部门。
4.审计时间跨度长。大型审计项目通常是针对全国范围内的一个或多个关系到国家体制机制层面、关系到国家发展的全局性问题开展的审计,为系统反映事项的变化情况,通常审计的时间跨度都超过1年,甚至有些项目的审计时间跨度超过5年。
5.审计事项数据量大。大型审计项目由于审计涉及的地域广、时间跨度长、部门多,导致所涉及的数据量大。
二、大型审计项目数据采集汇总是信息化发展的必然
1.信息化环境要求采集电子数据。随着各行业财务、业务工作逐步纳入信息化的轨道,各种财务、业务信息的载体已转为数字化的电子信息,传统的完全依靠纸质资料、用手工审计的方式已不能适应新的信息化环境的要求。因此,从数字化的电子信息中获取审计需要的资料,是现阶段开展审计工作的基础,更是大型审计项目开展的基础。这就要求在开展大型审计项目过程中,要采集电子数据。
2.大型审计项目要求采集标准化数据。在信息化进程中,除金融、海关、税务等行业信息化的统一性程度较高外,其他行业的统一性程度较低。信息化的统一性程度,笔者认为主要指操作系统、应用软件系统、后台数据库系统等三方面的一致性。由于大型审计项目涉及地域范围广,加上审计的领域往往超出金融、海关、税务等行业,要从统一性程度较低的不同信息系统中取得数据,需要将不同信息系统取得的数据进行标准化、统一化处理,才能保证横向上不同省、自治区、直辖市、计划单列市的数据能进行比较,纵向上从省到县的数据也能进行比较。这就要求在审计前期调研和试点的基础上制定出需要采集的标准化数据格式,要求各级审计机关按照统一格式采集并汇总数据。
3.提高审计效率要求对采集数据进行汇总。刘家义审计长在中国审计学会第三次理事论坛上的讲话指出,“要把信息化作为审计的重要手段,解决好‘靠什么审计’问题……从一定意义上讲,中国审计的出路在信息化,信息化的关键在于数字化。在审计工作中,必须用数字化带动信息化,用信息化推动审计技术方法创新,增强在信息化环境下查错纠弊、打击犯罪、规范管理的能力”。这一论断要求在审计工作中要充分利用信息化的技术方法,将采集到的分散数据进行汇总,进行数据的融合对比分析,这是提高大型审计项目效率和效果的关键。
三、大型审计项目数据采集汇总“阶段工作法”
(一)充分做好汇总前三个层面检查工作
前期采集的数据一般已经存放在数据库中,汇总工作需要采用数据库脚本完成。如果脚本有问题、数据不规范,可能造成执行错误或数据导入结果不理想,再查找出错原因并修复错误将浪费许多时间,影响工作效率和效果。所以做好汇总前的检查准备工作,可以起到事半功倍的效果。汇总前的检查工作主要包括:
一是标准数据库、标准表的规范性检查。主要检查标准数据库、标准表的命名是否符合数据采集方案的要求;是否存在空表,有空表要先删除空表,以缩短脚本运行时间,提高汇总效率;标准表中数据字段是否符合标准表建库脚本中定义的类型、长度限制并正确取值。例如,要汇总的库除几个有效表外还存在大量的空表,在对该库进行汇总时遍历所有表将造成时间浪费,可以先将库中空表删除后再进行汇总操作,类SQL语句如下:
——删除空表类SQL语句
CREATE TABLE EmptyTable
(——创建临时表,用于存放空表表名。
TableName varchar(255)
定义变量@tablename,@sqlstr varchar(max)
定义游标countCursor为:select name from sys.objects where type=N'U'
利用游标countCursor访问sys.objects遍历库中所有表并判断是否为空表,为空则请该表的表名插入EmptyTable中作为一条记录。
再通过游标依次从EmptyTable中读取空表名称赋值给变量tablename,执行SQL语句删除空表:
set@sqlstr='drop table['+@tablename+']'
exec(@sqlstr)
二是脚本正确性和有效性检查。主要检查测试汇总脚本是否有错误、能否达到将前期采集的数据汇总到汇总库中、出现错误时是否可以给出准确、详细的提示,便于再次处理错误表。脚本正确性和有效性检查可以在脚本编写完成后将脚本在一个或多个备用库上运行、测试,直到可以达到汇总需求时才在需要汇总的库上执行,若没有进行正确性、有效性测试或直接在需要汇总的库上测试,则可能对原始数据造成不可还原的错误。
三是考虑全局,生成数据来源表。数据采集涉及行政区划多,根据不同的行政区划形成不同的数据库。为方便生成汇总库、汇总表后仍可以找到数据的原始来源,可以在汇总库中的每个表中增加相应的字段标识数据的来源,同时生成一个数据来源表存放所有的数据来源信息。具体操作方法是:先用脚本检索出本机上所有采集的SQL数据库名称,并给每一个数据库分配一个ID生成数据来源表,所有参与汇总工作的人员和执行汇总脚本都要参照执行,以防止造成重复、遗漏或不对应情况发生。
(二)汇总数据库并处理三类异常
采用汇总脚本将各个原始数据库中的表记录插入到汇总库中对应的标准表中,因为数据量较大,也最为耗时,特别是对出错表的处理,错误原因基本相似,在处理出错表时一定要做好处理记录、保存使用脚本,便于相同错误的快速处理;若在脚本执行过程中出现错误,对出错表处理后再次执行脚本时一定要限定为只针对原出错的表,否则会造成没有出错表中记录的重复汇总。汇总脚本执行时出错的主要原因及处理方法有:
一是原始表命名错误或数据表不符合拆分、合并要求。此类错误要先查找出错原因再视情况处理,若仅是命名错误,直接修改原始表名;若是不符合拆分、合并要求,则要先将原始数据表进行拆分生成多张表(或合并为一张表)并正确命名。例如,在某项目的数据汇总时,多个年度标准表需要进行合并,对应类SQL脚本如下:
——合并多个年度的表到一个表中
select*into多年度合并结果表from
(select*from第一个年度数据表
union all
select*from第二个年度数据表
union all
select*from第N个年度数据表
二是原始表中字段类型、长度定义错误,可以直接用语句更改原表中对应字段类型或长度后再执行。若在原表中更改仍不能执行,可以采用在汇总脚本中修改语句进行强制类型转换采集(强制类型转换要求字段一一对应,所以只适用于一个或多个原始表对应汇总库中一个表的情况)。例如,多个原表中某一字段类型定义错误,批量修改多个表中字段类型的类SQL语句如下:
——批量将多个以GR开头的表中字段RYBH的类型修改为字符型,注意下面select语句中对@sql1变量的赋值,必须是“@sql1=@sql1+'alter table'……”,若直接写成“@sql1='alter table'……”,则只会对最后符合条件的一个表中字段类型修改,其他符合条件的表中相应字段都未修改。
定义变量@sql1=''
select@sql1=@sql1+'alter table'+a.name+'alter column RYBH varchar(64);'from sys.objects a,sys.columns b
where a.object_id=b.object_id and a.name like'GR%'and b.name='RYBH'
exec(@sql1)
又如,多个要汇总的表中XB字段经过上述转换语句后汇总生成一个表时仍提示字段类型或取值有错误,则采用如下类SQL脚本执行汇总的同时对XB字段进行强制转换使其符合要求:
——批量将多个表生成一个汇总表,同时针对其中的XB字段不符合要求的情况进行类型强制转换,同时生成汇总日志,便于查错及后续处理。
生成日志临时表EXEC_LOG,若该表存在则先删除再重建
定义变量@e,@meg,@cmd——用于存放日志信息。
定义变量@tablename,@tablename_mb——用于存放原表名称和目标表名称。
定义变量@tgdw varchar,@nd varchar——用于保存提供单位、年度。
定义变量@sql,@str——用于存放SQL语句和字符串值。
根据当前数据库的名称确定目标数据库的提供单位并给变量赋值:
select@tgdw=(case when DB_NAME () like'%MZ%'then'MZTG'when (DB_NAME() like'%WS%'or DB NAME () like'%RS%')then'RSTG'else"END) from Master..sys-databases where name like'标准库_%'
定义游标cur_del,用于遍历每个表,选择SJ开头的表:
select name,nd=right(name,4)from sys.objects where type=N'U'and name like 'SJ_%'
——执行过程中如果出现部分表错误,对出错的表修改后再次执行本脚本时则要在本语句后增加限制只对出错表处理的条件,如“and name in(‘SJ_GRXX’,’SJ_GR-CBXX’,’SJ_DWXX’)”条件,使本脚本下次执行时只对‘SJ_GRXX’,’SJ_GRCBXX’,’SJ_DWXX’三个表进行操作而不会再次执行已经正确执行的表。
打开游标依次遍历各个符合条件的表,给@table-name,@nd变量赋值,再根据其他变量的值确定目标表名称@tablename_mb的值:
@tablename_mb=@tablename+@nd+'_'+@tgdw
定义要执行的汇总SQL命令,其中对源表中XB字段插入目标表前进行强制类型转换:
set@cmd='insert into[目标库].[dbo].['+@table-name_mb+'] select源表中字段列表1,XB=cast (xb as var-char(2)),源表中字段列表2 from[dbo].['+@tablename+']'
执行汇总操作并处理执行过程中产生的信息存入日志表。
select*from[EXEC LOG]——执行汇总后显示日志表中记录,若有出错表则查找原因、处理后再次汇总。
三是有些不含在标准表中的自定义表,可以参照标准表的脚本定义对应的视图及约束,然后再将自定义表采集至汇总库。
(三)生成汇总库后做好三个方面校验
将全部原始数据按要求生成汇总库后,还要进行必要的检查工作,以保证汇总库数据的完整、正确,做好数据采集汇总的总结工作,准备材料及时上报汇总数据。一是检查是否有原始库没有汇总的情况,将汇总时的记录与原始库一一核对,确保采集没有遗漏。二是检查数据是否重复采集,因为错误表的处理、人为操作等原因,可能造成原始数据的重复采集,为防止惯性思维,最好采用多人交叉检查的方式。三是检查汇总库每个标准表中数据来源字段值是否与数据来源表中ID字段及汇总前数据库名称字段值相对应,通过此校验可以保证每个标准表中每条记录都可以找到正确的数据来源。例如,汇总完成后对汇总库所有表中“ADD_SJLY”字段值测试是否与数据来源表中“ID”字段匹配,类SQL脚本如下:
——数据来源校验脚本。
新建ErrTable表,用于存放出错表信息。
新建EXEC_LOG表,用于存放检查日志。
定义变量@e,@meg,@cmd——用于存放日志信息。
定义变量@tablename——用于存放源表名称和目标表名称。
定义变量@sql,@str——用于存放SQL语句和字符串值。
declare cur_table cursor for
定义游标cur_del,用于遍历每个表,选择SJ开头的表:
select name from sys.objects where type=N'U'and name like'SJ_%'
打开游标cur_del依次遍历各个表,将来源有错误的表找出,并将表名存入ErrTable表中:
set@cmd='insert into ErrTable select distinct table-name='''+@tablename+'''from'+@tablename+'whereADD_SJLY not in(select ID from dbo.数据来源信息表)'
执行检查操作并处理执行过程中产生的信息存入日志表中。
——显示日志表中失败记录及失败的表名。
select*from[EXEC LOG] where DISCRIPT='失败'
select*from ErrTable
通过检查发现存在有错误的表则利用更新操作修改数据来源信息表中对应字段值。
通过严格执行检查、汇总和校验工作,可以保证各级审计组采集的数据完整、准确,为大型审计项目审计工作数据分析、查找问题线索提供坚实的基础和有力的保障。