![](/images/contact.png)
建立憑證的有聲校驗系統(tǒng)
朱偉民
一、引言
目前所流行的會計軟件基本上都是“無聲”的。人機(jī)交互一般都是通過鍵盤、鼠標(biāo)、顯示屏、打印機(jī)實現(xiàn)的。事實上,在開發(fā)會計軟件時,我們可以引入多媒體技術(shù),讓電腦與人以“說話”的形式進(jìn)行交流,傳遞指令和信息,從而使電算化會計核算工作做得更有效、更迅捷、更好。
在帳務(wù)系統(tǒng)憑證輸入方式設(shè)計中,我們可以使用語音輸入技術(shù)(如IBM的Via Voice)將憑證讀入電腦,實現(xiàn)憑證語音錄入。由于會計核算過程中所涉及的詞匯量有限,重復(fù)出現(xiàn)頻率高,因此此項技術(shù)實現(xiàn)難度將遠(yuǎn)低于一般的文章語音錄入。在帳務(wù)系統(tǒng)憑證校對和帳簿信息查詢中,我們可以讓電腦讀憑證和帳簿,實現(xiàn)有聲校對、有聲查詢。本文就VFP系統(tǒng)環(huán)境下,如何應(yīng)用多媒體技術(shù)開發(fā)有聲憑證校驗系統(tǒng),作一個介紹。
二、界面設(shè)計
本系統(tǒng)憑證審核界面(見附圖)主要涉及兩個表文件:記帳憑證表和聲源文件表。記帳憑證表結(jié)構(gòu)如下:
create table pzk (rq c (8), pzh n(4),zy c(40,fy c(2),kmdm1 c(5),yjkm1 c(14),ejkm1 c (14), jf1 n (12.2),df 1 n(12.2),kmdm2 c(5),yjkm2 c(14),e-jkm2 c(14),jf2 n (12.2),df2 n(12.2),kmdm3 c(5),yjkm3 c(14),ejkm3 c(14),jf3 n(12.2),df3 n(12.2),kmdm4 c(5),yjkm4 c(14),ejkm4 c(14),jf4 n(12.2),df4 n(12.2),hidan c(8),shenhe c(8),jizhang c(8),bz c(4)
其中各字段含義分別是:日期、憑證號、摘要、科目代碼、一級科目名、二級科目名、借方金額、貸方金額、制單人、審核人、記帳人、憑證標(biāo)志。其中科目代碼、科目名稱、借方金額、貸方金額都重復(fù)設(shè)置了四個字段,以使表中一條記錄對應(yīng)一張憑證。
聲源文件表結(jié)構(gòu)如下:create table sndjd(sd-name c(11),sdpath c(20)
其中sdname中存放應(yīng)發(fā)聲的文字作為檢索標(biāo)志,sdpath中存放聲音文件在磁盤中的路徑,如上表所示。
在表單中設(shè)計了一組命令按鈕,以實現(xiàn)憑證審核校對所需的各項功能。表單中安排的科目代碼文本框的目的,主要是供系統(tǒng)根據(jù)文本框內(nèi)的科目代碼檢索出對應(yīng)的發(fā)聲文件所用。在電腦中用“錄音機(jī)”通過話筒錄下各數(shù)字和會計科目對應(yīng)的聲音文件,存入C:zwwav子目錄中,完成聲源資料的儲備。
三、憑證有聲校驗的實現(xiàn)
本系統(tǒng)憑證的有聲校驗是借助于Foxtoold.fll中的工具函數(shù)Regfn()和Callfn(),通過調(diào)用動態(tài)鏈接庫Mmsystem.dll中的API函數(shù)sndPlaySound實現(xiàn)的。在表單中安排一個“有聲校驗”按鈕,它的功能是對表單中的憑證號、科目名稱、借貸方向及金額進(jìn)行朗讀,以供操作者校對。實現(xiàn)此功能的相關(guān)程序代碼如下:
ADD OBJECT command8 AS commandbutton WITH; &&建立“有聲校驗”按鈕
Top=309;
Left=18;
Height=25;
Width=65;
FontSize=11;
Caption=”有聲校驗”;
Name=“Command8”
PROCEDURE Init
public sound1, shuju
set library to foxtools.fll &&裝入程序庫
sound1=regfn(“sndplaysound”,“CI”,“I”,Mm-system”) &&注冊函數(shù)
ENDPROC
PROCEDURE Unload
=callfn(sound1,””,10) &&關(guān)閉聲音及程序庫
set library to
clea dlls
sele 1
use stpz
dele for kmdm1=spac(6)
pack
use
sele 2
use
sele 1
ENDPROC
PROCEDURE command8.Click
sele 2
=callfn(sound1,”C:zwwavpzh.wav”,1)
=inkey(0.5)
shuju=thisform.pzh1.value
do snd &&調(diào)用snd.prg讀憑證號
for I=1 to 4&&循環(huán)中依次讀憑證中每行的科目名,借貸方向及金額
n=str(I)
nkmdm=’kmdm’+allt(’&n’)+’1’
njf=’jf’+allt(’&n’)+’1’
ndf=’df’+allt(’&b’)+’1’
kkm=’thisform.’+allt(’&nkmdm’)+’’value’
jjf=’thisform.’+allt(’&njf’)+’.value’
ddf=’thisform.’+allt(’&ndf’+’.value’
loca for sndjd.cdname=allt(&kkm) &&由科目代碼找科目名聲音文件路徑
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)&&讀科目名
=inkey(0.5)
if &jjf<>0 and &ddf=0
=callfn (sound1,“C:zwwavd.wav”,1) &&讀借方
=inkey((0.5)
shuju=&jjf
endif
if &jjf=0 and &ddf<>0
=Callfn(sound1,“C:zwwavc.wav”,1) &&讀貸方
=inkey(0.5)
shuju=&ddf
endif
do snd&&調(diào)用snd.prg讀金額
=inkey(0.8)
endfor &&以上循環(huán)中依次讀憑證中每行的科目名,借貸方向及金額
ENDPROC
*********snd.prg*********
sele 2
if shuju>=10000 and shuju<100000 &&讀萬位數(shù)
loca for sndjd.sdname=allt(str(int(shuju/100000))))
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
=callfn(sound1,”C:zwwav10000.way”.1) &&讀位權(quán)
=inkcy((.5)
Shuju=shuju-int(shuju/10000)*10000
if shuju<1000 and shuju<>0 &&若千位為0,只讀數(shù)不讀位權(quán)
=callfn(sound1,”C:zwwav.wav,1)
=inkey(0.5)
endif
endif
if shuju>=1000 and shuju<10000 &&讀千位
loca for sndjd.sdname=allt(str (int (shuju/1000)))
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
=callfn(sound1,
=callfn(sound,“C:zwwav1000.wav”,1)
=inkey(0.5)
shuju=shuju-int(shuju/1000)*1000
if shuju<100 and shuju<>0
=callfn(sound1,“C:zwwav.wav”,1)
=inkey(0.5)
endif
endif
if shuju>=100 and shuju<1000 &&讀百位
loca for sndjd.sdname=allt(str int (shuju/100))
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
=callfn(sound1,“C:zwwav100.wav”,1)
=inkey(0.5)
shuju=shuju-int(shuju/100)*100
if shuj<10 and shuju<>0
=callfn(sound1,“C:zwwav.wav”,1)
=inkey(0.5)
endif
endif
if shuju>=10 and shuju<100 &&讀十位
loca for sndjd.sdname=allt(str(int(shuju/10)))
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
=callfn(sound1,“C:zwwav10.wav”,1)
=inkey(0.5)
shuju=shuju-int(shuju/10)*10
endif
if int(shuju)<>0 &&讀個位
loca for sndjd.sdname=allt(str(shuju))
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
shuju=shuju-int(shuju)
endif
if shuju>0
=callfn(sound1,“C:zwwavdian.wav”,1) &&讀小數(shù)點
=inkey(0.5)
shuju=shuju*100
loca for sndjd.sdname=allt(str (int (shuju/10))) &&十分位數(shù)
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
shuju=shuju-int(shuju/10)*10
endif
if shuju>0
loca for sndjd.sdname=allt(str (shuju)) &&讀百分位數(shù)
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
endif
sele 1
retu
以上子程序snd.prg只讀出小于十萬的數(shù),小數(shù)點后只讀兩位。若要讀更大范圍的數(shù),可類似地擴(kuò)充程序段。Inkey()函數(shù)用來間隔兩次發(fā)聲時間,以保持語音清晰。
本系統(tǒng)在帶有聲卡和音箱的pⅡ電腦上,使用Visual Foxpro 6.0軟件編程,通過實際運行檢驗。
作者單位:上海立信會計高等??茖W(xué)校