|
一、系統(tǒng)分析與設(shè)計 在任何高等院校,學(xué)生的成績管理都是學(xué)校教務(wù)管理的重要環(huán)節(jié)之一。隨著學(xué)校學(xué)生人數(shù)的增加,學(xué)生成績管理的任務(wù)更加繁重,必須借助現(xiàn)代化的管理工具和手段提高學(xué)生成績管理效率。學(xué)生成績管理系統(tǒng)廣泛適用于高校教務(wù)管理部門的學(xué)生成績管理。 、系統(tǒng)功能分析 系統(tǒng)功能分析階段的任務(wù)就是確定該系統(tǒng)所要解決的問題及其具體要求。需要通過與用戶的交流和溝通明確用戶對系統(tǒng)的功能要求,最終列出系統(tǒng)可以實現(xiàn)的功能由用戶確認(rèn)。本例中的學(xué)生成績管理系統(tǒng)需要完成的主要功能如下。 ⑴ 班級信息的輸入和存儲,包括班級編號、班級名稱、所屬院系、入校時間和學(xué)制等。 ⑵ 對已經(jīng)輸入的班級信息的修改、查詢。 ⑶ 學(xué)生基本信息的輸入和存儲,包括學(xué)號、姓名、性別、出生日期、班級等。 ⑷ 學(xué)生基本信息的修改和查詢。 ⑸ 每學(xué)期初各班所開設(shè)課程的輸入,包括課程名、學(xué)期、學(xué)時等。 ⑹ 各班所開設(shè)課程信息的修改和查詢。 ⑺ 學(xué)期末輸入每個學(xué)生的考試成績。 ⑻ 學(xué)生成績的修改。 ⑼ 查詢某個學(xué)生某學(xué)期的各科成績。 ⑽ 查詢并打印某班某學(xué)期所有學(xué)生的各科成績。 ⑾ 查詢并打印某班某學(xué)期某科成績。 ⑿ 系統(tǒng)具有用戶和密碼的管理。 、系統(tǒng)功能模塊設(shè)計 通過對上述各項功能的分析、分類、綜合,按照模塊化程序設(shè)計的要求,得到如圖1所示的功能模塊圖。 二、數(shù)據(jù)庫設(shè)計與實現(xiàn) 數(shù)據(jù)庫在一個管理信息系統(tǒng)中占有非常重要的地位,數(shù)據(jù)庫結(jié)構(gòu)的好壞將直接影響到應(yīng)用系統(tǒng)的實現(xiàn)效果和數(shù)據(jù)操作效率以及能否保證數(shù)據(jù)的一致性、完成性和安全性。 、數(shù)據(jù)庫設(shè)計 根據(jù)學(xué)生成績管理系統(tǒng)的功能要求,通過分析系統(tǒng)要涉及的相關(guān)實體以及要收集、存儲和操縱的數(shù)據(jù)信息,得到如圖2所示的系統(tǒng)E-R圖。 根據(jù)系統(tǒng)E-R圖得到以下關(guān)系模式。 班級(班級編號,班級名稱,所屬院系,學(xué)制,入學(xué)時間,人數(shù))。 學(xué)生基本信息(學(xué)號,姓名,性別,出生日期,家庭住址,班級編號)。 課程(班級編號,學(xué)期,課程名稱,學(xué)時,教師)。 成績(學(xué)號,學(xué)期,課程名稱,成績)。 為了系統(tǒng)的使用安全,要建立用戶管理,而用戶使用權(quán)限分為管理員和一般用戶兩類,因此需要建立一個存儲用戶信息的關(guān)系。 用戶(姓名,密碼,用戶類型)。 、創(chuàng)建數(shù)據(jù)庫 根據(jù)關(guān)系模式,確定需要建立的數(shù)據(jù)庫和表。 在PowerBuilder開發(fā)環(huán)境中打開數(shù)據(jù)庫畫板,使用【ODB ODBC】接口建立Adaptive Server Anywhere 9.0(ASA 9.0)的數(shù)據(jù)庫D:.db,然后依次建立以下5個表和1個視圖。 為了訪問數(shù)據(jù)庫方便,還建立了1個視圖“v_1”,該視圖由學(xué)生基本信息表和班級 表連接而成,對應(yīng)的SQL語句如下。 VIEW v_1(xh,xm,xb,csrq,bjbh,bjmc,zymc)AS SELECT .xh,student.xm,student.xb,student.csrq,stude .bjbh,class.bjmc,class.xbmc student,class (class.bjbh=student.bjbh); 完成數(shù)據(jù)庫和表的創(chuàng)建后,可以在數(shù)據(jù)庫畫板中向數(shù)據(jù)庫輸入部分?jǐn)?shù)據(jù)。其中,“用戶”表中必須輸入一條記錄(“900001”,“123456”,“管理員”),作為進入系統(tǒng)默認(rèn)的管理員,即賬號為“900001”,密碼為“123456”,用戶類型“管理員”。 三、創(chuàng)建應(yīng)用對象 完成數(shù)據(jù)庫的設(shè)計和系統(tǒng)功能設(shè)計之后,可以開始各個功能模塊的實現(xiàn)。在PowerBuilder中開發(fā)應(yīng)用程序時,就是創(chuàng)建各種對象、為對象設(shè)置屬性以及編寫事件腳本的過程。 ⑴ 創(chuàng)建新的工作空間,工作空間文件路徑及名稱設(shè)為“d:.pbw”。 ⑵ 創(chuàng)建應(yīng)用對象,應(yīng)用對象名設(shè)為“xscj”,應(yīng)用庫文件路徑及名稱設(shè)為“d:.pbl”,目標(biāo)文件路徑及名稱設(shè)為“d:.pbt”。 (3) 為應(yīng)用對象xscj的Open事件編寫代碼如下。 四、設(shè)計系統(tǒng)管理模塊 本模塊實現(xiàn)用戶登錄控制、學(xué)生能查詢自己的個人成績,教師能錄入班級的課程信息,管理員能實現(xiàn)對用戶管理的控制以及對一些基本信息的錄入。 、設(shè)計登錄窗口 創(chuàng)建登錄窗口w_load,調(diào)整其大小,在窗口上放置1個圖片控件(p_1)、4個靜態(tài)文本 ) 編寫腳本 ⑴ 定義全局變量。 gs_username,gs_password,gs_admin分別存儲登錄用戶的賬號、密碼和用戶類型。 ⑵ 定義實例變量。 li_n 存儲登錄時用戶輸入密碼錯誤的嘗試次數(shù),控制在最多3次機會不能是局部變量。 ⑶ 登錄窗口w_login的Open事件腳本如下。初始化變量li_n,限制出錯次數(shù)為3次。 ⑷【登錄】按鈕cb_1的Clicked事件腳本如下。 、設(shè)計密碼修改窗口 密碼修改窗口如圖5所示。 ) 創(chuàng)建窗口并設(shè)置屬性 創(chuàng)建密碼修改窗口w_mmxg,調(diào)整其大小,在窗口上放置3個靜態(tài)文本控件(st_1、st_2、st_3)、3個單行編輯器控件(sle_1、sle_2、sle_3)、2個命令按鈕控件(cb_1、cb_2),各個控件的位置和大小參照圖5調(diào)整。 其他需要修改的屬性見表2,表中未列出的屬性保留其默認(rèn)值。 (2)【取消】按鈕cb_2的Clicked事件腳本如下。 、設(shè)計用戶管理的數(shù)據(jù)窗口和窗口 ) 設(shè)計數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口“d_yhgl”,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“Quick Select”,布局如圖6所示。數(shù)據(jù)窗口d_yhgl生成的SQL Select語句為: ) 創(chuàng)建窗口并設(shè)置屬性 創(chuàng)建用戶管理窗口w_yhgl,調(diào)整其大小,在窗口上放置1個數(shù)據(jù)窗口控件(dw_1)、 個命令按鈕控件(cb_1、cb_2、cb_3、cb_4),各個控件的位置和大小如圖7所示,其 (1) 用戶管理窗口w_yhgl的Open事件腳本如下。 (2) 用戶管理窗口w_yhgl的Closequery事件腳本如下。 (3) 數(shù)據(jù)窗口控件dw_1的Itemchanged事件腳本如下。 _3.enabled=true//激活“保存”按鈕 (4)【添加】按鈕控件cb_1的Clicked事件腳本如下。 row row=dw_1.insertrow(0) _1.scrolltorow(row) (5)【刪除】按鈕控件cb_2的Clicked事件腳本如下。 _1.deleterow(0) _3.enabled=true (6)【保存】按鈕控件cb_3的Clicked事件腳本如下。 if dw_1.update(true,false)=1 then _1.resetupdate() _3.enabled=false (7)【退出】按鈕控件cb_4的Clicked事件腳本如下。 五、設(shè)計主窗口和菜單 主窗口和菜單是系統(tǒng)工作的主界面。 、創(chuàng)建菜單對象 菜單結(jié)構(gòu)如圖8所示。菜單對象名為“m_main”,菜單欄中的菜單項設(shè)置了訪問 鍵(AccessKey),菜單項在工具條上建立了圖標(biāo)按鈕。 (1)【系統(tǒng)】菜單下【密碼修改】菜單項的Clicked事件腳本如下。 (w_mmxg) (2)【系統(tǒng)】菜單下【用戶管理】菜單項的Clicked事件腳本如下。 (w_yhgl) (3)【系統(tǒng)】菜單下【退出系統(tǒng)】菜單項的Clicked事件腳本如下。 (parentwindow) (4)【班級管理】菜單下【錄入班級信息】菜單項的Clicked事件腳本如下。 (w_banji_shuru) (5)【班級管理】菜單下【修改班級信息】菜單項的Clicked事件腳本如下。 (w_banji_xiugai) (6)【班級管理】菜單下【瀏覽班級信息】菜單項的Clicked事件腳本如下。 (w_banji_liulan) (7)【學(xué)生管理】菜單下【錄入學(xué)生信息】菜單項的Clicked事件腳本如下。 (w_student_shuru) (8)【學(xué)生管理】菜單下【修改學(xué)生信息】菜單項的Clicked事件腳本如下。 (9)【學(xué)生管理】菜單下【查詢學(xué)生信息】菜單項的Clicked事件腳本如下。 (w_student_chaxun) (10)【課程管理】菜單下【錄入/修改開設(shè)課程】菜單項的Clicked事件腳本如下。 (w_subject_shuruxiugai) (11)【課程管理】菜單下【查詢開設(shè)課程信息】菜單項的Clicked事件腳本如下。 (w_subject_chaxun) (12)【成績管理】菜單下【錄入修改成績】菜單項的Clicked事件腳本如下。 (w_xscj_shuru) (13)【成績管理】菜單下【查詢個人成績】菜單項的Clicked事件腳本如下。 (w_xscj_grcx) (14)【成績管理】菜單下【查詢班級成績】菜單項的Clicked事件腳本如下。 (w_xscj_bjcx) (15)【成績管理】菜單下【查詢課程成績】菜單項的Clicked事件腳本如下。 (w_xscj_kccx) (16)【窗口】菜單下【層疊窗口】菜單項的Clicked事件腳本如下。 //w_main.arrangesheets(cascade!) (17)【幫助】菜單下【關(guān)于】菜單項的Clicked事件腳本如下。 (w_about) 、設(shè)計主窗口 創(chuàng)建主窗口w_main如圖9所示,其需要設(shè)置的屬性如表4所示,表中未列出的屬性保留其默認(rèn)值。 表4 窗口對象w_main的Open事件腳本如下。 gs_admin=學(xué)生 then _main.m_系統(tǒng).m_用戶管理.enabled=false m_main.m_學(xué)生管理.enabled=false _main.m_班級管理.enabled=false _main.m_課程管理.m_錄入修改開設(shè)課程信息.enabled=false _main.m_成績管理.m_錄入修改成績.enabled=false _main.m_成績管理.m_查詢班級成績.enabled=false _main.m_成績管理.m_查詢課程成績.enabled=false gs_admin=教師 then _main.m_系統(tǒng).m_用戶管理.enabled=false m_main.m_學(xué)生管理.enabled=false m_main.m_班級管理.enabled=false 其功能是對用戶進行權(quán)限控制。 六、設(shè)計班級管理模塊 本模塊實現(xiàn)班級信息的輸入、修改和查詢。 、設(shè)計訪問班級信息的數(shù)據(jù)窗口 ) 設(shè)計輸入班級信息的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_class_shuru,顯示風(fēng)格為“Freeform”,數(shù)據(jù)源類型為“Quick Select”, 其布局如圖10所示。 創(chuàng)建數(shù)據(jù)窗口d_class_xiugai,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“Quick Select”,其布局如圖11所示。 、設(shè)計訪問班級信息的窗口 首先設(shè)計兩個通用的輸入窗口和修改窗口作為父對象,實現(xiàn)一般輸入和修改的功能,窗口中的數(shù)據(jù)窗口控件不設(shè)定具體的數(shù)據(jù)窗口對象,在繼承的窗口對象中再設(shè)定。通過繼承可以簡化程序設(shè)計,實現(xiàn)代碼重用。 創(chuàng)建窗口對象w_shuru,調(diào)整其大小,放置1個數(shù)據(jù)窗口控件(dw_1)、8個命令按鈕控件(cb_1~cb_8),窗口布局如圖12所示。窗口及其控件的屬性設(shè)置見表5。 表5 設(shè)置完屬性后開始編寫腳本代碼,其中窗口w_shuru的Open事件和Closequery事件、命令按鈕(【添加】、【刪除】、【保存】和【退出】)的Clicked事件同窗口w_yhgl的相應(yīng)事件腳本,在此不再重復(fù)。其他命令按鈕的事件腳本如下。 通過繼承輸入窗口w_shuru生成輸入班級信息窗口w_class_shuru,將數(shù)據(jù)控件dw_1的DataObject屬性設(shè)置為d_class_shuru,將窗口的Title屬性改為“錄入班級信息”,此窗口設(shè)計便完成了。 ) 設(shè)計修改班級信息窗口 通過繼承修改窗口w_xiugai生成修改班級信息窗口w_class_xiugai,將數(shù)據(jù)控件dw_1的DataObject屬性設(shè)置為d_class_xiugai,將窗口的Title屬性改為“修改班級信息”,此窗口設(shè)計便完成了。 ) 設(shè)計瀏覽班級信息窗口 創(chuàng)建窗口對象w_class_liulan,調(diào)整其大小,放置1個數(shù)據(jù)窗口控件dw_1,調(diào)整窗口布局如圖14所示。設(shè)置窗口的屬性為Response!,“text”屬性為“瀏覽班級信息” 七、設(shè)計學(xué)生基本信息管理模塊 本模塊實現(xiàn)學(xué)生基本信息的輸入、修改和查詢。 、設(shè)計訪問學(xué)生基本信息的數(shù)據(jù)窗口 ) 設(shè)計輸入學(xué)生基本信息的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_student_shuru,顯示風(fēng)格為“Freeform”,數(shù)據(jù)源類型為“Quick Select”,其布局如圖15所示。 其中,列控件“xb”的編輯風(fēng)格改為“RadioButtons”,碼表如圖15中所示;列控件“bjbh”的編輯風(fēng)格改為“DropDownDW”,其DataWindow屬性設(shè)置為“d_banji_xiugai”,Display Column屬性和Data Column屬性都設(shè)置為“bjbh”,Width of DropDown(%)屬性設(shè)置為“300”,Lines in DropDown屬性設(shè)置為“6”,VScrollBar屬性設(shè)置為“True”。數(shù)據(jù)窗口d_jiben_shuru生成的SQL Select語句為: 圖15 數(shù)據(jù)窗口d_student_shuru ) 設(shè)計修改學(xué)生基本信息的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_student_xiugai,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“Quick Select”,其布局如圖16所示。 其中,列控件“xb”的編輯風(fēng)格改為“DropDownListBox”,列表項為“男”,“女”; 列控件“bjbh”的編輯風(fēng)格改為“DropDownDW”,其DataWindow屬性設(shè)置為“d_banji_xiugai”,Display Column屬性和Data Column屬性都設(shè)置為“bjbh”,Width o (%)屬性設(shè)置為“300”,Lines in DropDown屬性設(shè)置為“6”,VScrollBar屬性 設(shè)置為“True”。 數(shù)據(jù)窗口d_student_xiugai生成的SQL Select語句為: 圖16 數(shù)據(jù)窗口d_student_xiugai ) 設(shè)計查詢學(xué)生基本信息的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_student_chaxun,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“SQL Select”,其布局如圖17所示。 其中,定義3個String型檢索參數(shù)變量mxh、mxm、mbjmc,分別表示學(xué)號、姓名、班級,形成帶檢索參數(shù)的數(shù)據(jù)窗口。 該數(shù)據(jù)窗口的修改屬性為默認(rèn)值即“不允許修改”。 數(shù)據(jù)窗口d_student_chaxun生成的SQL Select語句為: 、設(shè)計訪問學(xué)生基本信息的窗口 ) 設(shè)計輸入學(xué)生基本信息的窗口 通過繼承輸入窗口w_shuru生成輸入學(xué)生基本信息窗口w_student_shuru,如圖18所示,將數(shù)據(jù)控件dw_1的DataObject屬性設(shè)置為d_student_shuru,將窗口的Title屬性改為“錄入學(xué)生基本信息”,此窗口設(shè)計便完成了。 ) 設(shè)計修改學(xué)生基本信息的窗口 通過繼承修改窗口w_xiugai生成修改學(xué)生基本信息窗口w_student_xiugai,如圖19所示,將數(shù)據(jù)控件dw_1的DataObject屬性設(shè)置為d_student_xiugai,將窗口的Title屬性改為“修改學(xué)生基本信息”,此窗口設(shè)計便完成了。 ) 設(shè)計查詢學(xué)生基本信息的窗口 要求此窗口中能夠根據(jù)學(xué)生的姓名或?qū)W號查詢出學(xué)生的基本信息,能夠根據(jù)班級名稱查詢出該班所有學(xué)生的基本信息。 查詢學(xué)生基本信息窗口如圖20所示。 首先創(chuàng)建一個窗口對象w_student_chaxun,調(diào)整其大小,在窗口中放置2個靜態(tài)文本控件(st_1,st_2)、1個下拉圖片列表框控件(ddplb_1)、1個單行編輯器控件(sle_1)、1個命令按鈕(cb_1)、1個數(shù)據(jù)窗口控件(dw_1),調(diào)整各個控件的位置和大小。設(shè)置窗口及其控件的屬性見表7。 代碼中根據(jù)查詢依據(jù)的不同,以不同參數(shù)方式檢索數(shù)據(jù)。 八、設(shè)計課程管理模塊 本模塊實現(xiàn)各班開設(shè)課程的輸入、修改和查詢。 、 設(shè)計訪問課程信息的數(shù)據(jù)窗口 )、設(shè)計輸入班級課程信息的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_subject_shuru,顯示風(fēng)格為 “Grid”,數(shù)據(jù)源類型為“Quick Select”, 其布局如圖21所示。 圖21 數(shù)據(jù)窗口d_subject_shuru 其中,列控件“bjbh”的編輯風(fēng)格改為“DropDownDW”,其DataWindow屬性設(shè)置 ) 、設(shè)計查詢班級課程信息的數(shù)據(jù)窗口創(chuàng)建數(shù)據(jù)窗口d_subject_chaxun,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“SQL Select”,其布局如圖22所示。其中,定義2個String型檢索參數(shù)變量mxq、mbjmc,分別表示學(xué)期、班級,形成帶檢索參數(shù)的數(shù)據(jù)窗口。該數(shù)據(jù)窗口的修改屬性為默認(rèn)值即“不允許修改”。 、 設(shè)計訪問課程信息的窗口 )、設(shè)計輸入修改班級課程信息的窗口 班級課程的輸入和修改都通過此窗口完成,輸入修改班級課程信息的窗口的布局如圖所示。首先,從祖先窗口w_xiugai繼承生成窗口對象w_subject_shuruxiugai,調(diào)整其大小。然后將數(shù)據(jù)窗口控件 _1的DataObject屬性設(shè)置為 d_subject_shuru,此窗口設(shè)計即完成。 )、設(shè)計查詢班級開設(shè)課程的窗口 要求此窗口能夠根據(jù)輸入的學(xué)期和班級查詢出該班此學(xué)期開設(shè)的課程。查詢班級開設(shè)課程的窗口如圖24所示。 首先創(chuàng)建一個窗口對象w_subject_chaxun, 調(diào)整其大小,在窗口中放置2個靜態(tài)文本控件(st_1,st_2)、2個下拉圖片列表框控件(ddplb_1,ddplb_2)、1個命令按鈕(cb_1)、1個數(shù)據(jù)窗口控件(dw_1),調(diào)整各個控件的位置和大小。 設(shè)置窗口及其控件的屬性見表8,表中未列出的采用默認(rèn)值。 (1)窗口w_subject_chaxun的Open事件腳本如下。 dw_1.settransobject(sqlca)//連接事務(wù)對象sqlca //定義局部變量 li_xq,li_bjmc,n ls_xq,ls_bjmc //動態(tài)生成學(xué)期下拉列表框的列表項 count(distinct xq)into :li_xq subject; xqcursor cursor for xq from subject group by xq; xqcursor; n=1 to li_xq next xqcursor into :ls_xq; _1.additem(ls_xq) xqcursor; //動態(tài)生成班級下拉列表框的列表項 count(distinct bjbh) into :li_bjmc from subject; bjmccursor cursor for class.bjmc subject, class subject.bjbh=class.bjbh group by class.bjmc; open bjmccursor; n=1 to li_bjmc next bjmccursor into :ls_bjmc; _2.additem(ls_bjmc) bjmccursor; (2)【查詢】按鈕的Clicked事件腳本如下 九、設(shè)計成績管理模塊 本模塊實現(xiàn)成績的輸入、修改和多種方式的查詢與打印。 、 設(shè)計訪問成績信息的數(shù)據(jù)窗口 )、設(shè)計輸入成績的數(shù)據(jù)窗口 圖25 數(shù)據(jù)窗口d_xscj_shuru 創(chuàng)建數(shù)據(jù)窗口d_xscj_shuru,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“SQL Select”,其 局如圖25所示。數(shù)據(jù)來源于成績表xscj和視圖v-1,其中,學(xué)號、學(xué)期、課程名稱 成績?yōu)槌煽儽韝scj的列,姓名是視圖v_1的列。 選擇【Rows】|【Update Properties】命令,打開數(shù)據(jù)窗口的修改屬性對話框,如圖26 所示,設(shè)置數(shù)據(jù)窗口的修改屬性,即只有成績表xscj的成績列(xscj_cj)可以在數(shù)據(jù)窗口中修改,關(guān)鍵字為成績表xscj的主關(guān)鍵字(xh,xq,kcmc)。然后,單擊工具條上的【Tab Orde 圖標(biāo),將列控件xscj_cj的Tab Order值設(shè)為10,再單擊【Tab Order】圖標(biāo)回到原設(shè)計狀態(tài)。 圖26 數(shù)據(jù)窗口d_xscj_shuru的設(shè)置 數(shù)據(jù)窗口的檢索參數(shù)為mxq、mbjmc、mkcmc,分別對應(yīng)于學(xué)期、班級名稱和課程 名稱。數(shù)據(jù)窗口d_xscj_shuru生成的SQL Select語句為: )、設(shè)計查詢學(xué)生個人某學(xué)期各科成績的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_xscj_grcx,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型為“SQL Select”,其 布局如圖27所示。在【Summary】條中添加一個計算域控件,計算數(shù)據(jù)窗口中成績 總和。數(shù)據(jù)窗口的檢索參數(shù)為mxh、mxq,分別對應(yīng)于學(xué)號和學(xué)期。 )、設(shè)計查詢某班級某學(xué)期全體學(xué)生各科成績的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_xscj_bjcx,顯示風(fēng)格為“Cross Tab”,數(shù)據(jù)源類型為“SQL Select”, 其布局如圖28所示。數(shù)據(jù)來源于成績表xscj和視圖 v_1,其中,學(xué)號、課程名稱和成績?yōu)槌煽儽韝scj的列,姓名是視圖xsbj的列。在【Header[1]】條中添加2個計算域控件,對應(yīng)的表達式分別為mbjmc和mxq,3個文本控件,其文本分別為“成績單”、“班級:”和“學(xué)期:”。數(shù)據(jù)窗口的檢索參數(shù)為mxq和mbjmc,分別對應(yīng)于學(xué)期和班級名稱。修改屬性取默認(rèn)值(不允許修改)。 )、設(shè)計查詢某班級某學(xué)期全體學(xué)生某科成績的數(shù)據(jù)窗口 創(chuàng)建數(shù)據(jù)窗口d_xscj_kccx,顯示風(fēng)格為“Grid”,數(shù)據(jù)源類型“SQL Select”,其布局如 圖29所示。數(shù)據(jù)來源于成績表xscj和視圖v_1,其中,學(xué)號和成績?yōu)槌煽儽韝scj的列,姓名是視圖xsbj的列。在【Header】條中添加2個計算域控件對應(yīng)的表達式分別為mbjmc和mkcmc,3個文本控件,其文本分別為“成績單”、“班級:”和“課程:”。數(shù)據(jù)窗口的檢索參數(shù)為mxq、mbjmc和mkcmc,分別對應(yīng)于學(xué)期、班級名稱和課程名稱。修改屬性取默認(rèn)值(不允許修改)。 、 設(shè)計訪問成績信息的窗口 )、設(shè)計輸入成績的窗口 輸入成績的窗口如圖30所示。首先創(chuàng)建窗口對象w_xscj_shuru,在窗口上放置1 個分組框控件、3個靜態(tài)文本控件、3個下拉列表框控件、3個命令按鈕控件和1個數(shù)據(jù)窗口控件。根據(jù)圖30的布局調(diào)整窗口和控件的大小、位置及有關(guān)屬性。其中,【保存】按鈕 的enabled屬性設(shè)為False;數(shù)據(jù)窗口控件調(diào)整到只顯示學(xué)號、姓名和成績3列,VScrollBar 屬性設(shè)為True,數(shù)據(jù)窗口對象為d_xscj_shuru;3個下拉列表框控件的列表項為空,由代碼動態(tài)生成。 各個窗口和控件的事件腳本如下。 (1)窗口的Open事件腳本如下: _1.settransobject(sqlca) //定義局部變量 li_xq,li_bjmc,li_kcmc,n ls_xq,ls_bjmc,ls_kcmc //生成學(xué)期下拉列表框的列表項 count(distinct xq)into :li_xq subject; xqcursor cursor for xq from subject group by xq; open xqcursor; n=1 to li_xqparnext xqcursor into :ls_xq; _1.additem(ls_xq) xqcursor; //生成班級下拉列表框的列表項 count(distinct bjbh) into :li_bjmc subject; bjmccursor cursor for class.bjmc subject, class subject.bjbh=class.bjbh group .bjmc; bjmccursor; n=1 to li_bjmc next bjmccursor into :ls_bjmc; _2.additem(ls_bjmc) 窗口的Closequery事件腳本如下。 (3)課程的下拉列表框的Getfocus事件腳本如下。 li_kcmc,n ls_kcmc,ls_xq,ls_bjmc _xq=ddplb_1.text _bjmc=ddplb_2.text not(ls_xq=or ls_bjmc=)then //求選定班級和學(xué)期的課程門數(shù) count(distinct subject.kcmc)into :li_kcmc subject,class (subject.bjbh=class.bjbh)and(class.bjmc=:ls_bjmc)and(subject.xq=:ls_xq); //生成課程的下拉列表框的列表項 kcmccursor cursor for subject.kcmc class,subject (subject.bjbh=class.bjbh)and (class.bjmc=:ls_bjmc)and(subject.xq=:ls_xq) by subject.kcmc; _3.reset() kcmccursor; n=1 to li_kcmc next kcmccursor into :ls_kcmc; _3.additem(ls_kcmc) kcmccursor; if (4)【確定】按鈕的Clicked事件腳本如下。 int li_xh,n ls_kcmc,ls_xq,ls_bjmc,ls_xh _xq=ddlb_1.text _bjmc=ddlb_2.text _kcmc=ddlb_3.text ls_xq=or ls_bjmc=or ls_kcmc=then messagebox(提示,選擇項不能空!) //用SQL語句插入所選班級每個學(xué)生的選定課程和學(xué)期的成績記錄 //成績列為空值,由數(shù)據(jù)窗口輸入 li_xh,n ls_kcmc,ls_xq,ls_bjmc,ls_xh _xq=ddplb_1.text _bjmc=ddplb_2.text _kcmc=ddplb_3.text ls_xq= or ls_bjmc= or ls_kcmc= then (提示,選擇項不能空!) count(distinct xh)into :li_xh v_1 v_1.bjmc=:ls_bjmc; xhcursor cursor for xh v_1 v_1.bjmc=:ls_bjmc; xhcursor; n=1 to li_xh fetch next xhcursor into:ls_xh; into xscj (xh,xq,kcmc,cj) (:ls_xh,:ls_xq,:ls_kcmc,null); xhcursor; _1.retrieve(ls_xq,ls_bjmc,ls_kcmc) if (5)【保存】按鈕的Clicked事件腳本如下。 dw_1.update(true,false)=1 then _1.resetupdate() _2.enabled=false (提示,保存數(shù)據(jù)失敗!) if (6)【退出】按鈕的Clicked事件腳本如下。 (parent) (7)數(shù)據(jù)窗口的Itemchanged事件腳本如下。 _2.enabled=true ) 、設(shè)計查詢學(xué)生個人成績的窗口 查詢學(xué)生個人成績的窗口如圖31所示。數(shù)據(jù)窗口控件連接的數(shù)據(jù)窗口 對象為d_xscj_grcx。 (1)【查詢】按鈕的Clicked事件腳本如下。 string l_xh l_xq _xh=trim(sle_1.text) _xq=trim(sle_2.text) l_xh=or l_xq= then (提示,學(xué)號,學(xué)期不能為空) _1.retrieve(l_xh,l_xq) if (2)【打印】按鈕的Clicked事件腳本如下。 dw_1.print(true) (3)【退出】按鈕的Clicked事件腳本如下。 close(parent) _xscj_grcx 、 設(shè)計查詢班級成績的窗口 查詢班級成績的窗口如圖32所示。數(shù)據(jù)窗口控件的DataObject屬性為d_xscj_bjcx。 此窗口的Open事件腳本與輸入成績窗口的Open事件腳本相同,【打印】按鈕和【退出】按鈕的Clicked事件腳本略。 、 設(shè)計查詢課程成績的窗口 查詢課程成績的窗口如圖33所示。 圖33 窗口w_xscj_kccx 數(shù)據(jù)窗口控件的DataObject屬性為d_xscj_kccx。此窗口的Open事件腳本、“課程”的下拉列表框的Getfocus事件腳本與輸入成績窗口的對應(yīng)事件腳本相同,【打印】按鈕和【退出】按鈕的Clicked事件腳本略。【查詢】按鈕的Clicked事件腳本如下。 _1.settransobject(sqlca) ddplb_1.text=or ddplb_2.text=or ddplb_3.text= then (提示,班級 學(xué)期和課程不能為空) _1.retrieve(ddplb_1.text,ddplb_2.text,ddplb_3.text) _2.enabled=true if 十、系統(tǒng)的編譯和發(fā)布 、創(chuàng)建工程對象 單擊工具條上的【New】圖標(biāo),打開【New】對話框,在對話框中選擇【Project】標(biāo) 簽頁,再選擇【Application Wizard】圖標(biāo),單擊【Ok】按鈕,開始工程的向?qū)?,最后出現(xiàn),如圖34所示的工程對象。 2、編譯生成可執(zhí)行程序 單擊工程畫板工具條上的【Deploy】圖標(biāo),開始編譯過程。編譯通過后,生成可執(zhí)行文件xscj.exe。 、測試分布 對可執(zhí)行程序做系統(tǒng)的測試,最后便可發(fā)布了。 十一、小結(jié) 第一次自己一個人完成了一個簡單的管理系統(tǒng)的開發(fā),其中遇到的困難,通過上網(wǎng)搜索資料,同學(xué)的幫助的很好的解決了,例如在對學(xué)生成績班級成績查詢時,數(shù)據(jù)窗口的顯示風(fēng)格crasstab不知道該怎么實現(xiàn),期間花了很多時間查資料才弄明白應(yīng)該怎么一步一步的實現(xiàn),什么做行,什么做列,統(tǒng)計什么都需要明白。 通過此次對學(xué)生成績管理系統(tǒng)的開發(fā),讓我對PowerBuilder中各個常用的窗口控件的用法、屬性、數(shù)據(jù)庫的操作有了個大致的了解,讓我對使用PowerBuilder進行數(shù)據(jù)庫應(yīng)用程序的開發(fā)過程有了個全面的了解,明白了一個軟件系統(tǒng)開發(fā)所需要的的步驟,系統(tǒng)分析、功能設(shè)計、數(shù)據(jù)庫設(shè)計以及數(shù)據(jù)庫的實現(xiàn)等。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|