金蝶K3-V10电子数据手工导入AO操作应用实例
来源:本站  时间:2013-06-24 00:00:00
冯  浩
 
    某被审计单位使用的财务核算软件为金蝶K3-V10,后台数据库是SQL Server 2000,审计组在AO软件中,使用数据转换模板导入电子数据时,遇到无法重建账表的错误提示,从而不能正常生成电子账套。随后,在访问金审工程服务网站查询有关内容时,也未给出详细的解决办法。面对这一问题,在认真分析金蝶K3-V10电子数据结构的基础上,对数据进行一系列必要的整理等工作后,采取手工导入方式完成数据转换工作,最终顺利地将电子数据导入AO,生成了电子账套,使这一问题得到了解决。
    第一步:分析数据结构,确定将要用到的表及重要字段
    将备份电子数据还原到SQL Server 2000中,经分析,确定将要用到的表,如表1所示:
序号
表名
中文含义
功能作用
1
t_TableDescription
表描述表
说明各表的功能作用,确定与账务信息有关的关键表
2
t_FieldDescription
字段描述表
说明各表的字段功能含义,帮助理解分析关键表字段含义
3
t_Account
科目表
说明会计科目设置基本信息
4
t_Balance
科目余额表 
记录各年度各科目余额信息
5
t_VoucherEntry
凭证分录表
记录各记账凭证分录信息
6
t_Voucher
凭证表 
记录各张凭证基本信息
7
t_Item
基础资料主表
记录核算项目定义信息
8
t_ItemClass
基础资料类别表
记录项目类别信息
9
t_Itemdetailv
核算项目使用详情纵表
核算项目代码、名称与有关表记录之间的中间表
表1
    第二步:关键表结构分析及数据整理
    (一)科目表:t_Account
    1、科目设置基本情况:
科目设置及使用不分年度,被审单位科目设置的最高级次为4级。
    2、需重点关注的字段,如表2所示:
序号
字段名称
含义
备注
1
FAccountID
科目内码
会计科目ID(关键字)
2
Fnumber
会计科目代码
 
3
Fname
会计科目名称
 
4
FDC
借贷方向
1- 借方   -1 - 贷方
5
FFullName 
全名
 
表2
    3、科目表数据整理过程
    经过对会计科目表科目设置情况进行查验,发现科目代码(FNumber)最大级次为四级,分隔符为“.”,绝大多数级次长度按照4-3-2-2的格式进行定义(这个长度不包括科目代码分隔符),但有6个二级科目(也是末级科目)长度为2,而不是3,分别是:'1231.01','1231.02','1122.01','1122.02','1122.03','1122.04',应该对这6个二级科目进行规范化,统一规范为4-3-2-2的格式,即在上述6个科目代码的二级前面加上一位即可,但应注意避免与现有科目代码的重复。经查询,可以将其规范为:'1231.601','1231.602','1122.601','1122.602','1122.603','1122.604'的形式。
语句如下:
update t_account set fnumber=stuff(fnumber,6,1,'60') from t_account where len(fnumber)=7
(备注:科目代码分隔符:“.”,在向AO手工导入设置科目代码规则时要进行指定,并将AO默认的4-4-3-3改为4-3-2-2)
    至此,科目表数据整理完毕。
    (二)科目余额表:t_Balance 
    1、科目余额表基本情况:
存储多年度数据(2008年-2011年), 余额按月存储 iperoid ,各年初余额即各年1月份余额数。
    2、重点关注的字段,如表3所示:
序号
字段名称
含义
备注
1
FYear
会计年度
2008年-2011年
2
FAccountID
科目内码
与科目表关联的外键
3
FPeriod
会计期间
1-12
4
FBeginBalance
本币期初余额
由正负来表示借、贷
表3
    3、数据整理过程:
    科目余额表的处理比较麻烦,大致步骤如下:
    (1)增加科目代码(Fnumber)列
原表中,缺少手工导入时所需的科目代码列(FNumber,varchar 40),修改表结构,增加该列,并用UPDATE更新其值,语句如下:
UPDATE [dbo].[t_Balance]
SET [dbo].[t_Balance].FNumber = t_Account.FNumber
FROM [dbo].[t_Balance], t_Account
WHERE [dbo].[t_Balance].FAccountID = t_Account.FaccountID
    (2)删除重复记录
    经查询并对记录的深入观察分析,发现该表中存在科目余额重复记录情况,应将重复记录删除。重复情况分为两种:
    第一种重复:由币别内码(FCurrencyiID)引起的记录重复
