綜合案例七 學(xué)生成績(jī)管理系統(tǒng)【實(shí)驗(yàn)?zāi)康呐c要求】 1.熟練使用VFP的操作環(huán)境 2.熟練使用項(xiàng)目管理器管理各種文件 3.掌握數(shù)據(jù)庫(kù)的設(shè)計(jì)方法和步驟 4.熟練掌握數(shù)據(jù)庫(kù)表及其表之間關(guān)系的創(chuàng)建與使用 5.掌握查詢與視圖的創(chuàng)建與使用 6.掌握程序設(shè)計(jì)的基本方法 7.掌握表單及其表單中各種控件的設(shè)計(jì)與使用 8.掌握菜單的創(chuàng)建和使用
【實(shí)驗(yàn)要求】 根據(jù)實(shí)際需要,編寫(xiě)班級(jí)學(xué)生成績(jī)管理系統(tǒng),解決傳統(tǒng)手工方式的成績(jī)管理,達(dá)到減少工作量、方便進(jìn)行成績(jī)查詢、實(shí)現(xiàn)自動(dòng)的成績(jī)統(tǒng)計(jì),提高效率的目的。 具體如下: (1) 班級(jí)學(xué)生基本信息維護(hù):包括班級(jí)學(xué)生基本信息的錄入、修改、刪除、查詢等 (2) 班級(jí)學(xué)生成績(jī)信息維護(hù):包括班級(jí)學(xué)生成績(jī)信息的錄入、修改、刪除等 (3) 成績(jī)查詢:包括按學(xué)號(hào)、姓名兩種方式進(jìn)行成績(jī)查詢 (4) 成績(jī)統(tǒng)計(jì):包括個(gè)人成績(jī)、課程成績(jī)、班級(jí)成績(jī)統(tǒng)計(jì)
【系統(tǒng)功能模塊】 本系統(tǒng)設(shè)計(jì)了一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù),學(xué)生基本信息、學(xué)生成績(jī)信息,即能基本滿足班級(jí)成績(jī)管理的要求。系統(tǒng)主要分為五個(gè)模塊: (1) 學(xué)生基本信息維護(hù)模塊:在此模塊中,班級(jí)成績(jī)管理員可以對(duì)學(xué)生基本信息如學(xué)號(hào)、姓名、性別等進(jìn)行維護(hù),可以新增、修改、刪除或查詢學(xué)生基本信息。 (2) 成績(jī)錄入模塊:在此模塊中,班級(jí)成績(jī)管理員可以進(jìn)行班級(jí)學(xué)生成績(jī)的錄入。 (3) 成績(jī)查詢模塊:每個(gè)學(xué)生可以在此模塊中通過(guò)學(xué)號(hào)或姓名來(lái)進(jìn)行個(gè)人成績(jī)的查詢。 (4) 成績(jī)修改模塊:班級(jí)成績(jī)管理員可以在此模塊中進(jìn)行學(xué)生成績(jī)的修改。 (5) 成績(jī)刪除模塊:班級(jí)成績(jī)管理員在此模塊中刪除學(xué)生成績(jī)信息。 (6) 成績(jī)統(tǒng)計(jì)模塊:每個(gè)學(xué)生可以在此模塊中查看個(gè)人成績(jī)、課程成績(jī)、班級(jí)成績(jī)的統(tǒng)計(jì)結(jié)果。
【實(shí)驗(yàn)內(nèi)容】 1、 數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì) 按照系統(tǒng)不同的功能模塊,需要不同的表來(lái)存儲(chǔ)信息,數(shù)據(jù)庫(kù)設(shè)計(jì)如下: (1) 學(xué)生基本信息表STUINFO
(2) 學(xué)生成績(jī)信息表SCORE
一、詳細(xì)設(shè)計(jì) 1、 主界面模塊
2、 學(xué)生基本信息維護(hù) 該模塊實(shí)現(xiàn)學(xué)生基本信息的維護(hù),包括增加、刪除、修改等維護(hù)數(shù)據(jù)的操作。由于學(xué)生的基本信息僅僅是成績(jī)管理系統(tǒng)中的輔助數(shù)據(jù),信息內(nèi)容簡(jiǎn)單,數(shù)據(jù)變動(dòng)不大,維護(hù)操作較簡(jiǎn)單,故直接使用VFP中的表單向?qū)稍摫韱?,運(yùn)行界面如下:
3、 成績(jī)錄入 該模塊實(shí)現(xiàn)班級(jí)學(xué)生成績(jī)的錄入。一個(gè)學(xué)生一條成績(jī)記錄。已錄入成績(jī)的學(xué)生不能再進(jìn)行成績(jī)的錄入,只能做修改等其它操作。所以在錄入成績(jī)時(shí),只能在學(xué)號(hào)下拉框中進(jìn)行未曾錄入成績(jī)的學(xué)生學(xué)號(hào)的選擇,同時(shí)在姓名文本框中確認(rèn)是否待錄入成績(jī)的學(xué)生。確認(rèn)該生后,錄入其成績(jī)數(shù)據(jù)。運(yùn)行界面如下: 程序代碼: Frmsr的Load事件代碼: public dimension no(100) for i=1 to 100 no(i)=.f. endfor open data student select 1 use stuinfo select 2 use score select 1 i=1 scan select 2 locate for xh=a.xh if not found() no(i)=a.xh i=i+1 endif select 1 endscan
Frmsr的Init事件代碼: thisform.combo1.clear i=1 do while type('no(i)')!='L' thisform.combo1.additem(no(i)) i=i+1 enddo
Frmsr的Release事件代碼: select 1 use select 2 use close database
Cmdok的Click事件代碼: select 2 append blank replace xh with thisform.combo1.value if len(alltrim(thisform.text3.value))>0 replace yuwen with val(thisform.text3.value) else replace yuwen with 0 endif if len(alltrim(thisform.text4.value))>0 replace shuxue with val(thisform.text4.value) else replace shuxue with 0 endif if len(alltrim(thisform.text5.value))>0 replace yingyu with val(thisform.text5.value) else replace yingyu with 0 endif replace pingjunfen with (yuwen+shuxue+yingyu)/3 thisform.release
Cmdcancel的Click事件代碼: thisform.release
4、 成績(jī)查詢 該模塊實(shí)現(xiàn)班級(jí)學(xué)生各門(mén)課程成績(jī)的查詢??梢园磳W(xué)號(hào)、姓名兩種方式來(lái)進(jìn)行查詢。查詢結(jié)果是不允許修改的,所有顯示查詢結(jié)果的文本框的ReadOnly屬性均為.T.。運(yùn)行界面如下: 程序代碼: Frmxhcx1: Cmdok的Click事件代碼: cxxh=alltrim(thisform.text1.value) open data student select 1 use score loca for alltrim(xh)==cxxh if found() do form newcx1 thisform.release else messagebox('沒(méi)有此學(xué)號(hào)!',0+48+0,'錯(cuò)誤') thisform.text1.setfocus endif
Cmdcancel的Click事件代碼: thisform.release
Frmxhcx2: Text1到Text5的ControlSource屬性要修改為相應(yīng)數(shù)據(jù)表的字段名,將相應(yīng)數(shù)據(jù)與文本框綁定在一起,可以在運(yùn)行期間顯示數(shù)據(jù)的值,修改文本框的值也會(huì)反應(yīng)到數(shù)據(jù)表中。如:Text1.ControlSource=score.xh。 Frmxhcx2的Load事件代碼: select 2 use stuinfo locate for xh=a.xh
Cmdok的Click事件代碼: select 1 use select 2 use close data thisform.release 程序代碼: Frmxmcx1: Cmdok的Click事件代碼: cxxm=alltrim(thisform.text1.value) open data student select 1 use stuinfo loca for alltrim(xm)==cxxm if found() do form newcx2 thisform.release else messagebox('沒(méi)有此姓名!',0+48+0,'錯(cuò)誤') thisform.text1.setfocus endif
Cmdcancel的Click事件代碼: thisform.release
Frmxmcx2: Text1到Text5的ControlSource屬性同樣要修改為相應(yīng)數(shù)據(jù)表的字段名。 Frmxmcx2的Load事件代碼: select 2 use score locate for xh=a.xh
Cmdok的Click事件代碼: select 1 use select 2 use close data thisform.release
5、 成績(jī)修改 該模塊實(shí)現(xiàn)班級(jí)學(xué)生各門(mén)課程成績(jī)數(shù)據(jù)的修改??梢园磳W(xué)號(hào)、姓名兩種方式來(lái)進(jìn)行修改,兩種方式類(lèi)似。以按學(xué)號(hào)進(jìn)行修改為例,運(yùn)行界面如下: Frmxhxg1: Cmdok的Click事件代碼: cxxh=alltrim(thisform.text1.value) open data student select 1 use score loca for alltrim(xh)==cxxh if found() do form newxg1 thisform.release else messagebox('沒(méi)有此學(xué)號(hào)!',0+48+0,'錯(cuò)誤') thisform.text1.setfocus endif
Cmdcancel的Click事件代碼: thisform.release
Frmxhxg2: Frmxmsc2的Load事件代碼: 由于進(jìn)行了數(shù)據(jù)綁定,對(duì)文本框內(nèi)容的修改會(huì)直接反應(yīng)到數(shù)據(jù)表中。確認(rèn)修改無(wú)需做特別工作,但是取消修改需要恢復(fù)修改前的原值。故在此使用了數(shù)組a來(lái)保存修改前的原始值。在恢復(fù)修改中,使用gather from a恢復(fù)原值。 select 2 use stuinfo locate for xh=a.xh public declare a(4) select 1 scatter to a
Cmdok的Click事件代碼: select 1 replace pingjunfen with (yuwen+shuxue+yingyu)/3 use select 2 use close data thisform.release
Cmdcancel的Click事件代碼: select 1 gather from a use select 2 use close data thisform.release
6、 成績(jī)刪除 該模塊實(shí)現(xiàn)班級(jí)學(xué)生各門(mén)課程成績(jī)數(shù)據(jù)的刪除??梢园磳W(xué)號(hào)、姓名兩種方式來(lái)進(jìn)行刪除,兩種方式類(lèi)似。以按姓名進(jìn)行刪除為例,運(yùn)行界面如下: Frmxmsc1: Cmdok的Click事件代碼: cxxm=alltrim(thisform.text1.value) open data student select 1 use stuinfo loca for alltrim(xm)==cxxm if found() do form newsc2 thisform.release else messagebox('沒(méi)有此姓名!',0+48+0,'錯(cuò)誤') thisform.text1.setfocus endif
Cmdcancel的Click事件代碼: thisform.release
Frmxmsc2: Frmxmsc2的Load事件代碼: select 2 use score locate for xh=a.xh
Cmdok的Click事件代碼: select 2 dele pack use select 1 use close data thisform.release
Cmdcancel的Click事件代碼: select 1 use select 2 use close data thisform.release
7、 成績(jī)統(tǒng)計(jì) 個(gè)人成績(jī)統(tǒng)計(jì)中,使用了四個(gè)視圖:YW、SX、YY、PJF,以取該生的語(yǔ)文、數(shù)學(xué)、英語(yǔ)及總分在班級(jí)中的排名次序。 Frmgrtj1: Cmdok的Click事件代碼: xhxm=alltrim(thisform.text1.value) open data student select 2 use studscore loca for alltrim(xh)==xhxm if found() do form newgrtj2 thisform.release else loca for alltrim(xm)==xhxm if found() do form newgrtj2 thisform.release else messagebox('沒(méi)有此學(xué)號(hào)或姓名!',0+48+0,'錯(cuò)誤') thisform.text1.setfocus endif endif
Cmdcancel的Click事件代碼: thisform.release
Frmgrtj2: Frmgrtj2的Activate事件代碼: set talk off select 2 xuehao=studscore.xh thisform.text6.value=alltrim(studscore.xh) thisform.text7.value=alltrim(studscore.xm) thisform.text8.value=alltrim(str(studscore.yuwen)) thisform.text9.value=alltrim(str(studscore.shuxue)) thisform.text10.value=alltrim(str(studscore.yingyu)) thisform.text4.value=alltrim(str(studscore.pingjunfen)) select 3 use yw loca for xh=xuehao mc1=recno() thisform.text1.value=mc1 select 4 use sx loca for xh=xuehao mc2=recno() thisform.text2.value=mc2 select 5 use yy loca for xh=xuehao mc3=recno() thisform.text3.value=mc3 select 6 use pjf loca for xh=xuehao thisform.text5.value=recno()
Cmdok的Click事件代碼: select 1 use select 2 use select 3 use select 4 use select 5 use select 6 use close data set talk on thisform.release
Frmkctj1: Cmdok的Click事件代碼: public kcm kcm=alltrim(thisform.combo1.value) do form newkctj2 thisform.release
Cmdcancel的Click事件代碼: thisform.release
Frmkctj2: Frmkctj2的Activate事件代碼: set talk off do case case kcm='語(yǔ)文' kc='yuwen' case kcm='數(shù)學(xué)' kc='shuxue' case kcm='英語(yǔ)' kc='yingyu' endcase open data student use score count all to zrs count for &kc<60 to bjg1 count for &kc<70 and &kc>=60 to jg1 count for &kc<80 and &kc>=70 to zhong1 count for &kc<90 and &kc>=80 to liang1 count for &kc<=100 and &kc>=90 to you1 bjg2=str(bjg1/zrs*100,5,1)+'%' jg2=str(jg1/zrs*100,5,1)+'%' zhong2=str(zhong1/zrs*100,5,1)+'%' liang2=str(liang1/zrs*100,5,1)+'%' you2=str(you1/zrs*100,5,1)+'%' calculate max(&kc) all to zgf calculate min(&kc) all to zdf average &kc all to pjf1 pjf=str(pjf1,5,1)
Cmdok的Click事件代碼: use close data thisform.release
Frmbjtj的Load事件代碼: set talk off open data student drop table stuscore select 1 use stuinfo set order to xh select 2 use score join with a to stuscore for a.xh=b.xh fields a.xh,a.xm,yuwen,shuxue,yingyu,pingjunfen add table stuscore use stuscore sum yuwen to a sum shuxue to b sum yingyu to c count all to d zjf=str((a+b+c)/d/3,5,1) count for yuwen<60 to aa count for shuxue<60 to bb count for yingyu<60 to cc bjgrs=aa+bb+cc bjgl1=(aa+bb+cc)/3/d*100 bjgl=str(bjgl1,5,1)+'%' jgl=str(100-bjgl1,5,1)+'%' go top
Cmdok的Click事件代碼: select 1 use select 2 use close data thisform.release
|