
【摘要】針對在實驗教學中常遇到一些用友客戶端無法解決的業務數據問題,本文以總賬及其下級明細科目合計金額不一致的問題為例,從用友后臺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
【作 者】
胡志宙
【作者單位】
(嘉應學院經濟與管理學院 廣東梅州 514015)