holiday中文歌词:计算机世界日报: 巧用VFP报表设计器实现发票套打功能

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 09:26:44

巧用VFP报表设计器实现发票套打功能

广东省东莞市石龙镇
梁洁仪

---- 在VFP中设计打印程序有两种方法,一种是编写程序进行打印的方式,另一种就是利用VFP所提供的报表设计器进行报表设计。第一种方法在FOXPRO FOR DOS 2.5中使用得非常普遍,使用这种方法是由于低版本FOXPRO中的报表设计器功能太弱,不能胜任各种复杂的报表设计,特别是在设计符合我国国情的发票打印程序。但使用编程的方法打印发票及报表 通常要编写大量的代码行,不利于程序的开发进度,而且在WINDOWS系统中,打印时使用了打印缓冲的方式,以致在VFP中用程序进行发票或报表打印时,经常会遇到这样的情况:发出一打印命令后,打印机并不立即开始打印,而是要退出VFP系统后才能进行打印。这是由于发出打印命令后,当WINDOWS的打印缓冲区不满的时候,打印机是不会工作的,只有当退出VFP系统后才能正常打印,反之,用VFP报表设计器设计发票套打印功能是不会出现这样的情况,由于报表设计器是对所需打印内容的控件排列,这样能大大地减少编写程序时所录入的代码,把编程者从烦复的代码编写中解脱出来。VFP中提供的报表设计器可以设计包多种样式的排列,运用各种报表控件,可以设计各种复杂的打印作业,甚至打印图形对象,这样比用编程方式设计的打印程序要灵活得多。

---- 本文以一个打印银行委托收费凭证的例子来说明报表设计器在打印单张发票中的实用技巧,完全可以在应用于实际工作中。


(图一)是一个最后完成的打印单据样板。

---- 这种类型的单据打印在国内很普遍,单据中需要打印的内容有委托日期,付款人全称、帐号、开户银行,收款人全称、帐号、开户银行,人民币大、小写,款项内容等。

套打功能的技术要点

---- 打印本单据的技术要点有:

---- 1、如何将数据值型的金额数字转化成人民币大写金额;

---- 2、如何将诸如金额53646.00格式的数值打印在财务栏中,并判断在何位置上打印"¥"符号。

---- 解决了上述两个难题,其它的都好办,只需要运用报表设计器将各种域控件添加到报表中。

---- 以下将整个设计步骤陈述如下:

---- 一、新建一报表文件,打开数据环境,并把需要打印的数据表添加到数据环境中;

---- 二、打开系统菜单中之"页面设置",把本页面设置为自定义的纸张,这里设置为自定义纸张,长:17.5厘米,宽:11.5厘米,请注意,如果要把页面设计为自定义纸张,必须先在WIN95中之控制面板中设置打印机的打印纸也为"自定义",否则在报表设计器中并不能保存新的页面设置。

---- 三、编写人民币大写转换函数及设置转换过程。

---- 本函数是要将打印金额(小写)转化成人民币大写而打印。设需转换金额为10位数字,其中保留两位小数点,下面是函数的代码:

FUNCTION dxxfun(mrmbze)LOCAL s_1,s_2,s_3,s_4s_1="零壹贰叁肆伍陆柒捌玖"s_2="仟佰拾万仟佰拾元角分"s_3=88888888.88s_4=STR(mrmbze*100,10)i=1mm=" "DO WHILE i< =10   s_5=SUBSTR(s_4,i,1)   IF s_5< >" "s_6=SUBSTR(s_1,VAL(s_5)*2+1,2)s_7=SUBSTR(s_2,i*2-1,2)IF s_5="0".AND.i< >4.AND.i< >8s_7=""ENDIFIF (SUBSTR(s_4,i,2)="00").OR.(s_5="0".AND.(i=4.OR.i=8.OR.i=10))  s_6=""      ENDIF      mm=mm+s_6+s_7      IF SUBSTR(s_4,i,1)="0".AND.SUBSTR(s_4,i+1,1)< >"0".AND.(i=4.OR.i=8)mm=mm+"零"      ENDIF   ENDIF   i=i+1ENDDOIF s_5="0"   mm=mm+"整"ENDIFRETURN(mm)ENDFUNC
---- 将本函数存放在一程序(PRG)文件中,并以名称dxxfun.prg来保存。本函数的返回值为MM,当数值型的金额经本函数转换后,MM将是一对应转换金额的人民币大写数字。

---- 打印过程中,在什么地方设置本转换函数也是一个技巧,本例先在数据环境中的INIT事件中录入代码:

set procedure to dxxfun.prg
---- 本代码用于打开名为dxxfun.prg的过程文件,也就是存放人民币大写转换函数的程序。

---- 从系统菜单中之"报表"\"变量"中为本报表文件增加一变量,起名为myfunc,设置存储值为:

---- dxxfun(jexj)

---- jexj是金额所属的字段。本变量作用为调用dxxfun.prg中之函数dxxfun()来得到转换后的大写金额。本变量编写完毕,就可以在报表中以本变量为一域控件中之表达式添加到报表中。

---- 四、财务栏金额的打印

---- 要打印出本财务栏的小写金额,首先要把数值型(带两位小数)的金额转变成不带小数点的字符串,完成这功能可以在先为报表添加一新变量abc,并设置存储值为:

---- stuff(str(jexj+1,11,2),9,1,'')

---- 其中字段jexj为小写的金额,经过此转换后,变量abc就存储了不带小数点的小写金额,这是一个字符串。以后就可以将本变量逐个取字符,并将它们也作为一域控件的表达式添加到报表中,例如,取小写金额的第一个字符就可用命令subst(abc,1,1)得到,第二个为subst(abc,2,1),其余的以此类推。本例中分别以变量AA1至AA10从大到中来表示小写金额的每一位字符。

---- 五、字符"¥"打印位置的确定

---- 由于每条记录中小写金额的长度都不同,而字符"¥"则必须打印在财务栏中小写金额的左边,并随金额的不同位置而改变,如图二所示:

---- 要解决这问题,可充分利用报表控件之"标签"的打印条件,方法是:建立一标签,内容为"¥",并把此标签放在与域变量aa1 相同的位置上,双击此标签控件,将出现一对话框,从对话框中单击"打印条件"选项,待出现条件设计窗口时则键入此标签的打印条件,即:在"仅当下列表达式为真时打印"的文本框中录入代码:

---- empty(aa1).and. (!empty(aa2))

---- 本代码的功能是当变量aa1为空时并且变量aa2非空时打印,这里的aa1为金额的千万位。

---- 最后完成的报表设计表如(图三)所示:

---- 从(图三)中可以看到,本报表共用了八个"¥"字符,每个"¥"字符都对应不同的打印条件以控制其变动的打印位置。例如,与域控件aa2处于相同位置的"¥"字符对应的打印条件为:

---- empty(aa2).and. (!empty(aa3))

---- 其余的也依此类推。

---- 由于本单据打印模式通用性很强,因此在实际工作中只需对各种报表控件进行增减或调整位置,即可编写出适合实际需要的发票套打程序。

---- 本程序中VFP5.0,WINDOWS95环境下运行通过。