2013年 第 20 期
总第 672 期
财会月刊(下)
财会电算化
用友U8.61总账与明细金额不一致问题解析

作  者
胡志宙

作者单位
(嘉应学院经济与管理学院 广东梅州 514015)

摘  要

      【摘要】针对在实验教学中常遇到一些用友客户端无法解决的业务数据问题,本文以总账及其下级明细科目合计金额不一致的问题为例,从用友后台SQL数据库方面对此做些分析,并提出解决问题的方法。
【关键词】用友ERP   财务软件   SQL语言   实验教学

在用友会计电算化实验教学课中常遇到一些会计业务数据错误的问题,而有些问题是无法通过用友的企业门户或系统管理等客户端来解决的,如我们在实验中较常遇到的总账与其下级明细科目合计金额不一致就属于此类问题。针对类似的用友软件数据出现的问题,我们试从数据库方面来分析该问题产生的原因并提出解决的方法。
一、余额数据出现不一致的问题
我院会计电算化实验教学软件使用的是用友U8.61网络版,即是在专门的服务器上为每个学生建立一个独立的账套,学生通过client/Serve的模式从企业门户登录用友服务器上分配给自己的账套,独立完成会计电算化总账和报表模块的实验操作。在期初余额录入时学生较常遇到总账一级科目与其明细科目合计金额不一致的问题,以材料采购(1401)为例,它的一级科目、明细科目及科目的余额如图1所示:
从图2可以看出,一级科目材料采购的金额为49 255,是由A材料、B材料、C材料、燃料、其他材料和低值易耗品六个二级(下级)明细科目金额的总和构成。正常情况下,材料采购一级科目的金额和它的下级明细科目金额的总和两者应该是一致的,但在实际中却经常出现两者金额不一致的现象,这种现象主要有两种情况:①材料采购一级科目的金额小于其下级明细科目金额的总和。此时如果删除其全部下级科目的金额,会发现材料采购一级科目的金额为负数。以图2为例,当删除其全部下级科目的期初余额时,此时材料采购金额本应该为零,但其却显示为-3 000。②材料采购一级科目的金额远大于其下级明细科目金额的总和,甚至达到两倍,即在图2中材料采购金额本应为49 255,却显示为98 510。
手工会计操作中采用平行登记法记账,即是凡涉及明细账户的同一笔经济业务要在总分类账户和其所属明细分类账户中按同时、同向、同金额的方法进行登记,月末再将总分类账和明细账两者的金额进行核对,一般不容易出错。而在会计电算化的操作中,无论是期初余额还是凭证的录入,录入的金额都是直接录入到末级科目下,一级及非末级科目是无需录入数据的(用友期初余额录入界面,一级和非末级的科目余额输入栏为灰色,呈不可录状态),总账(一级)科目的金额是由系统根据其下级明细科目的金额自动计算得出,所以发生两者金额不一致的现象,我们可以判断是软件或系统的问题,而非人为的错误操作所致。
另外,由于一级科目有数据(负金额),如按通常处理错误的方法——通过删除材料采购一级及其明细科目的金额和科目再重建的方法是行不通的。余额不一致不仅仅影响了材料采购单个科目和资产账户,而且还影响到期末余额发生表、资产负债表等报表数据,并导致试算不平衡,从而无法记账和结账。一个小错误影响了全局,而用户明知错误所在,又因无法修改而束手无策。
二、问题产生的原因分析及纠错
发生余额不一致问题后,以往的解决办法只能是将此账作废并重建账套、重新进行基础资料的设置等初始化工作,由此增加了工作量且令人沮丧,尤其是在电算化会计考试中,出现这种情况会严重地影响考试。因此找出问题发生的原因和快速的解决方法是非常必要的。针对这种情况,我们试从用友后台SQL数据库方面分析查找出现这种余额不一致的原因。用友财务软件采用客户/服务器模式,当用户使用系统管理程序建立账套时,会在服务器的SQL数据库中建立一个应用数据库,其命名规则是ufdata_账套号_年度,用于储存各年度的账务数据。假定要建立一个账套号为001、会计期间为2010的账套,则会在后台SQL数据库建立一个ufdata_001_2010的数据库。数据库中储存有各种数据表,我们试从其相关的数据表中来查找问题的原因。
1. 材料采购总账科目金额少于其下级明细科目金额的总和。在期初余额录入中删除其全部下级科目的金额,会发现一级科目材料采购的金额出现-3 000,如图3所示:
在ufdata_001_2010数据库中的gl_accsum表为科目期初余额数据表,录入期初余额后,各会计科目含总账和明细科目的各会计期间发生的金额数据储存在本表中。图4为在SQL查询分析器中使用SQL语言查询gl_accsum表十二月份的材料采购科目的期初余额数据。数据库中gl_accsum表中的科目数据与用友软件企业门户的期初余额录入界面的数据是一致的。图4(材料采购科目)为当出现负数现象时使用SQL语句查询gl_accsum表的查询结果。从图4记录1可以看出,1401材料采购的数据有错误,cbegind_c字段值应为平,me字段不应有金额。出现这种情况的原因可能是:当用户录入期初余额时,或因系统资源负载(网络版、多账套接入),或系网络方面的原因造成SQL数据库的Transact-SQL事务回滚而产生的错误。解决问题的方法只需在gl_accsum表中删除或修改1401记录,便可解决该问题。
2. 总账(一级)科目的金额是其下级明细科目金额总和的两倍。ufdata_001_2010数据库中code表为储存会计科目的数据表,表中记录了会计科目名称、科目编码、账户类型和借贷方向等属性(见图1)。在code表中bend字段是逻辑数据类型,值为0或1,当bend字段值为1时,说明该会计科目是末级科目;当bend字段值为0时,则其为非末级科目——父级或一级科目。如图1中1401和140106为非末级科目,所以其bend字段值为0,其他末级科目bend字段值为1。出现两倍的现象是因为:一级科目记录其bend字段值应为0,但因系统的错误而变成1,因此系统把一级或父级科目错误地当成末级科目,从而再次重复计算其金额。如材料采购的bend字段值应为0,但因系统的错误变为1,按正常情况1401的金额是49 255,但因系统误认为材料采购1401是末级科目,其金额49 255再次参与计算,即材料采购科目的金额98 510为正确金额的两倍。纠正错误的方法只需把bend字段值1改为0,即让系统确认材料采购为一级科目,使其金额不再参与计算。
三、基于SQL语言的解决方法
用友软件采用的是MS SQL Server关系型数据库,运用SQL(结构查询语言)可实现对数据库数据的查询、修改或删除等。通过分析用友账套所属的数据库和表结构,并明了金额产生不一致的原因后,我们只需采用SQL语言就可以直接修改或删除数据库中因系统出现的错误记录。
使用SQL语言修改或删除数据,之前必须先建立与数据库的连接。连接数据库的方法可以在服务器或已安装SQL2005数据库客户端的计算机上使用SQL查询分析器,它是一个界面友好的图形工具,能为编写、执行SQL语句提供一种交互式环境并返回执行结果。另一种方法是在DOS提示符下使用sqlcmd实用工具,登录SQL服务器执行Transact-SQL语句,来实现数据的修改。
本实例是采用sqlcmd工具执行SQL命令来实现数据库数据的修改,具体命令及注释如下:
1. 登录SQL数据库并打开账套所属数据库。
Sqlcmd-S uf-U sa/∗用sa用户登录SQL数据库名为UF的服务器,输入密码后登录∗/
Use ufdata_001_2010/∗打开账套001出错的数据库∗/
Go/∗ go为SQL语句的结束并执行语句命令,下面省去∗/。
2. 对于总账科目的金额小于其下级明细科目金额的总和的修改方法,可以直接使用delete命令删除gl_accsum数据表中出错的总账及其下级所有的明细科目数据,然后在期初余额录入重新录入。
Delete gl_accsum where ccode like "1401%"
/∗删除gl_accsum表中科目代码为1401的总账及其下级所有的明细科目数据记录,其中1401%中的%号为通配符,即删除条件为一级科目1401下的所有下级明细科目记录∗/。
3. 总账科目的金额是其下级明细科目金额总和的两倍,其原因是在code数据表中一级或父级科目的bend字段值因系统错误设为1,只需用update命令把值1更改为0即可:
Update code set bend=0 where ccode="1401"
在用友软件应用中,经常遇到诸如余额不一致等情形无法通过用友程序来解决的问题,在了解用友账套的数据结构的基础上,我们可从其后台数据库分析入手,尝试采用SQL语言来直接有效地解决类似的数据问题。
主要参考文献
1. 何日胜.会计电算化系统应用操作(第四版).北京:清华大学出版社,2011
2. Dejan Sunderic著.熊桂喜译.SQL Server 2000高级编程技术.北京:清华大学出版社,2002
3. 袁鹏飞.中文版SQL Server 2000数据库系统管理.北京:人民邮电出版社,2001