审计分析中巧用“数据字典”
袁欢(湖北省仙桃市审计局)
【发布时间:2014年05月13日】
字号:【大】 【中】 【小】

数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。在结构化分析中,数据字典的作用是给数据流图上每个成分加以定义和说明。任何字典最重要的用途都是供人查询对不了解的条目的解释,同样,我们也可以将数据字典的定义引入到审计分析中,适用于存在某种标准,用于查找数据错误或缺失。下面仅从车辆识别号分析和票据缺号查找举例来说明如何查找错误或缺失,此文仅为个人观点,乐与广大审计同仁探讨学习。

一、车辆识别号校验分析

车辆识别号(即VIN码)的第九位是校验码,根据其他16位计算而来,计算规则如下:VIN码中的每一位都是数字或大写字母,每个数字和大写字母对应一个数值;车辆识别号中除检验位之外的每一位都有一个权重;将每一位的数值和权重相乘后累加,累加数除以11所得余数即为检验码,如余数为10则检验码为X。在对车辆识别号进行查错分析时,我们可以巧用数据字典表来对VIN码进行校验。
第一步:制作两张字典表,一张用来说明权重,一张用来说明转换值。
权重字典表:

转换值字典表:

第二步:对VIN码进行提取、计算。
由于VIN码位数比较多,我们可以利用游标里面的循环来进行提取计算或者在excel中写出批量语句。
方法一:利用游标提取,sql语句如下:
 declare a cursor for
 select VIN码,校验码=case substring(VIN码,9,1) when 'X' then 10 else substring(VIN码,9,1) end
 from dbo.VIN码
 declare @vin char(25),@jy char(6)
 open a
 fetch a into @vin,@jy
 print '     VIN码           校验码  余数'
  while @@FETCH_STATUS =0
   begin
    declare @a int,@sum int
    select @a=1,@sum=0
     while @a<=17
      begin
       set @sum=@sum+(select 对应值 from 取值字典表 where 原始值=SUBSTRING(@vin,@a,1))
*(select 权重 from 权重字典表 where 第X位左向右=@a)
       set @a=@a+1
      end
      set @sum=@sum%11
    if @sum<>@jy
     print @vin+@jy+cast(@sum as varchar(2))
    fetch a into @vin,@jy 
   end
close a
deallocate a
查找结果如下:

方法二:在excel中生成批量语句
Step 1:excel中生成计算语句

Step 2:在sql中进行校验
select VIN码,校验码=case SUBSTRING (VIN码,9,1) when 'x' then 10 else SUBSTRING (VIN码,9,1) end,
余数=cast((select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,1,1))*(select 权重 from 权重字典表 where 第X位左向右=1)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,2,1))*(select 权重 from 权重字典表 where 第X位左向右=2)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,3,1))*(select 权重 from 权重字典表 where 第X位左向右=3)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,4,1))*(select 权重 from 权重字典表 where 第X位左向右=4)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,5,1))*(select 权重 from 权重字典表 where 第X位左向右=5)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,6,1))*(select 权重 from 权重字典表 where 第X位左向右=6)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,7,1))*(select 权重 from 权重字典表 where 第X位左向右=7)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,8,1))*(select 权重 from 权重字典表 where 第X位左向右=8)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,9,1))*(select 权重 from 权重字典表 where 第X位左向右=9)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,10,1))*(select 权重 from 权重字典表 where 第X位左向右=10)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,11,1))*(select 权重 from 权重字典表 where 第X位左向右=11)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,12,1))*(select 权重 from 权重字典表 where 第X位左向右=12)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,13,1))*(select 权重 from 权重字典表 where 第X位左向右=13)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,14,1))*(select 权重 from 权重字典表 where 第X位左向右=14)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,15,1))*(select 权重 from 权重字典表 where 第X位左向右=15)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,16,1))*(select 权重 from 权重字典表 where 第X位左向右=16)+
(select 对应值 from 取值字典表 where 原始值=SUBSTRING(VIN码,17,1))*(select 权重 from 权重字典表 where 第X位左向右=17)
as int)%11
into 校验表
from dbo.VIN码
select * from校验表
where校验码<>余数
查找结果如下:

这两种方法得到结果是一致的,我们可以根据实际情况来选择其中的一种。

二、票据缺号查找

完整性审计是审计必不可少的过程之一。对于连续编号的票据来说,我们往往通过最大值、最小值和计数就能很容易来判断票据是否存在缺失,但是,锁定缺失的票据往往不是一件易事。然而,根据最大值、最小值来制作一个无缺失的标准票据表对于广大审计人员来说却非常简单。将无缺失的票据表与票据表进行对比,无需复杂的sql语句,对于数据量小的票据表来说,甚至可以直接利用excel中的函数vlookup来进行查找。(本文以U8-999帐套中发货单为例)
第一步:通过最大值、最小值和计数来判断票据是否存在缺失
Select cVouchType, max(cdlcode), MIN(cdlcode), COUNT(distinct cdlcode)
from DispatchList
group by cVouchType
查询结果如下:

从查询结果我们得知,票据类型为05的票据存在缺失情况。
第二步:利用填充对票据类型为05的票据制作一张无缺失的票据表。
第三步:
select a.* from dbo.无缺失票据表 a
left join dbo.DispatchList b
on a.cvouchtype=b.cVouchType
and a.cdlcode=b.cDLCode
where b.cVouchType is null
查询结果如下:

在审计过程中,往往涉及到很大而且复杂的数据量,判断数据的正确性和完整性成了审计的一项重要任务。在某些情况下,单纯查错很复杂但是制作标准表却很简单,我们不妨反向而行之,制作一张标准表作为参照表,然后再对其进行对比往往容易很多,达到化繁为简的目的。(袁欢)
【关闭】    【打印】