“总会计2000”数据库数据采集转换分析
2005 年,“金审工程”应用系统之一“现场审计实施系统”(简称AO)在我市审计机关推广应用。在财政预算执行审计中,针对我市财政系统普遍使用“总会计 2000”软件的情况,重庆市审计局有关人员对“总会计2000”的数据库数据进行了认真分析、研究,制作了该软件数据库数据导入模板,极大地方便了审计人员采集转换“总会计2000”数据,推动了AO软件在我市财政审计中的广泛应用。
一、获取原始数据
“总会计2000”是由北京四方志诚软件公司开发,经财政部推荐,在全国财政系统普遍推广的会计核算软件。“总会计2000”软件分单用户版和网络版两个版本。
单用户版数据库采用ACCESS,采集原始数据时可直接拷贝“总会计2000”安装目录下的ACCESS文件(扩展名为MDB)即可;网络版数据库采用SQL SERVER,采集原始数据时可使用SQL SERVER的“导入和导出数据”(DTS)功能,将SQL SERVER数据库导出成ACCESS数据库格式。
二、数据库结构分析及处理
(一)会计科目表
1.数据结构分析
在“总会计2000”软件中,会计科目表由基础科目表(BM1BASE01)和会计科目表(BM1KJ01)组成。
基础科目表(表名BM1BASE01)中存储包括科目源码(SCM),科目级次(JC),科目名称(NAME),科目类型(ATT),科目年度(YEAR)等会计科目的基本信息。
会计科目表(表名BM1KJ01)中存储包括科目源码(SCM),科目级次(JC),科目年初余额(VALOO),余额方向(SF_FLAG),基础科目源码(BASESCM),科目年度(YEAR),SCM_1~SCM_8,是否末级科目(JC_FALG),自动科目编码(KJ_KMH)等字段。
在BM1KJ01 中自动科目编码(KJ_KMH)可由“总会计2000”软件按照科目级次自动生成,如果KJ_KMH字段为空,可根据BM1KJ01的 SCM_1~SCM_8字段另行生成科目编码(限于篇幅,本文不作详细介绍)。本文仅就KJ_KMH已经自动生成的情况进行分析。
2.数据处理
在转换数据的过程中,AO 软件会计科目表的“科目编码”字段可直接由BM1KJ01生成,“科目名称”字段由BM1KJ01表的“BASESCM”字段连接BM1BASE01表的 “SCM”字段生成,因为我们是对2004年度进行审计,所以只选取科目年度为2004的科目,设置记录筛选条件为BM1KJ01.YEAR=2004.查询生成会计科目表的SQL语句为:
(SQL1)
Select BM1KJ01.KJ_KMH AS 会计科目,BM1BASE01.NAME AS 科目名称 From BM1KJ01 INNER JOIN BM1BASE01 ON BM1KJ01.BASESCM=BM1BASE01.SCM WHERE BM1KJ01.YEAR=2004
(二)科目余额表
科目余额表可由BM1KJ01直接查询生成,仅需设置筛选条件筛选出2004年的科目余额即可。
查询生成科目余额表的SQL语句为:
(SQL2)
Select KJ_KMH AS 科目编码,VAL00 AS 科目余额,SF_FLAG AS 余额方向 From BM1KJ01 WHERE YEAR=2004
(三)凭证表
在“总会计2000”软件中,凭证表内容由BM1PD01、BM1PD02、BM1PD03三张表共同组成。在AO软件中,通过对此三张表的组合查询,生成AO软件的凭证表。
1.BM1PD01处理
(1)数据结构分析
经过分析,我们发现,BM1PD01是总账科目凭证库,主要存放每一张凭证所涉及的总账科目金额和凭证基本信息(相当于凭证主表)。记录主要结构如“表一”,其中,英文是源表字段名。
(表一)
PDH凭单号 | YEAR年 | MONTH月 | DAY日 | FDJ附单据 | ZY摘要 | KM_ONE借方科目 | KM_TWO贷方科目 | VAL金额 | FLM(分录源码) |
8 | 2004 | 1 | 10 | 23 | 1183 | 1182 | 10000.00 | 236 |
分析表一可以看出,在BM1PD01中,一张凭证只用一条记录来表示,要生成AO软件能识别的凭证分录,应把BM1PD01中每一条记录一分为二,产生liang条凭证分录,如“表二”。
(表二)
PDH凭单号 | YEAR年 | MONTH月 | DAY日 | FDJ附单据 | ZY摘要 | KMH科目源码 | JD借贷方向 | VAL金额 | FLM(分录源码) |
8 | 2004 | 1 | 10 | 23 | 1183 | 1 | 10000.00 | 236 | |
8 | 2004 | 1 | 10 | 23 | 1182 | -1 | 10000.00 | 236 |
在“表二”所示的凭证分录中,每一条分录对应的会计科目都是总账科目,如果该总账科目有下级明细科目,则此金额是本张凭证中该总账科目的汇总金额,因该总账科目的明细分录已在BM1PD02或BM1PD03中,故此凭证分录不能作为凭证库的一部分;如果该总账科目无下级明细科目,则此金额是该总账科目的实际发生额,此凭证分录应作为凭证库的一部分。因此在BM1PD01中分离出无明细总账科目的凭证分录成为处理BM1PD01的关键。
判断BM1PD01中的总账科目是否有明细科目,必须根据其科目源码,连接BM1KJ01表,查询生成是否有明细科目标记(JC_FLAG)字段,JC_FLAG=TRUE表示该总账科目无明细科目,JC_FLAG=FALSE表示该总账科目有明细科目。
(2)数据处理
A.查询生成借方分录
查询生成BM1PD01的借方分录表:用BM1PD01的“KM_ONE”字段连接会计科目表(BM1KJ01)的“SCM”字段,合并“YEAR”、“MONTH”、“DAY”生成“凭证日期”字段,同时增加表示借贷方向的字段“借贷”并赋值“1”,设置筛选条件
BM1PD01.YEAR=2004 AND BM1KJ01.JC_FLAG=true
具体SQL处理语句为:
(SQL3)
SELECT ‘1’ AS 借贷,A.PDH AS 凭单号,TRIM(STR(A.YEAR))+‘-’+ TRIM(STR(A.MONTH))+‘-’+TRIM(STR(A.DAY)) AS 凭证日期,A.FDJ AS 单据数,A.ZY AS 摘要,A.VAL AS 金额,B.KJ_KMH AS 会计科目 FROM BM1PD01 AS A INNER JOIN BM1KJ01 AS B ON A.KM_ONE=B.SCM WHERE A.YEAR=2004 AND B.JC_FLAG=true
B.查询生成贷方分录
查询生成BM1PD01的贷方分录表:用BM1PD01的“KM_TWO”字段连接会计科目表(BM1KJ01)的“SCM”字段,合并“YEAR”、“MONTH”、“DAY”生成“凭证日期”字段,同时增加表示借贷方向的字段“借贷”并赋值“-1”,设置筛选条件BM1PD01.YEAR=2004 AND BM1KJ01.JC_FLAG=true
具体SQL处理语句为:
(SQL4)
SELECT ‘-1’ AS 借贷,A.PDH AS 凭单号,TRIM(STR(A.YEAR))+‘-’+ TRIM(STR(A.MONTH))+‘-’+TRIM(STR(A.DAY)) AS 凭证日期,A.FDJ AS 单据数,A.ZY AS 摘要,A.VAL AS 金额,B.KJ_KMH AS 会计科目 FROM BM1PD01 AS A INNER JOIN BM1KJ01 AS B ON A.KM_TWO=B.SCM WHERE A.YEAR=2004 AND B.JC_FLAG=true
2.BM1PD02处理
分析发现,BM1PD02存储明细科目借方分录,记录结构如表三。
(表三)
FLM分录源码 | SCM科目源码 | VAL金额 | ZY摘要 |
236 | 1199 | 90000 |
查询生成明细科目借方分录表:用BM1PD02 的“FLM”字段连接BM1PD01的“FLM”字段、BM1PD02的“SCM”字段连接BM1KJ01的“SCM”字段查询生成“凭单号”、“凭证日期”、“附单据”、“会计科目”等字段,增加表示借贷方向的字段“借贷”并赋值“1”,设置筛选条件BM1PD01.YEAR=2004,具体SQL处理语句为:
(SQL5)
SELECT ‘1’ AS 借贷,BM1PD01.PDH AS 凭单号,TRIM(STR(BM1PD01.
YEAR))+‘-’+TRIM(STR(BM1PD01.MONTH))+‘-’+TRIM(STR(BM1PD01.DAY)) AS 凭证日期,BM1PD01.FDJ AS 单据数,BM1PD02.ZY AS 摘要,BM1PD02.VAL AS 金额,BM1KJ01.KJ_KMH AS 会计科目 FROM BM1PD01 INNER JOIN (BM1KJ01 INNER JOIN BM1PD02 ON BM1KJ01.SCM = BM1PD02.SCM) ON BM1PD01.FLM = BM1PD02.FLM WHERE BM1PD01.YEAR=2004
3.BM1PD03处理
BM1PD03存储明细科目贷方分录,数据处理方法与BM1PD02类似,借贷方向字段“借贷”赋值“-1”,具体SQL处理语句为:
(SQL6)
SELECT ‘-1’ AS 借贷,BM1PD01.PDH AS 凭单号,TRIM(STR(BM1PD01.
YEAR))+‘-’+TRIM(STR(BM1PD01.MONTH))+‘-’+TRIM(STR(BM1PD01.DAY)) AS 凭证日期,BM1PD01.FDJ AS 单据数,BM1PD03.ZY AS 摘要,BM1PD03.VAL AS 金额,BM1KJ01.KJ_KMH AS 会计科目 FROM BM1PD01 INNER JOIN (BM1KJ01 INNER JOIN BM1PD03 ON BM1KJ01.SCM = BM1PD03.SCM) ON BM1PD01.FLM = BM1PD03.FLM WHERE BM1PD01.YEAR=2004
4.生成完整凭证表
合并SQL3、SQL4、SQL5、SQL6生成完整凭证表,合并关键字为UNION.即:
(SQL7)
SQL3 UNION SQL4 UNION SQL5 UNION SQL6
其中SQL3、SQL4、SQL5、SQL6为上述具体SQL语句。
三、在AO中转换数据并制作数据库数据导入模板
(一)转换数据
1.通过AO系统“项目管理”→“资料管理”→“从系统引入资料”直接引入获取的“总会计2000”ACCESS数据库数据。
2.生成财务数据中间表时,凭证的存储方式选择“源数据凭证表为一个表”。
3.在“数据导入向导”各步骤中,“会计期间定义”和“科目设置”步骤根据实际情况使用“手工填写”,“科目余额表”、“会计科目表”、“凭证表”的导入均使用“进入SQL执行器”。
4.导入科目余额表
导入科目余额表时,在“SQL语句组”中输入“SQL2”对应的SQL语句,输入相应的临时表名,设置好与AO科目余额表的对应关系,导入即可。
5.导入会计科目表
导入会计科目表时,在“SQL语句组”中输入“SQL1”对应的SQL语句,输入相应的临时表名,设置好与AO会计科目表的对应关系,导入即可。
6.导入凭证表
导入凭证表时,在“SQL语句组”中输入“SQL7”对应的SQL语句,输入相应的临时表名,设置好与AO凭证表的对应关系,导入即可。
(二)制作数据导入模板
在凭证表导入结束后,在“数据导入向导”中单击“保存导入设置”即可将数据转换过程中的步骤(包括SQL语句)保存为一个数据导入模板,并可通过“导入”“导出”功能将此模板分发给其他审计人员使用。
(三)使用数据导入模板
其他审计人员转换数据时,在“数据导入向导”中单击“自动导入”,选择相应模板,设置好数据源即可根据软件提示完成数据库数据的导入。