建立凭证的有声校验系统
建立凭证的有声校验系统
朱伟民
一、引言
目前所流行的会计软件基本上都是“无声”的。人机交互一般都是通过键盘、鼠标、显示屏、打印机实现的。事实上,在开发会计软件时,我们可以引入多媒体技术,让电脑与人以“说话”的形式进行交流,传递指令和信息,从而使电算化会计核算工作做得更有效、更迅捷、更好。
在帐务系统凭证输入方式设计中,我们可以使用语音输入技术(如IBM的Via Voice)将凭证读入电脑,实现凭证语音录入。由于会计核算过程中所涉及的词汇量有限,重复出现频率高,因此此项技术实现难度将远低于一般的文章语音录入。在帐务系统凭证校对和帐簿信息查询中,我们可以让电脑读凭证和帐簿,实现有声校对、有声查询。本文就VFP系统环境下,如何应用多媒体技术开发有声凭证校验系统,作一个介绍。
二、界面设计
本系统凭证审核界面(见附图)主要涉及两个表文件:记帐凭证表和声源文件表。记帐凭证表结构如下:
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)
其中各字段含义分别是:日期、凭证号、摘要、科目代码、一级科目名、二级科目名、借方金额、贷方金额、制单人、审核人、记帐人、凭证标志。其中科目代码、科目名称、借方金额、贷方金额都重复设置了四个字段,以使表中一条记录对应一张凭证。
声源文件表结构如下:create table sndjd(sd-name c(11),sdpath c(20)
其中sdname中存放应发声的文字作为检索标志,sdpath中存放声音文件在磁盘中的路径,如上表所示。
在表单中设计了一组命令按钮,以实现凭证审核校对所需的各项功能。表单中安排的科目代码文本框的目的,主要是供系统根据文本框内的科目代码检索出对应的发声文件所用。在电脑中用“录音机”通过话筒录下各数字和会计科目对应的声音文件,存入C:zwwav子目录中,完成声源资料的储备。
三、凭证有声校验的实现
本系统凭证的有声校验是借助于Foxtoold.fll中的工具函数Regfn()和Callfn(),通过调用动态链接库Mmsystem.dll中的API函数sndPlaySound实现的。在表单中安排一个“有声校验”按钮,它的功能是对表单中的凭证号、科目名称、借贷方向及金额进行朗读,以供操作者校对。实现此功能的相关程序代码如下:
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”) &&注册函数
ENDPROC
PROCEDURE Unload
=callfn(sound1,””,10) &&关闭声音及程序库
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 &&调用snd.prg读凭证号
for I=1 to 4&&循环中依次读凭证中每行的科目名,借贷方向及金额
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&&调用snd.prg读金额
=inkey(0.8)
endfor &&以上循环中依次读凭证中每行的科目名,借贷方向及金额
ENDPROC
*********snd.prg*********
sele 2
if shuju>=10000 and shuju<100000 &&读万位数
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) &&读位权
=inkcy((.5)
Shuju=shuju-int(shuju/10000)*10000
if shuju<1000 and shuju<>0 &&若千位为0,只读数不读位权
=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) &&读小数点
=inkey(0.5)
shuju=shuju*100
loca for sndjd.sdname=allt(str (int (shuju/10))) &&十分位数
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)) &&读百分位数
ddd=sndjd.sdpath
=callfn(sound1,“&ddd”,1)
=inkey(0.5)
endif
sele 1
retu
以上子程序snd.prg只读出小于十万的数,小数点后只读两位。若要读更大范围的数,可类似地扩充程序段。Inkey()函数用来间隔两次发声时间,以保持语音清晰。
本系统在带有声卡和音箱的pⅡ电脑上,使用Visual Foxpro 6.0软件编程,通过实际运行检验。
作者单位:上海立信会计高等专科学校