吳以林
摘要:該文介紹了采用Delphi 7及Microsoft SQL Server數(shù)據(jù)庫做為開發(fā)工具,開發(fā)學(xué)生成績管理系統(tǒng),內(nèi)容包括目標(biāo)與功能結(jié)構(gòu)、數(shù)據(jù)庫設(shè)計(jì)、SQL存儲過程及主要技術(shù)特點(diǎn)等。并給出了部分Delphi原程序。
關(guān)鍵詞:成績管理系統(tǒng);數(shù)據(jù)庫;Delphi;ADO
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)02-0353-05
目前在計(jì)算機(jī)技術(shù)的迅速發(fā)展的前提下以及計(jì)算機(jī)應(yīng)用的普遍性,同時為了更好更快的加快學(xué)校學(xué)生成績/學(xué)籍管理,開發(fā)一套成績/學(xué)籍管理系統(tǒng)迫在眉捷。本系統(tǒng)主要采用Delphi 7及SQL Server2000做為開發(fā)工具,應(yīng)用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法進(jìn)行開發(fā)與設(shè)計(jì)的。利用其提供的集成開發(fā)環(huán)境及各種控件,尤其是對數(shù)據(jù)庫的支持完成對數(shù)據(jù)庫的各種操作,達(dá)到對學(xué)生成績管理的目的。本系統(tǒng)使用ADO連接數(shù)據(jù)庫Microsoft SQL Server,提出了權(quán)限管理模塊的具體實(shí)現(xiàn)方法,并完成了相關(guān)軟件的設(shè)計(jì)任務(wù)。最終系統(tǒng)能夠完成信息的輸入、輸出、數(shù)據(jù)的修改、查詢和統(tǒng)計(jì)等功能,使用戶操作起來簡便快捷。
1設(shè)計(jì)概述
本系統(tǒng)由系統(tǒng)(用戶登錄)、班級管理、課程設(shè)置、成績管理共四個模塊組成分別設(shè)計(jì)應(yīng)用程序界面。其主要功能框圖如圖1所示。
圖1主要功能框圖
2數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)(數(shù)據(jù)庫采用Microsoft SQL Server數(shù)據(jù)庫)
2.1班級信息數(shù)據(jù)庫(class_info)
2.2學(xué)生信息數(shù)據(jù)庫(student_info)
2.3班級課程數(shù)據(jù)庫(classcourse_ifo)
2.4學(xué)期成績數(shù)據(jù)庫(result_ifo)
2.5學(xué)期不及格成績數(shù)據(jù)庫(bujige_ifo)
以上數(shù)據(jù)庫表,通過Microsoft SQL Server數(shù)據(jù)庫關(guān)系圖功能設(shè)置了各表關(guān)鍵字段的關(guān)聯(lián),即采用了關(guān)系性數(shù)據(jù)的表示方式,如各數(shù)據(jù)庫表class字段的關(guān)聯(lián)、student_ID字段的關(guān)聯(lián)等等,另外學(xué)期不及格成績數(shù)據(jù)庫(bujige_ifo)的數(shù)據(jù)由系統(tǒng)自動統(tǒng)計(jì)“學(xué)期成績數(shù)據(jù)庫”的數(shù)據(jù)成績(result)<60自動存入。。
3 SQL存儲過程
sql語句執(zhí)行的時候要先編譯,然后執(zhí)行。存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。存儲過程是數(shù)據(jù)庫中的一個重要對象,任何一個設(shè)計(jì)良好的數(shù)據(jù)庫應(yīng)用程序都應(yīng)該用到存儲過程。下面為系統(tǒng)開發(fā)中的部分存儲過程代碼:
create procedure [Proc_term_result] as
Declare @sql varchar(8000)
set @sql=select SUBSTRING(student_ID,7,3) as學(xué)號,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學(xué)年)and (term=下學(xué)期期末)
and course_name=+course_name+),)as +course_name+,
from (select distinct course_name from resultVIEW1 where class=某班 and
academic_year=10/11學(xué)年and term=下學(xué)期期末) as a select @sql=left(@sql,len
(@sql)-1) +from resultVIEW1 as b where class=某班 and academic_year=10/11學(xué)年 and term=下學(xué)期期末 group by stu?
dent_ID,student_name, retire exec(@sql)
以上SQL存儲過程代碼,主要是實(shí)現(xiàn)行列交叉的功能,即把圖2的數(shù)據(jù)表變成圖3的數(shù)據(jù)表,方便打印及查看。
圖2
圖3
4程序?qū)崿F(xiàn)
4.1查詢/打印畢業(yè)成績
procedureTF_PtAVGResult.FormCreate(Sender:TObject);
begin
//設(shè)置查詢年級列表框
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
//設(shè)置查詢班級列表框
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;//創(chuàng)建視圖文件“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學(xué)號,);
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標(biāo)識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不及格科數(shù)+);
sql.Add(fromresult_bujigeVIEW2asb);//whereresult1<60
sql.Add(groupbystudent_ID,student_name,retire);
sql.Add(select@sql=@sql+unionselect各科asstudent_id,合計(jì)人數(shù)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不及格科數(shù)orderby平均分desc);
sql.Add(exec(@sql));
ExecSQL;
end;
以上程序通過簡單的下拉選項(xiàng)選擇年級和班級,就以實(shí)現(xiàn)查詢某班所有學(xué)期每門課程的平均成績情況,顯示在屏幕窗口表格里,同時可以直接點(diǎn)打印按鈕,將成績打印出來;也可通過下面成績另存為程序?qū)崿F(xiàn)成績導(dǎo)出。
4.2成績另存為(或?qū)С觯?/p>
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;這部分程序與數(shù)據(jù)瀏覽窗口放在一起實(shí)現(xiàn)了,可以將數(shù)據(jù)導(dǎo)出生成xls、txt、csv、htm、rtf類型文件。
5主要技術(shù)特點(diǎn)
1)本系統(tǒng)適用于軟件環(huán)境為Win2003/WinXP/Win2000/WinNT/Win9x。
2)系統(tǒng)在設(shè)計(jì)上按通用性軟件的要求,做到了結(jié)構(gòu)良好,數(shù)據(jù)入或?qū)腱`活、方便。用戶在完成原始數(shù)據(jù)輸入或?qū)牒?,只需按幾下按鈕,即可完成對各種數(shù)據(jù)的處理和要求,并可根據(jù)預(yù)先定制好的格式生成成績表。
3)系統(tǒng)采用了多種形式的窗口控制技術(shù)和多種容錯措施,使軟件不僅具有獨(dú)特的屏幕界面風(fēng)格,而且較少地占用計(jì)算機(jī)系統(tǒng)資源,運(yùn)行快速、安全可靠。
4)系統(tǒng)的數(shù)據(jù)輸入采用鍵盤輸入或從Excel文件、CSV文件導(dǎo)入等多種輸入方式,而數(shù)據(jù)輸出采用屏幕顯示、打印、直接復(fù)制出去及導(dǎo)出生成xls、txt、csv、htm、rtf類型文件等多種輸出方式,從面完全可以滿足用戶的不同需求。
參考文獻(xiàn):
[1]陳豫龍,何旭洪.Delphi數(shù)據(jù)庫系統(tǒng)開發(fā)實(shí)例導(dǎo)航[M].2版.北京:人民郵電出版社,2003.
[2]張立科.Delphi 7組件編程參考手冊[M].北京:人民郵電出版社,2003.