经过分析,发现记录重复,即因为FCurrencyiID=0与FCurrencyiID=1的记录重复,将FCurrencyiID=0的记录删除:
Delete from [dbo].[t_Balance] where FCurrencyiID=0
    第二种重复:由核算项目使用内码(FDetailID)引起的重复
每一科目代码的Fdetailid=0的期初值等于Fdetailid<>0各记录(各核算项目)期初值相加,即科目余额表中,也反映了各核算单位的期初数,但如不将核算单位的期初数记录删除,对于科目代码来讲存在数值上的重复,所以也应将各核算单位的期初数记录删除。
Delete from [dbo].[t_Balance] where Fdetailid<>0
(3)按年度将记录分别保存
Select * into t_Balance_new_2008 from t_Balance where fyear=2008;
Select * into t_Balance_new_2009 from t_Balance where fyear=2009;
Select * into t_Balance_new_2010 from t_Balance where fyear=2010;
    至此,科目余额表数据整理完毕。
    (三)凭证辅助表:t_VoucherEntry
    1、凭证辅助表表基本情况:
记录了多年度的凭证分录,与凭证主表相应记录为1:N的关系,通过FVoucherID与凭证主表相关联,通过FaccountID与科目表相关联。
    2、重点关注的字段,如表4所示:
序号
字段名称
含义
备注
1
FAccountID 
科目内码
 
2
FAmount
本币位金额
发生额
3
FExplanation
摘要
 
4
FVoucherID
凭证内码
凭证号,唯一
5
FDC
余额方向
0-贷方,1- 借方
表4
    3、数据整理过程
    (1)增加会计年度(Fyear int 4)用凭证主表对应记录进行更新
Update t_VoucherEntry set t_VoucherEntry.Fyear= t_Voucher.Fyear
From t_VoucherEntry , t_Voucher
Where t_VoucherEntry.Fvoucherid= t_Voucher.Fvoucherid
    (2)增加科目代码(FNumber)列,用科目表对其进行更新
UPDATE t_VoucherEntry
SET t_VoucherEntry.FNumber = t_Account.FNumber
FROM t_VoucherEntry, t_Account
WHERE t_VoucherEntry.FAccountID = t_Account.FaccountID
    接下来,为方便审计人员对记录的查询检索,我们决定将项目分类名称、涉及单位名称等信息加到摘要上去,形如:“银行存息-商行XX街支行_单位_XXX污水处理厂”,这样,审计人员可以通过对摘要实现类似辅助账数据分析功能。
    (3)增加Fdetailfullname (varchar 255),用于更新(摘要)字段
    此处注意,要更新t_VoucherEntry.Fdetailfullname,需要借助t_Itemdetailv表。
    首先,将t_Itemdetailv表增加相关列:分别是Fdetailname(varchar 255),Fdetailclassname(varchar 255), Fdetailfulllname(varchar,255),然后对其值进行分别更新,语句如下:
update dbo.t_ItemDetailV
set dbo.t_ItemDetailV.fdetailname=dbo.t_Item.fname
from dbo.t_ItemDetailV,dbo.t_Item
where dbo.t_ItemDetailV.fitemid=dbo.t_Item.fitemid  --在表dbo.t_ItemDetailV增加FDetailName字段,然后用T_Item表进行更新
 
update dbo.t_ItemDetailV
set dbo.t_ItemDetailV.Fdetailclassname=dbo.t_ItemClass.fname
from dbo.t_ItemDetailV,dbo.t_ItemClass
where dbo.t_ItemDetailV.fitemclassid=dbo.t_ItemClass.fitemclassid
经过观察发现,一些记录Fdetailname值为空,为避免在SQL查询器中更新Fdetailfulllname字段时出现与空串连接结果为空的情况,先给空值赋上一个值“NULL”:
Update  dbo.t_ItemDetailV set fdetailname=’NULL’ from dbo.t_ItemDetailV where fdetailname is null
    经验证,Fdetailclassname字段没有空值,无需做上述操作。
    更新Fdetailfullname字段:
