綜合案例七 學(xué)生成績管理系統(tǒng)【實驗?zāi)康呐c要求】 1.熟練使用VFP的操作環(huán)境 2.熟練使用項目管理器管理各種文件 3.掌握數(shù)據(jù)庫的設(shè)計方法和步驟 4.熟練掌握數(shù)據(jù)庫表及其表之間關(guān)系的創(chuàng)建與使用 5.掌握查詢與視圖的創(chuàng)建與使用 6.掌握程序設(shè)計的基本方法 7.掌握表單及其表單中各種控件的設(shè)計與使用 8.掌握菜單的創(chuàng)建和使用
【實驗要求】 根據(jù)實際需要,編寫班級學(xué)生成績管理系統(tǒng),解決傳統(tǒng)手工方式的成績管理,達到減少工作量、方便進行成績查詢、實現(xiàn)自動的成績統(tǒng)計,提高效率的目的。 具體如下: (1) 班級學(xué)生基本信息維護:包括班級學(xué)生基本信息的錄入、修改、刪除、查詢等 (2) 班級學(xué)生成績信息維護:包括班級學(xué)生成績信息的錄入、修改、刪除等 (3) 成績查詢:包括按學(xué)號、姓名兩種方式進行成績查詢 (4) 成績統(tǒng)計:包括個人成績、課程成績、班級成績統(tǒng)計
【系統(tǒng)功能模塊】 本系統(tǒng)設(shè)計了一個簡單的數(shù)據(jù)庫,學(xué)生基本信息、學(xué)生成績信息,即能基本滿足班級成績管理的要求。系統(tǒng)主要分為五個模塊: (1) 學(xué)生基本信息維護模塊:在此模塊中,班級成績管理員可以對學(xué)生基本信息如學(xué)號、姓名、性別等進行維護,可以新增、修改、刪除或查詢學(xué)生基本信息。 (2) 成績錄入模塊:在此模塊中,班級成績管理員可以進行班級學(xué)生成績的錄入。 (3) 成績查詢模塊:每個學(xué)生可以在此模塊中通過學(xué)號或姓名來進行個人成績的查詢。 (4) 成績修改模塊:班級成績管理員可以在此模塊中進行學(xué)生成績的修改。 (5) 成績刪除模塊:班級成績管理員在此模塊中刪除學(xué)生成績信息。 (6) 成績統(tǒng)計模塊:每個學(xué)生可以在此模塊中查看個人成績、課程成績、班級成績的統(tǒng)計結(jié)果。
【實驗內(nèi)容】 1、 數(shù)據(jù)庫結(jié)構(gòu)設(shè)計 按照系統(tǒng)不同的功能模塊,需要不同的表來存儲信息,數(shù)據(jù)庫設(shè)計如下: (1) 學(xué)生基本信息表STUINFO
(2) 學(xué)生成績信息表SCORE
一、詳細(xì)設(shè)計 1、 主界面模塊
2、 學(xué)生基本信息維護 該模塊實現(xiàn)學(xué)生基本信息的維護,包括增加、刪除、修改等維護數(shù)據(jù)的操作。由于學(xué)生的基本信息僅僅是成績管理系統(tǒng)中的輔助數(shù)據(jù),信息內(nèi)容簡單,數(shù)據(jù)變動不大,維護操作較簡單,故直接使用VFP中的表單向?qū)稍摫韱?,運行界面如下:
3、 成績錄入 該模塊實現(xiàn)班級學(xué)生成績的錄入。一個學(xué)生一條成績記錄。已錄入成績的學(xué)生不能再進行成績的錄入,只能做修改等其它操作。所以在錄入成績時,只能在學(xué)號下拉框中進行未曾錄入成績的學(xué)生學(xué)號的選擇,同時在姓名文本框中確認(rèn)是否待錄入成績的學(xué)生。確認(rèn)該生后,錄入其成績數(shù)據(jù)。運行界面如下: 程序代碼: 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、 成績查詢 該模塊實現(xiàn)班級學(xué)生各門課程成績的查詢??梢园磳W(xué)號、姓名兩種方式來進行查詢。查詢結(jié)果是不允許修改的,所有顯示查詢結(jié)果的文本框的ReadOnly屬性均為.T.。運行界面如下: 程序代碼: 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('沒有此學(xué)號!',0+48+0,'錯誤') thisform.text1.setfocus endif
Cmdcancel的Click事件代碼: thisform.release
Frmxhcx2: Text1到Text5的ControlSource屬性要修改為相應(yīng)數(shù)據(jù)表的字段名,將相應(yīng)數(shù)據(jù)與文本框綁定在一起,可以在運行期間顯示數(shù)據(jù)的值,修改文本框的值也會反應(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('沒有此姓名!',0+48+0,'錯誤') 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、 成績修改 該模塊實現(xiàn)班級學(xué)生各門課程成績數(shù)據(jù)的修改??梢园磳W(xué)號、姓名兩種方式來進行修改,兩種方式類似。以按學(xué)號進行修改為例,運行界面如下: 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('沒有此學(xué)號!',0+48+0,'錯誤') thisform.text1.setfocus endif
Cmdcancel的Click事件代碼: thisform.release
Frmxhxg2: Frmxmsc2的Load事件代碼: 由于進行了數(shù)據(jù)綁定,對文本框內(nèi)容的修改會直接反應(yīng)到數(shù)據(jù)表中。確認(rèn)修改無需做特別工作,但是取消修改需要恢復(fù)修改前的原值。故在此使用了數(shù)組a來保存修改前的原始值。在恢復(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、 成績刪除 該模塊實現(xiàn)班級學(xué)生各門課程成績數(shù)據(jù)的刪除??梢园磳W(xué)號、姓名兩種方式來進行刪除,兩種方式類似。以按姓名進行刪除為例,運行界面如下: 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('沒有此姓名!',0+48+0,'錯誤') 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、 成績統(tǒng)計 個人成績統(tǒng)計中,使用了四個視圖:YW、SX、YY、PJF,以取該生的語文、數(shù)學(xué)、英語及總分在班級中的排名次序。 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('沒有此學(xué)號或姓名!',0+48+0,'錯誤') 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='語文' kc='yuwen' case kcm='數(shù)學(xué)' kc='shuxue' case kcm='英語' 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
|
