引 言
在高等学校里,毕业生信息的管理、毕业证书和学位证书的打印是教务管理的重要环节,本文就结合 Re-portObject(s报表对象)在 VFP 中实现了本校毕业证和学位证打印,在近几届的本、专科毕业生的毕业证、学位证的打印中得到了实际测试与应用,程序可根据证书的尺寸和内容实现打印对象属性的可视化调整,简化了工作人员证书打印的操作步骤,提高了工作效率。
1 系统需求分析
随着计算机应用的不断普及,现高校均采用高校学生学籍管理系统为进校的学生学籍建立电子档案,对学生在校的学习情况进行全程的跟踪与管理。学校所使用的学籍管理系统能实现对学生的基本情况、学习成绩、学分等信息的动态查询、管理与报表输出,极大地方便了教务管理人员,该系统主体功能运行良好,但有一处功能不甚完善,即:无法实现毕业证、学位证的批量自动打印(原系统在批量打印时,每打印一份证书,必须先手动确认后打印才会继续),因此,本应用对该处做专项功能扩充开发。
2 系统功能模块设计
程序实现的功能模块如图 1 所示,具体描述如下:
(1)学籍信息的导入。原学籍管理系统中有学生基本信息导出的功能,可直接将数据导入使用,对原始毕业生信息数据的导入,可避免对学生基本信息的重新录入,有效地保证与原学籍系统中数据一致。(2)基本信息的查询。可选择在本校或联合办学点对即将毕业的学生进行查询,支持按学号模糊查找,对查询结果可按连续选择、非连续选择或拖动选择等多种选择方式确定待打印证书的学生。
(3)打印格式的设置。打印格式设置中可以对需在证书中打印的项目如姓名、性别、出生年份、出生月份、毕业年份、毕业月份、毕业专业、毕业学校,证书编号等进行选择,对打印项进行字体、字号、字形、阿拉伯数字的大写或小写等格式的设置,打印项的距顶端、距左端的位置的设置,打印项整体位置的移动,证书页面尺寸的设置,提供了打印设置的保存与还原等功能。毕业证书打印格式的设置界面如图 2 所示。
(4)分类批量打印。可以选择待打印证书的类型是证书毕业证还是学位证,可以按证书编号的选择方式打印本校与联合办学点中的所有学生、查询中选择的学生、指定编号范围等多种批量打印方式,也可以按学院专业打印方式批量打印。
(5)打印报表的动态生成。根据打印项的各种格式设置和分类批量打印中确定的打印范围,动态生成打印报表,可以支持直接打印或打印预览等证书打印方式。
3 系统的实现及关键技术
系统实现的主界面如图 3 所示,整个应用实现涉及到的关键技术为打印报表的动态生成,Report Ob-jects为编程人员提供了一种以编程的方式建立报表的方法,它融入了面向对象程序设计的方法和特点,将报表的创建、设计等操作全部封装在报表对象类(SFREPOBJ.VCX 类库) 中,该报表对象类由 DougHennig 设计和开发,提供了一系列建立报表对象集的方法和相关属性,开发人员不必关心其内部如何实现就可以根据项目的需要通过编程的方式灵活地将其应用到实际项目的开发中。其动态生成打印报表的流程和部分代码如下:
3.1 建立报表控件,设置报表全局属性
对 Report Objects 中 SFReportFile 类进行实例化,设置报表的默认字体、字体大小、报表中的列数、单位大小、报表文件的名称等全局属性。
实例化 SFReportFile 类、设置报表的全局属性的相关代码如下:
loReport=NEWOBJECT('SFReportFile', 'SFREPOBJ') && 建立控件
loReport.cReportFile=“ReportName_frx” && 设 置 文件名
loReport.lSummaryBand=.F. && 不要概要带
loReport.cUnits="I" && 单位英寸
loReport.nLeftMargin=0 && 设置左边的空白栏
3.2 返回指定报表带的对象,设置其属性
调用 SFReportFile 类中 GetReportBand()方法返回一个由入口参数指定报表带的对象,入口参数可以是 Page Header(页标头带)、Detail(细节带)、PageFoote(r页脚注带)等,通过返回的对象访问指定的带,这样你便可以设置其属性或向其中添加对象(如字段或线条),代码如下:
* 设置页标头,页标头 在控件中自动生成,设置高度为 0
loPageHeader = loReport.GetReportBand ('Page Header')&& 页标头带对象
loPageHeader.nHeight = 0loDetail = loReport.GetReportBand('Detail') && 细节带对象
loDetail.nHeight =ReportMainSetup.pg_height/2.54 && 将ReportMainSetup 表中 ReportMainSetup 字段的值厘米转换为英寸
loPageFooter = loReport.GetReportBand('Page Footer') && 页脚注对象
loPageFooter.nHeight = 0
3.3 对细节带添加对象
Report Bands 类提供的 ADDITEM()方法为添加一个对象到一个报表带中,当入口参数为”Field”时,返回值类型为 SFReportField,SFReportField 类的全局属性如表 1 所示。
向细节带添加的代码如下:
*ReportDetailSetup 为保存报表设置的表
*tempReportData 为根据证书要打印的字段将毕业学生信息表提取后生成的临时表
strFieldName="tempReportData."+ALLTRIM(ReportDe-tailSetup.Print_Item)
strFontName=ALLTRIM(ReportDetailSetup.fontname)
strFontSize=ALLTRIM(ReportDetailSetup.FontSize)
strFontStyle=ALLTRIM(ReportDetailSetup.FontStyle)
loObject = loDetail.ADDITEM('Field')
loObject.cExpression = "&strFieldName"
loObject.cFontName = strFontName
oObject.nFontSize = VAL(strFontSize)
loObject.nHPosition = ReportDetailSetup.h_Position/2.54+PgLeft
loObject.nVPosition = ReportDetailSetup.v_Position/2.54+Pg-Top
loObject.nWidth = loReport.GetHValue(LEN(&strFieldName) ,loObject)
loObject.cAlignment=ICASE (ReportDetailSetup.printalign=1,"left",ReportDetailSetup.printalign=2,"right",ReportDetailSetup.printalign=3,"center")
loObject.lFontItalic=IIF(" 斜 "$ALLTRIM(strFontStyle),.T.,.F.)
loObject.lFontBold=IIF(" 粗 "$ALLTRIM(strFontStyle),.T.,.F.)
3.4 生成报表文件,打印报表
调用实例化 SFReportFile 类中的 Save()方法,生成由 cReportFile 属性指定命名的报表文件,执行VFP 中的 REPORT FORM 命令实现报表打印或预览,代码如下:
loReport.Save()
IF IsPrintOrPreview=1 && 直接打印
REPORT FORM &strReportName_frx. NOCONSOLE ALL TO PR IN TER PROMPT
ELSE && 预览
REPORT FORM &strReportName_frx. PREVIEW ALL TOPRINTER PROMPT
END IF
loReport.Release()
4 结束语
本文在 VFP 中应用 Report Objects 实现了高校毕业证学位证打印,较基于 WORD 的邮件合并打印证书、基于 VB 的报表打印和基于 VFP 中直接报表打印,其界面友好、可交互性较强,实现了打印对象的可视化调整,提高了教务管理工作者的工作效率,文中结合代码分析了 Report Objects 实现报表动态打印的开发方法及步骤,可结合不同行业应用(如各类票据的打印)加以推广,实现更多更灵活的应用。【图略】
参考文献:
[1] Doug Hennig . Report Object [J/OL]. 2009-10-12.
[2] 杨宪泽,刘玉萍.软件技术与程序设计(Visual FoxPro 版)[M].北京:清华大学出版社,2010.
[3] 瓮正科.Visual FoxPro 8 数据库开发教程[M].北京:清华大学出版社,2005.