吴以林
摘要:该文介绍了采用Delphi 7及Microsoft SQL Server数据库做为开发工具,开发学生成绩管理系统,内容包括目标与功能结构、数据库设计、SQL存储过程及主要技术特点等。并给出了部分Delphi原程序。
关键词:成绩管理系统;数据库;Delphi;ADO
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)02-0353-05
目前在计算机技术的迅速发展的前提下以及计算机应用的普遍性,同时为了更好更快的加快学校学生成绩/学籍管理,开发一套成绩/学籍管理系统迫在眉捷。本系统主要采用Delphi 7及SQL Server2000做为开发工具,应用面向对象的程序设计方法进行开发与设计的。利用其提供的集成开发环境及各种控件,尤其是对数据库的支持完成对数据库的各种操作,达到对学生成绩管理的目的。本系统使用ADO连接数据库Microsoft SQL Server,提出了权限管理模块的具体实现方法,并完成了相关软件的设计任务。最终系统能够完成信息的输入、输出、数据的修改、查询和统计等功能,使用户操作起来简便快捷。
1设计概述
本系统由系统(用户登录)、班级管理、课程设置、成绩管理共四个模块组成分别设计应用程序界面。其主要功能框图如图1所示。
图1主要功能框图
2数据库结构设计(数据库采用Microsoft SQL Server数据库)
2.1班级信息数据库(class_info)
2.2学生信息数据库(student_info)
2.3班级课程数据库(classcourse_ifo)
2.4学期成绩数据库(result_ifo)
2.5学期不及格成绩数据库(bujige_ifo)
以上数据库表,通过Microsoft SQL Server数据库关系图功能设置了各表关键字段的关联,即采用了关系性数据的表示方式,如各数据库表class字段的关联、student_ID字段的关联等等,另外学期不及格成绩数据库(bujige_ifo)的数据由系统自动统计“学期成绩数据库”的数据成绩(result)<60自动存入。。
3 SQL存储过程
sql语句执行的时候要先编译,然后执行。存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。下面为系统开发中的部分存储过程代码:
create procedure [Proc_term_result] as
Declare @sql varchar(8000)
set @sql=select SUBSTRING(student_ID,7,3) as学号,student_name as姓名,retire as备注,
select @sql=@sql+cast(max(case course_name when
+course_name+ then Rtrim(result) else end)
as varchar(4))+IsNull((select enable from resultVIEW1
where student_id=b.student_id
and (class=某班) and (academic_year=10/11学年)and (term=下学期期末)
and course_name=+course_name+),)as +course_name+,
from (select distinct course_name from resultVIEW1 where class=某班 and
academic_year=10/11学年and term=下学期期末) as a select @sql=left(@sql,len
(@sql)-1) +from resultVIEW1 as b where class=某班 and academic_year=10/11学年 and term=下学期期末 group by stu?
dent_ID,student_name, retire exec(@sql)
以上SQL存储过程代码,主要是实现行列交叉的功能,即把图2的数据表变成图3的数据表,方便打印及查看。
图2
图3
4程序实现
4.1查询/打印毕业成绩
procedureTF_PtAVGResult.FormCreate(Sender:TObject);
begin
//设置查询年级列表框
withDataModule1.AQ_yeardo
begin
close;
SQL.clear;
SQl.add(select*fromyear_Info);
DataModule1.AQ_year.Open;
CB_year.Items.Clear;
whilenotDataModule1.AQ_year.eofdo
begin
CB_year.Items.Add(Fieldbyname(grade).asString);
next;
end;
end;
end;
procedureTF_PtAVGResult.CB_yearClick(Sender:TObject);
begin
CB_class.Text:=;
withDataModule1.AQ_classdo
//设置查询班级列表框
begin
close;
SQL.clear;
SQL.Add(select*fromClass_infowheregrade=:grade);
parameters.ParamByName(grade).value:=CB_year.Text;
DataModule1.AQ_class.Open;
CB_class.Items.Clear;
whilenotDataModule1.AQ_class.eofdo
begin
CB_class.Items.Add(Fieldbyname(class).asString);
next;
end;
end;
DataModule1.SQLSp.Close;//清空表格
end;
procedureTF_PtAVGResult.CB_ClassClick(Sender:TObject);
begin
DataModule1.SQLSp.Close;//清空表格
withDataModule1.AQ_Ysdo
begin
Close;//创建视图文件“resultVIEW2”
SQL.Clear;
SQL.Add(ifexists(select*fromsysobjectswhere);
SQL.Add(id=object_id(N[dbo].[result_bujigeVIEW2]));
SQL.Add(andOBJECTPROPERTY(id,NIsView)=1));
SQL.Add(dropView[dbo].[result_bujigeVIEW2]);
ExecSQL;
Close;
SQL.Clear;
SQL.Add(CREATEVIEWdbo.result_bujigeVIEW2AS);
SQL.Add(SELECTstudent_ID,student_Name,class,retire,course_name,);
SQL.Add(AVG(result)ASresult1,MAX(enable)ASenable1);
SQL.Add(FROMresult_bujigeVIEW);
SQL.Add(GROUPBYstudent_ID,student_Name,class,retire,course_name);
SQL.Add(HAVING(class=+CB_Class.Text+));
ExecSQL;
Close;
end;
DataModule1.SQLSp.Close;//清空表格
withDataModule1.AQ_Ysdo
begin
Close;
//修改存储过程文件“Proc_AVG_result”的前提
SQL.Clear;
SQL.Add(ifexists(select*fromsysobjectswhere);
SQL.Add(id=object_id(N[dbo].[Proc_AVG_result]));
SQL.Add(andOBJECTPROPERTY(id,NIsProcedure)=1));
SQL.Add(dropprocedure[dbo].[Proc_AVG_result]);
ExecSQL;
Close;
end;
withDataModule1.AQ_MakeupResultdo//修改存储过程文件“Proc_term_result”
begin
close;
SQL.Clear;
sql.Add(createprocedure[Proc_avg_result]as);
sql.Add(Declare@sqlvarchar(8000));
sql.add(set@sql=selectSUBSTRING(student_ID,7,3)as学号,);
sql.Add(student_nameas姓名,retire备注,);
sql.add(select@sql=@sql+cast(max(casecourse_namewhen);
sql.Add(+course_name+thenRtrim(result1)elseend));
sql.Add(asvarchar(4))+IsNull((selectmax(enable1)as标识fromresult_bujigeVIEW2);
sql.Add(wherestudent_id=b.student_idand);
sql.Add((class=+CB_Class.Text+)andcourse_name=+course_name+),));
sql.Add(as+course_name+,);
sql.add(from(selectdistinctcourse_namefromresult_bujigeVIEW2);
sql.Add(whereclass=+CB_Class.Text+)asa);
sql.Add(Declare@subjectcountvarchar(6));
sql.Add(select@subjectcount=count(distinctcourse_name)fromresult_bujigeVIEW2);
sql.Add(select@sql=@sql+(selectsum(result1)fromresult_bujigeVIEW2wherestudent_id=b.student_id)/+@subjectcount+as平均分,);
sql.Add(select@sql=@sql+(selectcast(count(student_ID)asvarchar(4))+科);
sql.Add(fromresult_bujigeVIEW2whereresult1<60andstudent_ID=b.student_ID)as不及格科数+);
sql.Add(fromresult_bujigeVIEW2asb);//whereresult1<60
sql.Add(groupbystudent_ID,student_name,retire);
sql.Add(select@sql=@sql+unionselect各科asstudent_id,合计人数asstudent_name,asretire,);
sql.Add(select@sql=@sql+(selectcast(count(student_id)asvarchar(4)));
sql.Add(+人fromresult_bujigeVIEW2where);
sql.Add(result1<60andcourse_name=+course_name+));
sql.Add(as+course_name+,);
sql.Add(from(selectDistinctcourse_namefromresult_bujigeVIEW2);
sql.Add(whereresult1<60)asa);
sql.Add(select@sql=@sql+as平均分,as不及格科数orderby平均分desc);
sql.Add(exec(@sql));
ExecSQL;
end;
以上程序通过简单的下拉选项选择年级和班级,就以实现查询某班所有学期每门课程的平均成绩情况,显示在屏幕窗口表格里,同时可以直接点打印按钮,将成绩打印出来;也可通过下面成绩另存为程序实现成绩导出。
4.2成绩另存为(或导出)
procedureTF_PtAVGResult.ppmSaveSelectionClick(Sender:TObject);
varExpClass:TDBGridEhExportClass;
Ext:String;
begin
SaveDialog1.FileName:=file1;
if(ActiveControlisTDBGridEh)then
ifSaveDialog1.Executethen
begin
caseSaveDialog1.FilterIndexof
1:beginExpClass:=TDBGridEhExportAsText;Ext:=txt;end;
2:beginExpClass:=TDBGridEhExportAsCSV;Ext:=csv;end;
3:beginExpClass:=TDBGridEhExportAsHTML;Ext:=htm;end;
4:beginExpClass:=TDBGridEhExportAsRTF;Ext:=rtf;end;
5:beginExpClass:=TDBGridEhExportAsXLS;Ext:=xls;end;
else
ExpClass:=nil;Ext:=;
end;
ifExpClass<>nilthen
begin
ifUpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3))<> UpperCase(Ext)then
SaveDialog1.FileName:=SaveDialog1.FileName+.+Ext;
SaveDBGridEhToExportFile(ExpClass,TDBGridEh(ActiveControl),
SaveDialog1.FileName,False);
end;
end;
end;这部分程序与数据浏览窗口放在一起实现了,可以将数据导出生成xls、txt、csv、htm、rtf类型文件。
5主要技术特点
1)本系统适用于软件环境为Win2003/WinXP/Win2000/WinNT/Win9x。
2)系统在设计上按通用性软件的要求,做到了结构良好,数据入或导入灵活、方便。用户在完成原始数据输入或导入后,只需按几下按钮,即可完成对各种数据的处理和要求,并可根据预先定制好的格式生成成绩表。
3)系统采用了多种形式的窗口控制技术和多种容错措施,使软件不仅具有独特的屏幕界面风格,而且较少地占用计算机系统资源,运行快速、安全可靠。
4)系统的数据输入采用键盘输入或从Excel文件、CSV文件导入等多种输入方式,而数据输出采用屏幕显示、打印、直接复制出去及导出生成xls、txt、csv、htm、rtf类型文件等多种输出方式,从面完全可以满足用户的不同需求。
参考文献:
[1]陈豫龙,何旭洪.Delphi数据库系统开发实例导航[M].2版.北京:人民邮电出版社,2003.
[2]张立科.Delphi 7组件编程参考手册[M].北京:人民邮电出版社,2003.