Update dbo.t_ItemDetailV set fdetailclassname=fdetailname+’_’+fdetailclassname from dbo.t_ItemDetailV
 
    其次,再用dbo.t_ItemDetailV.Fdetailfullname去更新t_VoucherEntry.Fdetailfullname
 
update t_voucherentry  set t_voucherentry.fdetailfullname=dbo.t_ItemDetailV.fdetailfullname
from t_voucherentry,dbo.t_ItemDetailV
where t_voucherentry.fdetailid=dbo.t_ItemDetailV.fdetailid
    第三,更新摘要:
Update t_Voucherentry  set  fexplanation=fexplanation+’_’+fdetailfullname from t_Voucherentry
    最后,为方便导入数据,可把记录按年度分开:
Select * into t_voucherentry_2008 from t_voucherentry where fyear=2008;
Select * into t_voucherentry_2009 from t_voucherentry where fyear=2009;
Select * into t_voucherentry_2010 from t_voucherentry where fyear=2010;
    (四)凭证主表:t_Voucher
    1、基本情况
存放从2006至2011年多年度电子凭证,凭证号不重复。通过FVoucherID与凭证辅助表相关系
    2、重点关注的字段,如表5所示:
序号
字段名称
含义
备注
1
FVoucherID
凭证内码
 
2
FYear
会计年度
 
3
FDate   
凭证日期
 
4
FPeriod
会计期间
 
5
FExplanation  
摘要
 
表5
    3、数据整理过程
    (1)对摘要(Fexplanation)进行更新
    因为前面对凭证辅助表的摘要进行了更新,为使凭证表中的摘要与之相一致,也应对摘要内容进行更新。
update t_voucher set t_voucher.fexplanation = t_voucherentry.fexplanation
from t_voucher,t_voucherentry
where t_voucher.fvoucherid=t_voucherentry.fvoucherid and t_voucherentry.fentryid=0
    至此,数据导入AO前,要做的数据整理工作全部完成,接下来要具体向AO中导入数据时,将要用到的表有如表6所示:
序号
表名
含义
1
t_Account
会计科目表
2
t_Balance_new_2008
科目余额表(2008年度)
3
t_Balance_new_2009
科目余额表(2009年度)
4
t_Balance_new_2010
科目余额表(2010年度)
5
t_Voucher_2008
凭证主表(2008年度)
6
t_Voucher_2009
凭证主表(2009年度)
7
t_Voucher_2010
凭证主表(2010年度)
8
t_VoucherEntry_2008
凭证辅助表(2008年度)
9
t_VoucherEntry_2009
凭证辅助表(2009年度)
10
t_VoucherEntry_2010
凭证辅助表(2010年度)
表6
    第三步:账表重建,生成电子账套
    为方便起见,可以将上述表从SQL Server 2000导出到ACCESS。然后,将2008-2010三个年度数据分别手工导入AO。在进行账表重建后,发现分录数不对,在科目余额表或会计科目中多数科目只显示有一级科目的内容,而没有二级科目及以下级次的科目凭证信息。我们又从AO后台数据库入手进行分析,发现是由会计科目表中的科目级别只有一级科目显示为1,其它均为0,且上级科目代码字段均为空两个字段。所以,应想办法将这两个字段值填上正确的级次和科目代码,语句如下:
    更新科目级别:(在ACCESS环境下更新)
UPDATE 会计科目表 SET 科目级别=2 where len(科目代码)=7;
UPDATE 会计科目表 SET 科目级别=3 where len(科目代码)=9;
UPDATE 会计科目表 SET 科目级别=4 where len(科目代码)=11;
    更新上级科目代码:(在ACCESS环境下更新)
UPDATE 会计科目表 SET 上级科目代码=mid(科目代码,1,4) where len(科目代码)=7;
UPDATE 会计科目表 SET 上级科目代码=mid(科目代码,1,7) where len(科目代码)=9;
UPDATE 会计科目表 SET 上级科目代码=mid(科目代码,1,9) where len(科目代码)=11;
    然后,再次进行账表重建即可。
打印此文 关闭窗口