编写VB小程序解决OA(2008版)科目代码断层问题

作 者:

作者简介:
尤阿芹,潘熠栋,扬州市审计局

原文出处:
江苏审计

内容提要:


期刊代号:V3
分类名称:审计文摘
复印期号:2011 年 11 期

关 键 词:

字号:

      一、AO重建账表异常现象及其原因

      Y市审计局在对该市住房公积金财务数据进行整理并导入AO的过程中,审计组发现凭证表导入AO以后,所有科目凭证发生记录数全部为0。

      由于AO重建账表是基于末级记账的算法,如果被审计单位的日常财务活动并没有从会计科目末级记账,那么AO在重建账表以后就会存在没有数据或者借贷不平等问题。经分析,导致这一现象的原因有两个方面:一是被审计单位未以末级科目记账,但是审计组在检查以后发现该单位记账不存在问题。二是科目代码出现了断层。何为断层?比如科目代码表里面一共有3级科目,科目编码规则为3,2,2。假设末级科目是1130201,按照常理,在其之上应该有11302、113这两个上级科目代码。如果不存在这两个科目代码或者不完全存在这两个科目代码,那么这个科目表就出现了断层。

      为了验证上述思路,审计组对AO(2008)的后台ACCESS数据库进行检查分析,发现会计科目表中的“上级科目”编码字段,是在点击过“账簿重建”按钮之后,根据科目设置中的科目码级次长度规则和科目编码自动生成的。而在此过程中,AO并没有校验其自动生成的上级科目代码是否存在于原科目代码表中。通过运行SQL语句进一步检查,我们发现了2级科目(即长度为5的科目)和6级科目(即长度为19的科目),分别存在1个及19个共20个断层,即其上级科目编码并不存在于原始科目编码表中。

      二、编写VB小程序解决存在问题

      在常规数据整理中,利用SQL语句虽然能查出断层的存在,但是断层科目并不一定就是有规律可循,因为断层科目有时候有发生额,有时候没有发生额,这样在AO(2008)中处理起来比较麻烦。

      为了解决上述问题,审计组利用VB6.0开发了一个科目清洗小软件。小软件通过调用AO2008账套对应的后台ACCESS数据库,检查会计科目表是否存在断层,如果有断层,列出其科目代码和科目名称。当断层科目没有凭证库的发生额时,软件会提示是否直接删除;当断层科目有凭证库发生额时,软件会提示逐级补充其上层科目及名称。同时软件还提供了校验功能,以确保科目树补充的完整性。

      科目清洗软件核心代码(有删截,仅供示例)如下:

      For i=0 To List2.ListCount-1′需要清洗的科目列表

      Dim j As Integer

      j=11

      While j>1

      j=j-1

      If level1(j)= Len(List2.List(i))And level1(j-1)<Len(List2.List(i))Then

      Dim sqlstr As String

      sqlstr= "select * from凭证库where科目编码=′" & List2.List(i)&"′"

      Dim cn As New ADODB.Connection

      Dim rs As New ADODB.Recordset

      cn.Open("Provider=Microsoft.Jet.Oledb.4.0;

      persist Security Info=false; Data Source=" & ztpath)

      rs.Open sqlstr,cn,adOpenKeyset,adLockOptimistic

      If rs.RecordCount = 0 Then

      Dim y As Integer

      y=MsgBox("需要删除"& List2.List(i)&"科目吗?该科目在凭证表中没有发生额",vbYesNo)

      If y = vb Yes Then

      Dim rs1 As New ADODB.Recordset

      Dim cn1 As New ADODB.Connection

      cn1.Open("Provider=Microsoft.Jet.Oledb.4.0;persist SecurityInfo=false; Data Source="& ztpath)

      rs1.Open("delete*from会计科目表where科目编码=′"& List2.List(i))& "′",cn1,adOpenKeyset,adLockOptimistic

      End If

      cn1.Close

      Else

      While j >1

      j=j-1′判断是否添加

      sqlstr="select count(科目编码)from会计科目表where科目编码=′"& Left(CStr(List2.List(i)),level1(i))&"′"

      Dim rs3 As New ADODB.Recordset

      Dim cn3 As New ADODB.Connection

相关文章: