在计算机数据整理过程中,往往会碰到数据结构复杂、多单位跨年度的数据存放在一张数据表中的情况。根据审计需要,可能会按照单位、年度将数据表进行分解。本文以某地区使用的农村三资管理软件的凭证信息数据为例,介绍使用游标批量化分解数据表的审计方法。 一、数据整理及分析情况 笔者将备份的财务数据还原至SQL SERVER,经过分析发现该软件采用主子表结构模式,跟财务数据相关的表有五个。其中:XZSJ_CY_ZT_CSS JLR_XZ_TEMP为科目余额表,XZSJ_CY_ZT_KJKM_XZ_TEMP为会计科目表,XZSJ_CY_ZT_PZSJB_XZ_TEMP为凭证子表,XZSJ_CY_ZT_PZXXB_XZ_TEMP为凭证主表,XZSJ_CY_ZT_XXB_XZ TEMP为账套信息表。如图1。
对五张表的进一步分析得出表间关系如图2。 软件数据结构复杂,将账套信息单独存放,以账套代码为区分,将5个村9年的会计凭证信息均存放在一个表中。AO2011中无此软件的采集模板,只能使用财务软件数据库采集的方式对这45套账进行采集。考虑到数据库的采集方式一次只能采集一个单位一年数据,需要将财务数据表按照单位分年度进行分解。
二、数据分解过程 数据分解思路为:利用游标的遍历功能,先从账套信息表中逐步获取账套编码和账套名称,再从凭证主表中逐步获取会计年度,最后根据账套编码和会计年度对凭证主表和凭证子表数据按单位逐年分割,分割完成的数据重新插入至新表中(命名格式为:账套名称_会计年度_数据表名)。 游标语句如下: DECLARE@ZTMC VARCHAR(20), @ZTBM VARCHAR(20) DECLARE C1 CURSOR FOR Select zt_mc ASZTMC from XZSJ_CY_ZT_XXB_XZ_TEMP OPEN C1 FETCH NEXT FROM C1 INTO @ZTBM,@ZTMC WHILE @@FETCH_STATUS=0 BEGIN DECLARE @KJND decimal(4,0) DECLARE C2 CURSOR FOR SELECT DISTINCT KJND FROM XZSJ_CY_ZT_PZXXB_XZ_TEMP order by kjnd OPEN C2 FETCH NEXT FROM C2 INTO @KJND WHILE @@FETCH_STATUS=0 BEGIN exec(′SELECT*INTO′+@ZTMC+′_′+@KJND+′_凭证主表′+′from XZSJ_CY_ZT_PZXXB_XZ_TEMP where ZT_BM='''+@ZTBM+'''AND KJND='''+@KJND+''') exec(SELECT a.*INTO′+@ZTMC+′_′+@KJND+′_凭证子表′+′from XZSJ_CY_ZT_PZSJB_XZ_TEMP a join XZSJ_CY_ZT_PZXXB_XZ_TEMP b on a.pz_id=b.id where b.ZT_BM='''+@ZTBM+'''AND KJND='''+@KJND+''') FETCH NEXT FROM C2 INTO @KJND close c2 deallocate c2 fetch next from c1 into @ZTBM,@ZTMC close c1 deallocate c1 运行上述游标后,凭证信息将被逐单位逐年度分解,并按照语句中设定的表名格式自动插入至新表中。运行结果如图3。
对数据表进行分解时,按照分解字段设置查询条件生成新表或者以分解字段值作为变量使用存储过程均可达到上述效果,但当分解字段值较多时,游标的优势较为明显;对比之下,使用游标进行分解将更准确、更便捷。游标从表中直接取数,避免了人为输入带来的错误。在数据整理中,合理使用游标可以为数据分析赢得更多时间。