编写VB小程序解决OA(2008版)科目代码断层问题,本文主要内容关键词为:断层论文,科目论文,代码论文,程序论文,VB论文,此文献不代表本站观点,内容供学术参考,文章仅供参考阅读下载。
一、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
cn3.Open("Provider=Microsoft.Jet.Oledb.4.0;persist Security Info=false; Data Source="& ztpath)
rs3.Open sqlstr,cn3
If rs3.Fields(0)<= 0 Then
Dim x As Integer
x=MsgBox(Left(CStr(List2.List(i)),level1(j))&"科目方向是借吗?",vbYesNo)
If x =vbYes Then
cn1.Open("Provider=Microsoft.Jet.Oledb.4.0;persist Security Info=false; Data Source="& ztpath)
sqlstr="insert into会计科目表(科目编码,科目名称,余额方向,上级科目编码)values(′"& Left(CStr(List2.List(i)),level1(j))&"′,′断层补充"& Left(CStr(List2.List(i)),level1(j))&"′,1,′"& Left(CStr(List2.List(i)),level1(j-1))&"′)"
Else
sqlstr="insert into会计科目表(科目编码,科目名称,余额方向,上级科目编码)values(′"& Left(CStr(List2.List(i)),level1(j))&"′,′断层补充"& Left(CStr(List2.List(i)),level1(j))&"′,-1,′" & Left(CStr(List2.List(i)),level1(j-1))&"′)"
End If
cn1.Close
Dim rs2 As New ADODB.Recordset
Dim cn2 As New ADODB.Connection
If cn2.State <> adStateOpen Then
cn2.Open("Provider=Microsoft.Jet.Oledb.4.0;
persist Security Info=false; Data Source=" & ztpath)
End If
三、科目表断层清洗小工具实践效果
审计组利用自己开发的小软件对该Y市住房公积金的财务账套进行了科目断层处理。
断层清理完成以后,审计组接着在AO2008中进行了该单位的财务账表重建。
账表重建完成后,科目代码树图
成功导入公积金市区财务账后,将电子数据与纸质账簿进行核对,二者相符。利用相同的方法,对其他分中心的财务账进行了同样的整理,保障了现场审计实施的正常进行。
利用VB开发的科目断层清洗工具,依托于AO(2008)的账表重建功能,实现了断层科目的清洗或补充,使得科目代码表完整,为数据顺利导入AO实施审计提供了可能。建议AO2008之后的升级版中,可以将科目代码表的断层校验功能做成图形化的界面直接嵌入AO中,这样可以省去不少麻烦。科目代码断层清洗小工具,适用于科目代码表比较庞大的被审计项目(如社保、公积金、财政等)。