一、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