基于VFP6的成绩统计系统(毕业设计)_第1页
基于VFP6的成绩统计系统(毕业设计)_第2页
基于VFP6的成绩统计系统(毕业设计)_第3页
基于VFP6的成绩统计系统(毕业设计)_第4页
基于VFP6的成绩统计系统(毕业设计)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华中师范大学网络教育学院本科毕业论文〔设计〕作者:指导老师:所在学习中心:所学专业:学号:年级:完成日期:2003年12月5日基于VFP6的成绩统计摘要:本文首先指出在教学工作中需要做一些成绩统计工作并论证了用VFP实现的可能性。然后就所学的知识,通过一定时间的再学习,完成了基于VFP的成绩统计工作。本文主要简述了设计的过程,说明了设计的重点、难点。最后指出了本程序有待改良的的地方。关键词:VFP6、数据库、表、记录、查询、报表目录TOC\o"1-3"\h\z一、选题背景1二、方案论证1三、设计过程论述2〔一〕、根本程序的建立31、数据库的结构32、建立分级的文件目录结构43、建立工程文件及主程序。54、建立主界面表单及菜单工程55、建立工具栏66、分数输入的表单及功能实现77、查看分数的表单及其功能实现98、查询表单及其功能实现10〔二〕、成绩统计的功能及其实现111、统计总分112、计算排名113、成绩分析13〔三〕、报表设计及打印131、报表设计132、打印设计14〔四〕、扩展到通用程序的尝试14四、结果分析16致谢17附录18附录1:主程序18附录2:显示工具栏的程序19附录3:按学号输入分数的界面19附录4:增加记录的主要程序20附录5:查看班级成绩表表单及程序21附录6:查询表单及其程序22附录7:计算排名的程序23附录8:分数分析的表单及程序25附录9:设计中的报表27附录10:打印控制表单27附录11:维护班级等的界面和程序29附录12:小知识点聚集30参考文献31正文:一、选题背景在实际的教学工作中,常常要对学生的考试成绩进行统计、分析,进而有针对性地进行教学、辅导等工作。单科教学要比拟学生在各次考试中的成绩变化,分析原因,找到解决方法。作为班主任,要统计学生各门课程考分的上下、总分排名以及在年级中的排名等;还要分析学生的成绩状况,有无偏科等现象。这一些成绩统计的工作,需要有一种简单快速准确的方法来处理,我们可以设计一个计算机程序来完成成绩输入、统计、打印的功能。VisualFoxpro6.0是微软发行的VisualStudio编程系列的组件之一。它是一个功能强大、可靠的数据库管理系统,可以用它来开发专业级的应用程序。VFP采用面向对象的由事件驱动的应用程序设计方法,提供了可视化设计工具,对工程及数据库管理的功能强大。所以我决定用VFP6来设计制作这个成绩统计软件。二、方案论证现在制作的软件应该有一个比拟人性化的界面,要具有现在常用Windows系列软件的界面特征:有标题栏、工具栏、工作窗口、对话框等。要有方便的操作界面,有提示、按钮、帮助等,使用户有熟悉的感觉,方便用户使用软件。这是当今“可视化〞软件设计的根本功能。在VFP6中是完全可以实现的。成绩统计软件应该具有成绩输入、成绩显示、查询、统计总分、计算名次等根本功能。还要考虑为教师或领导打印不同形式的报表,或给学生打印成绩单等报表及打印的功能。这一些都是数据库处理比拟常见的功能,也是可以在VFP6中实现的。最后,考虑程序统计软件的通用性,最好能适应不同的班级、不同的学期、不同的考试工程甚至不同的学校。这要求在设计数据库结构时要合理,并在程序中不指定专门的表,而采用通用的变量形式调用。这些要通过自己的学习分析来实现,可以作为本程序第二阶段的设计重点。三、设计过程论述因为自己对VFP6及数据库设计理论并不是很精通,基于简单、根本结构的考虑。我决定先设计一个固定班级、固定科目、固定考试工程的成绩统计程序。在其中实现成绩输入、显示、删除、更改、查询、计算排名、打印报表等功能。并考虑程序的通用性。开发和运行环境选择:开发工具:中文版VisualFoxPro6.0运行环境:Windows9x、WindowsNT、Windows2000操作系统。〔一〕、根本程序的建立1、数据库的结构从程序的通用性考虑,建立数据库school.dbc,在其中建立如下的数据表:班级编号表:ClassNo班级编号初一〔1〕班101…………初二〔3〕班203…………初三〔9〕班309…………学期编号表:TermNo班级编号上学期1下学期2考试编号表:TestNo考试工程编号第一次月考1第二次月考2期中考试3第三次月考4第四次月考5期末考试6科目表:KeNo科目编号语文1数学2英语3物理4化学5…………根本程序局部决定以“初三〔1〕班上学期第一次月考〞即表30111.dbf为例进行制作。成绩表编号表tableNo成绩表编号初一〔1〕班上学期期中考试10113初三〔1〕班上学期第一次月考30111成绩表根据用户的选择方式由程序自动生成,具体成绩排名表如:30111学号1姓名李静语文86…………图12、建立分级的文件目录结构图1VFP6对程序中用到的各种资源分类管理,对编程者来说,最好建立不同的文件夹分类存放程序中用到的各种资料。否那么,随着编程的深入,文件越来越多,会造成自己管理上的混乱。我建立的程序目录结构如图1:在根目录中存放主程序main.prg,和工程文件school.prg以及配置文件config.fpw等。Bitmap目录下存放用到的各种图形,data目录下存放数据库和数据表,forms目录下存放表单,menus下放菜单文件,其它的文件放在else中。调用各类文件时采用相对路径,如doforms\first或usedata\30111,这样有利于程序的移植,只要将这个分级目录全部移动,就可以保证程序的可执行性。3、建立工程文件及主程序。工程管理器是VisualFoxpro的控制中心,用户可通过该管理器创立、添加、删除或移去各种数据库文件,可以访问各类设计器及向导。所以利用向导创立工程文件,选择位置为okone文件夹,与主程序在同一文件夹中,工程名为shool.prj。建立一个主程序,进行调用表单及消息循环控制。注意将它保存在根目录中,与工程文件shool.prj在一起,这样便于以后采用相对目录方式调用其它文件。主程序具体内容见HYPERLINK附录1。4、建立主界面表单及菜单工程图2为使程序便于操作,容易让用户上手,决定在程序中使用菜单。新建菜单如图2。图2在view—generaloptions中设置为replace和Top—LevelForm将其放置在顶层表单中。注意在菜单中但凡会弹出一个新表单的工程都加上“…〞,这是Windows系列软件的约定。新建主界面表单,将其设为“顶层表单〞即属性ShowWindow=2,在其_Init事件中调用菜单domain.mprwiththis,并翻开数据库及表。为简化程序和尽量标准化,在主表单的Load事件中选择工作表1翻开要使用的表,程序如下:OPENDATABASEdata\school.dbcselect1usedata\30111setorderto1在destory事件中增加一句closedatabase和clearevent,否那么会有VFP主界面无法退出的现象。5、建立工具栏为方便用户的操作,也建立工具栏。按照参考书上所讲述的方法,建立按钮类。如图为让其能在主表单中正确的显示,我查阅了大量的资料并上网参考相关的程序源文件,经过反复试验,决定采用如下方法。(1)、建立工具栏的“按钮类〞(2)、在主表单中先建立自定义属性“tbrtools〞(3)、再在主表单的Activate事件中用程序创立工具栏工具按钮的命令可采用doforminputfen形式调用表单或dozongfen调用程序或直接在其中编写程序;从菜单中调用工具按钮可以这样:。具体程序见HYPERLINK附录2。6、分数输入的表单及功能实现分数输入可以按照两种方法,即按学号一次输入一个学生的全部科目的分数或者按科目一次输入一个班级的某科的分数。本着先易后难的原那么,决定先实现“按学号输入〞的功能。(1)、新建表单inputfen为使该表单显示在主表单中,需将主表单的MDIForm设为True,而设本表单的ShowWindow=1〔在顶层表单中〕。在其中用Label显示提示文字,用Text显示分数,用Text的Recordsource属性显示数据表中字段的值。用Button控制,用一个Grid显示全部的分数。当全部界面设计完成后,将其BorderStyle设为1—fixedsingle,禁止用户调整表单的大小。同时设置其WindowType=1,可以使得当用户不退出本表单时,菜单不可用,并去掉最大化功能。下面的其它都这样设置。最后的表单见HYPERLINK附录3。(2)、增加记录的功能按钮的caption=“增加/下一个〞。在其click事件中编程:当姓名、学号为空或已经有相同的记录时,给出提示并处理。用insertto命令增加记录,并刷新grid的显示。要注意文本框中的输入默认是“字符型〞数据,而各分数字段被定义为“数值型〞的,所以必须在需要的地方进行数据类型的转换处理。否那么会有“Functionargumentvalue,typeorcountisinvalid〞的错误提示。具体程序见HYPERLINK附录4(3)、修改功能按钮:Caption=“修改〞Name=“cmdedit〞。在进入修改状态时,将增加按钮设为无效,防止两种操作混乱。在修改的click事件中,设定各文本框的recordsource属性为对应的字段就可以实时修改。修改完毕,在修改完毕的click事件中在清空recordsource属性,并复原各按钮的状态。具体程序略。(4)、删除功能删除记录分几步进行,先是用delete作删除标记,再用pack命令完全删除。但是为了程序操作的友好性,防止用户误删除,必须在删除前给用户一个提示,以确认删除。局部程序如下:messtxt=[真要删除这条记录吗?]+chr(13)+chr(13)+[学号:]+str(学号)+[]+[姓名:]+姓名+chr(13)+[语文分数:]+str(语文)+chr(13)+[数学分数:]+str(数学)+chr(13)+[英语=]+str(英语)*必须进行字符到数字或相反的格式转换,否那么有错误:Operator/Operandtypemismatchmesstype=4+32+256&&是否按钮+问号标志+默认值为第二个messtitle=[早知如此,何必当初!]&&标题栏isdeleted=messagebox(messtxt,messtype,messtitle)ifisdeleted=6deletewaitwindow[已删除一条记录!]nowaitelsewaitwindow[撤消删除记录!]nowaitendif7、查看分数的表单及其功能实现本表单是为了让用户查看分数的,可以设计两种:个人成绩单和班级成绩单。(1)、个人成绩单viewfen在本表单中一次显示一个学生的成绩及名次,等同于发放给学生的成绩单。本表单比拟简单,只要设置文本框的recordsource属性即可。为控制方便,设计了一个按钮类,用skip命令来实现记录的浏览。且可以放到其它的地方通用。如“上一个〞按钮对应的程序:skip-1ifbof()messagebox("已是第一个记录",48,"信息窗口")this.parentmand1.enabled=.f.this.parentmand2.enabled=.f.elsethis.parentmand1.enabled=.t.this.parentmand2.enabled=.t.endifthis.parentmand3.enabled=.t.this.parentmand4.enabled=.t.thisform.refresh(2)、设计班级成绩表viewfenall显示全部成绩只采用一个Grid表格即可,为方便查看,增加一个排序选择,可以让操作者对数据按排序后的方式查看。难点在于要根据用户的不同选择而产生不同的查看方式,所以采用select语句,设置表格的RecordSourceType=4(SQL说明),经过调试,得到了正确的语句如下:findtemp=[select*fromdata\30111intocursortempdbforderby]+sort1+[]+sort1type表单结构及完整的程序见HYPERLINK附录5。8、查询表单及其功能实现查询设计主要是要提供用户选择查询的字段,还要提供与、或的复合查找方式。本局部的技巧与上面的排序查看分数相同,也是组合SQL语句的问题,关键程序语句如下:findsentence=[select*fromdata\30111where]+findwhat1+[intocursortempdbforderby学号]表单组成及完整的程序见HYPERLINK附录六。〔二〕、成绩统计的功能及其实现1、统计总分即对各门功课进行求和运算,语句为dowhile.not.eof()replace总分with语文+数学+英语+物理+化学skipenddo因为程序比拟简单,所以没有设计专门的表单显示,只是一段专门独立的程序,保存在else子文件夹中。方案增加计算总分的科目,如只统计语数外三门课的总分,或语数外理化或所有科目全部的总分。最好允许用户自己选择统计总分的科目。2、计算排名在VFP6中没有象excel中的排名函数rank()一样的已有函数,必须自己设计排名算法。方法:先对排名字段进行sort排序操作,生成临时表:sorttemp,然后按序循环该表,对名次字段按照计数变量递增进行更新。最后用临时表对照更新原表〔update〕。改良:上述方法没有考虑到分数相等时存在并列名次及名次间隔,所以要设计新的方法来实现。设计的N-S流程图如下:对应的程序局部如下:***计算排名的方法:注意分数相等排名相同*********MyCountNum=1&&计算名次的变量tong=1&&某个名次相同的人的个数dowhile.not.eof()replace&sort3withMyCountNum&&它在根目录下生成的临时表fentemp=&sort3a&&计下临时的分数skip&&取下一条记录iffentemp=&sort3athen&&如果后面的分数与前面的分数相等replace&sort3withMyCountNum&&不改变名次tong=tong+1&&相同的个数增加1else&&如果后面的分数与前面的分数不相等iftong<>1thenMycountNum=MycountNum+tong&&名次变量要在以前的根底上增加相同名次人的个数tong=1else&&如果后面的分数与前面的分数不相等并且也没有名次相同的人MycountNum=MycountNum+1&&那么直接将名次变量增加1即可endifendifenddo**出现名次相等的情况,就会有“空名次〞的现象*********完整的程序见HYPERLINK附录73、成绩分析在这里计算最高分、最低分、平均分,并统计及格率、优秀率并对各分数段进行人数统计、画直方图显示。根据用户的选择进行统计,先排序生成临时表。最高分即gototop后字段的值,最低分即gotobottom后字段的值,在标签中进行显示即可。中选择一次对所有科目进行分析时,为对各字段重复调用上述过程,特将上述过程放到一个看不见的按钮中,直接调用该按钮的click。即。局部界面及程序见HYPERLINK附录8〔三〕、报表设计及打印1、报表设计利用VFP6的报表设计器设计两个报表:学生个人成绩单rptdan和班级成绩单rptall。注意页标头和细节的设置。方案应该可以编辑报表的标题头部及显示时间,总之,尽量让用户参与报表的设计,以打印出符合用户要求的报表。在编程阶段设计的报表,设计图见HYPERLINK附录92、打印设计提供用户选择欲打印的报表列表,并可以打印到文件中,且可以打印预览。如打印预览程序如下:ifthisformbo1.value=〞学生个人成绩单〞rptTemp=〞else\rptdan〞elserptTemp=〞else\rptall〞endifreportform(mainpath+rpttemp)preview为丰富报表的内容,参加了时间〔年月日〕的显示。打印控制的表单及局部程序见HYPERLINK附录10〔四〕、扩展到通用程序的尝试1、制作管理班级、科目、考试工程的界面这些界面在操作上都是一样的,只是翻开的数据表一样。所以方案采用一个统一的窗体,根据条件改变响应的显示。为简化程序,各数据表的字段名都一样,是“名称〞和“编号〞。在窗口的界面上,直接套用“按学号录入分数〞的界面,仅作少量的修改即可。对应不同的菜单执行不同的操作,可以这样实现:菜单对应的是“过程〞,在其中定义变量来区分菜单再运行表单。注意在表单的form_load中,执行翻开数据表的操作,而不能在form_init中翻开。具体的界面及程序见HYPERLINK附录112、建立生成表、翻开表的界面生成表:根据用户的选择,查询相应的科目代码,再组合成成绩名次表的表名〔是纯数字形式〕,由此生成具体的成绩表结构,待用。注意保存表名的变量。翻开表:根据用户的选择,翻开表作为当前工作的成绩表。对此进行各种操作。注意当前的工作区和表名变量。3、在程序中使用表使用表时,尽量采用选取工作区的方式使之成为当前表。如果一定要使用表名,要采用别名或使用变量方式引用。具体地方具体处理:四、结果分析通过本程序的设计,解决了分数的输入、显示、修改、删除、查询以及统计总分、增加排名、分析最高分等功能。还可以进行打印。这些功能经过验证,都可以很好的运行。但本程序还需要进行扩展,最需要的是用户要可以进行班级、科目、考试工程的自定义。在此根底上,统计全年级的年级排名,对全年级的分数进行分析。使本程序可以在所有学校通用,成为一个通用的成绩统计程序。另外,还应该加强成绩的分析工作。如统计优秀率、对考试分数自动产生分析评语,甚至可以根据每个学生的考试成绩、班级年级排名而产生一个成绩评语。本程序的源程序中附加了详细的语句说明,反映了我在设计中的心得和摸索的过程,可以作为学习VFP6编程的重要参考资料。现在存在的疑问:1、怎样使打印预览时系统自己翻开的工具栏直接显示在窗口的上部而与自己设计的工具栏在一行?2、怎样在Grid中显示特定的字段?3、完全删除(pack)后,怎样在Grid中显示结果?4、怎样用程序指定报表的recordsource?5、怎样连续播放背景音乐?致谢通过本设计,我在工作之余、在紧张的毕业论文设计时间的情况下,熟悉了VFP编程的根本步骤。练习了一些数据库设计、程序功能设计的方法。感觉在时间的逼迫下,通过到图书馆或Internet上查找资料和向老师咨询,是可以完成方案中的任务的。在设计时,我不断的遇到问题、解决问题,在此过程中,我体会到成功的快乐。在此即将完成设计之时,对我的指导老师华中师范大学的****表示感谢;并将我成功的快乐与我的丈夫***分享,感谢他在设计过程中对我的帮助。附录附录1:主程序*thisismainprogramClassName="初三(1)班"TestName="上学期第一次月考"rptTitle=""&&显示报表标题myTime=""&&显示时间,变量不在这里定义,打印报表时会出现“找不到变量〞!tempTime=myTime*本程序放在个根目录下,才可以采用相对目录调用mypath=left(sys(16),rat("\",sys(16)))setdefato(mypath)&&设置默认路径mainpath=strtran(mypath,'data\','')ifnot(file("data\school.dbc"))&&相对目录这样写即可setsafetyon&&翻开“覆盖确认〞的对话框createdatabase[school.dbc]filename=[30111.dbf]createtable(filename)(学号c(3),姓名c(8),总分c(4),语文c(4),数学c(4),英语c(4),物理c(4),化学c(4),班次c(3),语次c(3),数次c(3),英次c(3),物次c(3),化次c(3))indexon学号tag学号insertinto(alltrim(dbf()))(学号,姓名,语文,数学,英语,物理,化学)values([11],[赵亮],[78.50],[92.00],[84.50],[52.00],[80.50])endif*_screen.left=-10000*加了上面的一句后,是看不见了。但是在任务栏上还是有指示。*在根目录下增加了一个config.fpw的后缀名为fpw〔纯文本文件〕就可以了doformforms\firstnamefirstreadevent*有时候,当VFP的编程界面没有关闭时,运行本程序的EXE,出现错误:fileaccessisdenied,打不开数据库。而大多时候都可以附录2:显示工具栏的程序在主窗口的Activate事件中:*要使用工具条必须先在表单frmtele中自定义属性tbrtools*先翻开表单,再从菜单中选择“form——newproperties...〞输入tbrtools即可。*防止重复载入工具条IFTYPE("thisform.tbrtools")="O"AND; !ISNULL(thisform.tbrtools) RETURNENDIFSETCLASSLIBTO(mainpath+"else\myclass")additive用名称表达式代替宏可更有效率thisform.tbrtools=createobject('mytoolbar')&&创立工具条this.tbrtools.dock(0)&&放置在屏幕顶端this.tbrtools.Show&&显示工具条RELEASECLASSLIB(mainpath+"else\myclass")*增加了如上代码后,就可以显示工具栏了。这样显示不需要将自己建立的类手工放到窗口中,当然也不需要建立“窗口集合〞。而是用以上代码显示窗口的。附录3:按学号输入分数的界面附录4:增加记录的主要程序dimea[7]&&定义数组a=[]&&赋初值赋值这个数组的赋值有数字又有字符,怎么办???a[1]=alltrim(This.parent.Text1.value)a[2]=alltrim(This.parent.Text2.value)&&姓名不需要将字符转化为数字a[3]=alltrim(This.parent.Text3.value)a[4]=alltrim(This.parent.Text4.value)a[5]=alltrim(This.parent.Text5.value)a[6]=alltrim(This.parent.Text6.value)a[7]=alltrim(This.parent.Text7.value)dataname=alltrim(dbf())&&当前翻开的数据库名if(empty(a[1])ORempty(a[2]))messtxt=[姓名或性别不能为空!]messtype=0+64+0&&OK按钮messtitle=[请注意!]=messagebox(messtxt,messtype,messtitle)elselocatefor(学号==val(a[1]))iffound()messtxt=[已有相同学号的记录存在!]+chr(13);+chr(13);+[不能添加!]messtype=0+64+0&&OK按钮*messtype=4+48+256&&是否按钮+惊叹号标志+默认值为第二个messtitle=[请注意!]=messagebox(messtxt,messtype,messtitle) else&&没有相同记录存在insertinto(dataname)(学号,姓名,语文,数学,英语,物理,化学)values(val(a[1]),a[2],val(a[3]),val(a[4]),val(a[5]),val(a[6]),val(a[7]))waitwindow[新记录已追加!]nowaitendif&&offoundendif&&ofempty()This.parent.Text1.setfocus&&焦点在text1上thisform.text1.value=""thisform.text2.value=""thisform.text3.value=""附录5:查看班级成绩表表单及程序sort1type=iif(thisform.optgroup1.value=1,[desc],[asc])sort2type=iif(thisform.optgroup2.value=1,[desc],[asc])select1usedata\30111if(thisform.check1.value=1andthisformbo1.value<>thisformbo2.value)findtemp=[select*fromdata\30111intocursortempdbforderby]+sort1+[]+sort1type+[,]+sort2+[]+sort2typeelse*select*fromdata\30111orderby数学asc先试验这句话正确findtemp=[select*fromdata\30111intocursortempdbforderby]+sort1+[]+sort1type*要使用“通用查询方式,组合成以上的语句endifthisform.grid1.recordsource=findtemp附录6:查询表单及其程序select1*复合查找方式findone1=alltrim(thisformbfind1.value)findstyle1=alltrim(thisformbdeng1.value)iffindone1="姓名"thenfindvalue1='"'+alltrim(ThisForm.txtfind1.value)+'"'&&按“姓名〞查询时的处理else&&姓名的输入必须用“引号〞,所以作如上处理findvalue1=alltrim(ThisForm.txtfind1.value)endiffindwhat1=findone1+findstyle1+findvalue1findwhat2=""ifThisForm.check1.value=1*复合查找方式howfind=iif(ThisForm.Optgroup.value=1,[.and.],[.or.])findstyle2=thisformbdeng2.valuefindvalue2=alltrim(ThisForm.txtfind2.value)findwhat2=findone2+findstyle2+findvalue2*查找结果放入临时表中findsentence=[select*fromdata\30111where]+findwhat1+howfind++findwhat2+[intocursortempdbforderby姓名]else*findsentence=[select*fromdata\30111where总分>435intocursortempdbforderby学号]findsentence=[select*fromdata\30111where]+findwhat1+[intocursortempdbforderby学号]endifthisform.txtfindall.value=findwhat1+findwhat2ThisForm.grid1.recordsource=findsentenceif_tally=0&&_tally变量代表当前select命令处理过的记录数??chr(7)=messagebox("没有相匹配的记录!",64,"找不到!")endif附录7:计算排名的程序sort1=thisformbpai.value&&sort1是要排序的字段docasecasesort1="语文"sort2="语次"&&sort2是要更新的名次字段casesort1="数学"sort2="数次"casesort1="英语"sort2="英次"casesort1="物理"sort2="物次"casesort1="化学"sort2="化次"casesort1="总分"sort2="班次"endcaseselect1&&这一句不能没有,否那么在不关闭本窗口第二次排名时没有表sorttosorttempon&sort1/d&&根据所选择的字段排序生成临时表sort3a="sorttemp."+sort1&&构成表名.字段格式这个是分数字段sort3="sorttemp."+sort2&&这个是名次字段select16usesorttemp*indexon学号tagxuehao&&给临时表增加索引*这句话千万不能放在这里,否那么,总是将各科名次都排成“索引〞的名次****计算排名的方法:注意分数相等排名相同*********MyCountNum=1&&计算名次的变量tong=1&&某个名次相同的人的个数dowhile.not.eof()replace&sort3withMyCountNum&&它在根目录下生成的临时表,翻开看,已经给语次列参加了正确的数字名次!fentemp=&sort3a&&计下临时的分数skip&&取下一条记录iffentemp=&sort3athen&&如果后面的分数与前面的分数相等replace&sort3withMyCountNum&&不改变名次tong=tong+1&&相同的个数增加1else&&如果后面的分数与前面的分数不相等iftong<>1thenMycountNum=MycountNum+tong&&名次变量要在以前的根底上增加相同名次人的个数tong=1else&&如果后面的分数与前面的分数不相等并且也没有名次相同的人MycountNum=MycountNum+1&&那么直接将名次变量增加1即可endifendifenddo****出现名次相等的情况,就会有“空名次〞的现象*********select16indexon学号tagxuehao&&把这句放在这里就完全正常了select2usesorttempagainordertagxuehaoaliassortasort4="sorta."+sort2select1usedata\30111.dbfagainordertagxuehao&&必须这样使用*updateon学号fromsortareplace语次withsorta.语次&&第一次是这样使用的,改为通用格式updateon学号fromsortareplace&sort2with&sort4&&注意变量的应用*以上是增加排名的方法:*先对欲增加排名的表排序,生成临时表*然后按顺序循环临时表,用逐渐增加的数字更新临时表的名次字段*最后,用临时表来对应更新最初的表。成功!*下面还应该删除临时表select16&&在删除前先要关闭useselect2&&还必须关闭这个工作区,因为该表在其中也被翻开了use&&否那么总有“该表正在使用的错误〞erasesorttemp.cdxerasesorttemp.dbf&&删除临时表及索引表select1findtemp=[select*fromdata\30111intocursortempdbforderby]+sort1+[desc]thisform.grid1.recordsource=findtemp附录8:分数分析的表单及程序thisform.lblke.caption=sort1select1&&根据所选择的字段排序生成临时表sorttofenxitempon&sort1/dselect5&&使用这种方法,还是会在根目录下生成临时文件usefenxitemp&&所以必须在主窗体的destore事件中再删除gototoptempMax=&sort1gotobottomtempMin=&sort1docasecasesort1="语文"Maxyuwen=tempmaxMinyuwen=tempminthisform.label14.caption=str(Maxyuwen)thisform.label15.caption=str(tempmin)casesort1="数学"Maxmaths=tempmaxMinmaths=tempminthisform.label17.caption=str(Maxmaths)thisform.label18.caption=str(tempmin)casesort1="英语"MaxEng=tempmaxMinEng=tempminthisform.label20.caption=str(tempMax)thisform.label21.caption=str(tempmin)casesort1="物理"thisform.label23.caption=str(tempMax)thisform.label24.caption=str(tempmin)iftempMin<60thisform.label24.forecolor=rgb(255,0,0)endifcasesort1="化学"thisform.label26.caption=str(tempMax)thisform.label27.caption=str(tempmin)iftempMin<60thisform.label27.forecolor=rgb(255,0,0)endifcasesort1="总分"thisform.label29.caption=str(tempMax)thisform.label30.caption=str(tempmin)endcaseselect5useerasefenxitemp.dbf附录9:设计中的报表附录10:打印控制表单“开始〞按钮对应的程序:sort1type=iif(thisform.optgroup1.value=1,[desc],[asc])iffile("prttemp.dbf")&&如果存在临时表,先删除表select9useeraseprttemp.dbfendifselect1&&根据所选择的字段排序生成临时表sorttoprttempon&sort1/&sort1typeselect9useprttempifthisformbo1.value="学生个人成绩单"ifrpttitle=""rpttitle="初三年级九月份月考学生个人成绩单"endifrptTemp="else\rptdan"elseifrpttitle=""rpttitle="初三年级九月份月考成绩班级一览表"endifrptTemp="else\rptall"endifDOCASECASEthisform.opgOutput.optPrinter.Value=1&&Toprinterreportform(mainpath+rpttemp)NOCONSOLETOPRINTERPROMPTmesstxt=[成绩表打印完毕!]CASEthisform.opgOutput.optFile.Value=1&&Tofileprnfile=alltrim(ThisForm.txtfilename.value)COPYTO(prnfile)DELIMITEDmesstxt=[文本文件:]+chr(13)+prnfile+chr(13)+[打印完毕!]ENDCASEmesstype=0+64+0&&OK按钮messtitle=[搞定啦!]&&标题栏=messagebox(messtxt,messtype,messtitle)附录11:维护班级等的界面和程序for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论