摘要:目前,幾乎所有高校的成績(jī)管理都采用了MIS系統(tǒng)來(lái)實(shí)現(xiàn)。但鑒于高校課程設(shè)置的靈活性,及不同專(zhuān)業(yè)課程設(shè)置的差異性,實(shí)現(xiàn)一個(gè)靈活、完善、統(tǒng)一的成績(jī)排名功能一直是每個(gè)成績(jī)管理軟件最為關(guān)注的和難以做到盡善盡美的。探討了使用delphi+access開(kāi)發(fā)的成績(jī)管理系統(tǒng)中動(dòng)態(tài)排名的思路、方法及實(shí)現(xiàn)。
關(guān)鍵詞:成績(jī)管理;排名;delphi;access
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)24-7022-04
Implementing Dynamic Score Ranking Using Delphi and Access
KONG Tao-ru, YU Wei
(International Department, Xi'an Siyuan University, Xi'an 710038, China)
Abstract: At present, Almost all the colleges has used MIS system to implement their Score Managing. But because of the flexibility of the curriculum in college and the differences between different majors, it’s most important and a little difficult for every Score Managing Software to implement a flexible and all-purpose score ranking function. The thought, method and implementing of flexible and all-purpose score ranking in college Score Management are discussed in detail.
Key words: score managing; score ranking; delphi; access
1 目前成績(jī)管理中排名實(shí)現(xiàn)的難點(diǎn)及重點(diǎn)
學(xué)生成績(jī)管理是高校教務(wù)管理中至關(guān)重要也最為復(fù)雜的功能。 而成績(jī)排名則是高校成績(jī)管理中最復(fù)雜和重要的功能。
對(duì)高校成績(jī)管理來(lái)講,實(shí)現(xiàn)成績(jī)排名有三個(gè)難點(diǎn):
1)將成績(jī)的縱向記錄轉(zhuǎn)為橫向連接:在成績(jī)表中,每個(gè)學(xué)生的每門(mén)課程對(duì)應(yīng)一條記錄。假設(shè)某班有30名學(xué)生,每個(gè)學(xué)生在本學(xué)期參與了8門(mén)課程的考試。則在成績(jī)表中:每個(gè)學(xué)生的成績(jī)對(duì)應(yīng)8條記錄,全班學(xué)生共有240條成績(jī)記錄。而班級(jí)期末成績(jī)排名需要將學(xué)生的各門(mén)課程的成績(jī)橫向連接起來(lái)形成一條記錄,即八門(mén)課程名都作為字段名顯示出來(lái),這樣每個(gè)學(xué)生的排名結(jié)果對(duì)應(yīng)1條記錄,全班學(xué)生的排名結(jié)果共對(duì)應(yīng)30條記錄。
2)實(shí)現(xiàn)各專(zhuān)業(yè)不同課程數(shù)、學(xué)生數(shù)情況下的統(tǒng)一的成績(jī)求和及排名:同一高校內(nèi)各專(zhuān)業(yè)、各班級(jí)的課程門(mén)數(shù)未必相同。若為每個(gè)專(zhuān)業(yè)的各班級(jí)做各自不同的成績(jī)排名功能顯然會(huì)造成編程人員工作量的加大,及后期軟件維護(hù)工作量的加大。所以,我們考慮做一個(gè)動(dòng)態(tài)的成績(jī)排名:即無(wú)論各專(zhuān)業(yè)、各班級(jí)有多少課程門(mén)數(shù)、學(xué)生數(shù),我們都可實(shí)現(xiàn)統(tǒng)一完善的成績(jī)排名。
3)通過(guò)動(dòng)態(tài)生成報(bào)表來(lái)實(shí)現(xiàn)不同課程數(shù)、學(xué)生數(shù)的統(tǒng)一報(bào)表格式:由于各專(zhuān)業(yè)每學(xué)期課程門(mén)數(shù)及學(xué)生數(shù)不等,所以對(duì)排名結(jié)果無(wú)法使用統(tǒng)一格式的報(bào)表來(lái)實(shí)現(xiàn)。很多成績(jī)管理系統(tǒng)的做法都是提供用戶將排名結(jié)果導(dǎo)入到excel中,再進(jìn)行格式調(diào)整和打印。而在本系統(tǒng)中,我們利用第三方報(bào)表工具QReport實(shí)現(xiàn)了針對(duì)排名結(jié)果動(dòng)態(tài)生成統(tǒng)一的報(bào)表,即不管排名結(jié)果中有多少學(xué)生、多少門(mén)課程,都生成統(tǒng)一的報(bào)表格式并打印。
2 本系統(tǒng)采用的軟件
2.1 delphi編程語(yǔ)言環(huán)境
Delphi是Windows應(yīng)用軟件開(kāi)發(fā)環(huán)境, 采用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,具有高效的編譯器及強(qiáng)大的異常事件處理能力,使得程序設(shè)計(jì)者能用最簡(jiǎn)易的方法、在最短的時(shí)間開(kāi)發(fā)出界面優(yōu)美、運(yùn)行可靠、功能強(qiáng)大的Windows應(yīng)用軟件。
2.2 QReport報(bào)表工具
本系統(tǒng)中所有的報(bào)表包括學(xué)生成績(jī)排名報(bào)表都是使用QReport報(bào)表工具實(shí)現(xiàn)的。QReport是一款非常強(qiáng)大的數(shù)據(jù)分析及報(bào)表工具,支持多種流行的開(kāi)發(fā)語(yǔ)言環(huán)境,包括Delphi、.Net、Java等。
3 系統(tǒng)數(shù)據(jù)庫(kù)結(jié)構(gòu)
其中,成績(jī)表、成績(jī)臨時(shí)表、排名結(jié)果表是實(shí)現(xiàn)排名結(jié)果及報(bào)表用到的三個(gè)表。
3.1 學(xué)生表
表1為學(xué)生表。
3.3 課程表
表2為課程表。
3.4 成績(jī)表
表3為成績(jī)表。
3.5 成績(jī)臨時(shí)表
用來(lái)在生成排名結(jié)果的過(guò)程中存放指定班級(jí)和學(xué)期的學(xué)生成績(jī)記錄。表結(jié)構(gòu)同成績(jī)表。
表4為成績(jī)臨時(shí)表。
3.6 排名結(jié)果表
表5為排名結(jié)果表。
4 成績(jī)排名的流程設(shè)計(jì)
如圖1所示。
5成績(jī)排名的窗體及運(yùn)行結(jié)果
5.1 登錄系統(tǒng)
圖2為登錄窗體。
輸入正確的用戶名和密碼后,點(diǎn)擊‘登錄’,即進(jìn)入了主界面,如圖3。
5.2 進(jìn)入“班級(jí)期末成績(jī)排名”窗體
在主界面點(diǎn)擊“班級(jí)期末成績(jī)排名”菜單,進(jìn)入“班級(jí)期末成績(jī)排名”窗體,如圖4。
5.3 排名進(jìn)程
在‘班級(jí)期末成績(jī)排名’窗體選擇 ‘班級(jí)’和‘學(xué)期’,如‘06BA1’班,第‘一’學(xué)期,點(diǎn)擊‘確定’,則有個(gè)進(jìn)程條顯示正在生成排名數(shù)據(jù),圖5為排名進(jìn)程。
5.4 排名結(jié)果
排名完畢,即顯示‘排名結(jié)果’窗體,圖6為排名結(jié)果。
5.5 打印排名結(jié)果報(bào)表
在 ‘排名結(jié)果’窗體中,點(diǎn)擊“打印”按鈕,即顯示排名結(jié)果報(bào)表的打印預(yù)覽,如圖7所示。
點(diǎn)擊工具欄的‘打印’按鈕,即可打印。
6 成績(jī)排名實(shí)現(xiàn)的關(guān)鍵代碼:
6.1 生成排名結(jié)果
procedure Tfrm_ClassTermQue.BTN_QueryClick(Sender: TObject);
//本子程序變量聲明
var CmdText,Item,F(xiàn)NOFMc,F(xiàn)NOFZF:String;
i,j,m,n,StuCount:integer;
SumScore:real;
TheColumn:Tcolumn;
begin
Str_Class:=dbcombox_class.text;
str_term:=trim(cbx_Term.text);
//將成績(jī)的縱向記錄轉(zhuǎn)為橫向連接
with dm_frm.ADS_TempStuScore do
begin
close;
commandtext:='select * from 排名結(jié)果表';
open;
end;
//提取學(xué)號(hào)、姓名
with dm_frm do
begin
ads1.close;
ads1.CommandText:='select 思源學(xué)號(hào),學(xué)生姓名 from 學(xué)生表 where 班級(jí)代碼='''+str_class+'''';
ads1.open;
//將符合條件的所有的學(xué)號(hào)、姓名插入到排名結(jié)果表表中
while not ads1.eof do
begin
with ADS_TempStuScore do
begin
insert;
FieldValues['FstudentID']:=ads1.FieldValues['思源學(xué)號(hào)'];
FieldValues['FName']:=ads1.FieldValues['學(xué)生姓名'];
post;
End;
ads1.next;
end;
end;
with dm_frm.ads2 do
//實(shí)現(xiàn)各專(zhuān)業(yè)不同課程數(shù)、學(xué)生數(shù)情況下的統(tǒng)一的成績(jī)求和及排名
FNOFZF:=dm_frm.ADS_TempStuScore.fields[m].FieldName;//‘總分’
m:=m+1;//‘名次’
i:=1;//名次從1開(kāi)始排
FNOFMc:=dm_frm.ADS_TempStuScore.fields[m].FieldName;//‘名次’
j:=0; //已排名人數(shù)
StuCount:=dm_frm.ADS.fieldvalues['StuCount'];
while j begin while not dm_frm.ADS.Eof do begin dm_frm.acmd.commandtext:='update 排名結(jié)果表 set '+dm_frm.ADS.fields[m].FieldName+'='+inttostr(i)+' where fstudentid='''+dm_frm.ADS.fieldvalues['Fstudentid']+''''; dm_frm.acmd.Execute; j:=j+1; dm_frm.ADS.next; end; i:=i+1;//將被分配的名次 end; end; 6.2 生成排名結(jié)果報(bào)表: procedure Tfrm_Rep_TermScoreQueueReport.BTN_PrintClick(Sender: TObject); vari:integer; left:integer; begin with dm_frm.ads3 do begin close; commandtext:='select 課程代碼,中文課程名 from 課程表 where 課程表.所屬專(zhuān)業(yè)='''+frm_ClassTermQue.str_spe+''' and 課程表.考核學(xué)期='''+frm_ClassTermQue.str_term+''' order by 課程代碼'; open; while not eof do begin QRLabel_arr[i]:=TQRLabel.create(nil); With QRLabel_arr[i] do begin parent:=qr_Score.Bands.ColumnHeaderBand; caption:=fieldvalues['中文課程名']; width:=150; height:=14; top:=5; End; // QRDBText_arr[i]:=TQRDBText.create(nil); With QRDBText_arr[i] do begin parent:=qr_Score.Bands.detailBand; DataSet:=dm_frm.ads_TempstuScore; dataField:=dm_frm.ads_TempstuScore.Fields[i+2].FieldName; width:=150; height:=14; top:=5; end if i=0 then left:=left+10 else left:=left+60; QRLabel_arr[i].left:=left; QRDBText_arr[i].left:=left; i:=i+1; next; end; end; end; 參考文獻(xiàn): [1] 陳豫龍,何旭洪.Delphi6數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2002. [2] Bodand Software Corpomtion.Borland Developer Stlldio 2006 Guide[M].USA:Borland Software Corporation,2006. [3] 張春林,馬成勇,劉均.Delphi7數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2003.