用友財務(wù)軟件是目前國內(nèi)財務(wù)領(lǐng)域中使用得最廣泛的一種,,審計署下發(fā)的AO軟件中,,就可以直接導(dǎo)入用友多個版本的數(shù)據(jù),給審計人員帶來極大的方便,。但有時審計人員會面對幾十甚至上百個帳套,,如果逐個處理,未免費時費力,。本文針對用友8.51的一個備份文件作一點分析,,對其中各關(guān)鍵步驟給出一個程序處理的辦法,最后給出一個解決用友8.51備份文件批量導(dǎo)入的流程,。一點粗淺想法,,拋磚引玉,同時也希望能給大家一點啟示,。
二,、分析過程
用友8.51在備份的時候,一般會產(chǎn)生兩個文件:UFDATA.BA_和UfErpYer.Lst.其中UfErpYer.Lst比較小,,不到1K,,而UFDATA.BA_通常比較大。由此,,我們判斷,,財務(wù)數(shù)據(jù)應(yīng)該在UFDATA.BA_中。
我們用UltraEdit軟件打開UfErpYer.Lst文件,,發(fā)現(xiàn)它其實就是一個文本文件,,保存著備份相關(guān)的一些信息,如軟件版本,、備份日期,、帳套年度,、文件路徑等。而打開UFDATA.BA_文件時,,我們發(fā)現(xiàn)是一堆亂碼,,甚至找不到常見的一些文件頭的信息。因此我們初步判斷它有可能是壓縮過的文件,。而且,,從常理講,考慮到磁盤空間的問題,,數(shù)據(jù)文件備份的時候通常也會壓縮處理,。
嘗試用WinRar打開UFDATA.BA_,成功,。解壓后,,得到一個文件:UFDATA.文件沒有后綴名,因此我們還是先用UltraEdit打開,。在文件頭部,,我們看到有“TAPE”、“Microsoft SQL Server”等字樣,,因此我們初步判斷它跟SQL Server有關(guān),。
根據(jù)以上思路,我們反過來比較,,查看SQL Server數(shù)據(jù)庫的各種文件的頭部,看是否有與UFDATA 文件頭相似的文件,。SQL Server數(shù)據(jù)庫中,,與數(shù)據(jù)相關(guān)的文件,我們平時接觸比較多的主要有數(shù)據(jù)文件和備份設(shè)備文件,。新建一個空的數(shù)據(jù)庫,,用UltraEdit查看它的數(shù)據(jù)文件的頭部,未發(fā)現(xiàn)相關(guān)字樣,,而創(chuàng)建一個備份設(shè)備后,,查看該文件的頭部,正好跟UFDATA文件的頭部是一樣的,。因此我們初步判定UFDATA文件為SQL Server數(shù)據(jù)庫的備份設(shè)備文件,。并且,我們知道TAPE是磁帶的意思,,而SQL Server中跟磁帶相關(guān)的通常與數(shù)據(jù)庫的備份有關(guān)系,。
接下來我們就分析UFDATA文件中的內(nèi)容。打開SQL Server的企業(yè)管理器,,新建一個備份設(shè)備,,并將文件名指定我我們解壓后得到的UFDATA文件,。確定后,查看新建立備份設(shè)備的內(nèi)容,,發(fā)現(xiàn)它其實是一個(或多個)數(shù)據(jù)庫的完全備份,。將它還原后,我們可以看到,,這是用友的一個帳套數(shù)據(jù)庫,。
對一個本地的數(shù)據(jù)庫,我們就可以根據(jù)自己的需要,,進(jìn)行相關(guān)的查詢和操作了,。到此為止,我們其實已經(jīng)完成了將一個用友U8.51的備份文件轉(zhuǎn)換成我們可操作數(shù)據(jù)庫的過程,。但如果僅僅如此,,那么本文其實是沒有什么意義的,因為這個步驟我們可以很容易地利用AO軟件來實現(xiàn),。
在實際工作中,,我們遇到的往往不是單個的帳套。由于很多企業(yè)有很多獨立核算的分公司,,并且每個公司每年都要建一套帳,,因此,我們面對的往往是十幾個,、幾十個帳套,,有時甚至?xí)鎸ι习賯帳套,而AO中又沒有提供批量導(dǎo)入的辦法,,如果一個一個導(dǎo)入的話效率太低,。基于這種情況,,本文就利用上述分析的結(jié)果,,給出一個解決的辦法,能讓我們批量導(dǎo)入用友的備份數(shù)據(jù),。
三,、解決辦法
要實現(xiàn)批量導(dǎo)入,必須編寫程序,,實現(xiàn)上述分析過程中的解壓,、添加備份設(shè)備、還原數(shù)據(jù)庫,、抽取數(shù)據(jù)等步驟,。我們首先對每一個關(guān)鍵步驟給出相應(yīng)的解決辦法,最后再給出一個總體的流程。
文件解壓,;利用Win32的API:ShellExecuteEx,,調(diào)用WinRar將壓縮文件解壓到指定的臨時文件夾下,并得到解壓程序的句柄(前提是已經(jīng)安裝了WinRar軟件),。其中要用到SHELLEXECUTEINFO這個結(jié)構(gòu),,用來指定WinRar的路徑以及相應(yīng)的解壓參數(shù)。具體可以查閱Win32 API幫助,。
添加設(shè)備,;利用SQL Server 2000的存儲過程sp_addumpdevice添加設(shè)備文件。
還原數(shù)據(jù)庫,;利用SQL Server 2000的命令Restore DATABASE,,從設(shè)備中的備份還原數(shù)據(jù)庫。另外,,查看備份文設(shè)備中的備份數(shù)據(jù)庫信息可以使用命令:RESTORE HEADERONLY.
刪除備份設(shè)備,;可以使用存儲過程:sp_dropdevice.詳細(xì)信息可以查閱SQL Server 2000的幫助文檔。
接下來我們就給出批量導(dǎo)入用友8.51備份文件的主要流程:
定義SHELLEXECUTEINFO類型的變量:SI
指定SI的相關(guān)參數(shù):動作為“Open”,、文件為WinRar的執(zhí)行文件(指定長文件名)
對每個備份文件UFDATA.BA_,,循環(huán)處理(循環(huán)1)
得到文件路徑和文件名,以及某些帳套信息(公司,、年份等等)
指定SI的參數(shù)為:x sFile *.* sTemp
(注:sFile為備份文件的長文件名,,sTemp為一個臨時文件夾)
調(diào)用:ShellExecuteEx SI
獲取SI的狀態(tài)直到它執(zhí)行完畢
在數(shù)據(jù)庫服務(wù)器上執(zhí)行:sp_addumpdevice disk,U8Back,,physical_name
(注:U8Back為我們?yōu)樵O(shè)備取的名,,physical_name為解壓后得到的UFDATA文件的長文件名)
執(zhí)行:RESTORE HEADERONLY From U8Back,得到設(shè)備中的備份列表記錄集
(注:一條記錄對應(yīng)于一個備份)
對備份列表記錄集的每條記錄,,循環(huán)處理(循環(huán)2)
根據(jù)列表記錄集中的內(nèi)容,,得到數(shù)據(jù)庫的某些信息(如帳套年份)
Restore DATABASE UF8 From U8Back with File=file_number,Move Ufmodel
To DataFile,,MOVE Ufmodel_LOG TO LogFile,, replace
(注:file_number為從備份列表記錄集中得到的要還原的備份集編號,,DataFile與LogFile分別為還原后數(shù)據(jù)文件與日志文件的長文件名)
抽取數(shù)據(jù)庫中相應(yīng)的數(shù)據(jù)
(注:如果把多個帳套數(shù)據(jù)合并到一起,,需要根據(jù)前面得到的帳套信息將數(shù)據(jù)進(jìn)行區(qū)分,例如:將各表加入帳套的年份,、公司,、地區(qū)等字段或是能區(qū)分各帳套的一個關(guān)鍵字字段進(jìn)行區(qū)分)
結(jié)束循環(huán)1
在數(shù)據(jù)庫服務(wù)器上執(zhí)行:sp_dropdevice U8Back,刪除設(shè)備
結(jié)束循環(huán)2
善后工作,,如刪除臨時文件等
四,、結(jié)束語
本文是作者的一次實際經(jīng)歷的總結(jié)。在一次企業(yè)審計中,審計人員拿到了一百六十多個備份文件,,并且任務(wù)要求將這些帳套中的有關(guān)數(shù)據(jù)進(jìn)行合并,,以便分析。最后我們以本文所述辦法進(jìn)行處理,,代碼寫完后,,用了不到一個晚上的時間,就將所有帳套處理完成,。想法比較粗淺,,做法也比較簡單,在這里總結(jié)一下,,也希望大家批評與指點,。
責(zé)任編輯:admin1
- 上一篇文章: 沒有了
- 下一篇文章: 中小企業(yè)選擇會計軟件應(yīng)注意的問題