綜合案例四 學(xué)生選課系統(tǒng)
【實(shí)驗(yàn)?zāi)康呐c要求】
1.熟練使用VFP的操作環(huán)境
2.熟練使用項(xiàng)目管理器管理各種文件
3.掌握數(shù)據(jù)庫的設(shè)計方法和步驟
4.熟練掌握數(shù)據(jù)庫表及其表之間關(guān)系的創(chuàng)建與使用
5.掌握查詢與視圖的創(chuàng)建與使用
6.掌握程序設(shè)計的基本方法
7.掌握表單及其表單中各種控件的設(shè)計與使用
8.掌握菜單的創(chuàng)建和使用
【實(shí)驗(yàn)要求】
(1)能輸入、修改、查詢選課有關(guān)的信息,如學(xué)生檔案、課程信息、教師信息、成績信息等;
(2)能進(jìn)行統(tǒng)計,如學(xué)生選修課程的平均成績、某課程的平均成績。
(3)能打印學(xué)生成績單、教師工作量表等。
用戶提出開發(fā)應(yīng)用系統(tǒng)的要求后,軟件開發(fā)者應(yīng)通過調(diào)查研究歸納出目標(biāo)系統(tǒng)的數(shù)據(jù)需求和功能需求。
(一)數(shù)據(jù)需求
通過調(diào)查,總結(jié)出用戶對數(shù)據(jù)的需求如下:
(1)學(xué)生信息
包括:學(xué)生姓名、性別、出生日期、是否團(tuán)員、專業(yè)、入學(xué)時間、入學(xué)成績、簡歷、照片等。
(2)課程信息
包括:課程名稱、課程性質(zhì)、學(xué)時數(shù)、學(xué)分等。
(3)教師信息
包括:教師姓名、性別、職稱、通信地址、電話、電子信箱等。
(4)選課信息
包括:學(xué)生姓名、課程名稱、開課時間、成績等。
(二)功能需求
功能分析的任務(wù)是了解用戶對數(shù)據(jù)的處理方法和輸出格式。
1.基礎(chǔ)數(shù)據(jù)錄入
基礎(chǔ)數(shù)據(jù)包括學(xué)生數(shù)據(jù)、課程數(shù)據(jù)、教師數(shù)據(jù)和學(xué)生選課數(shù)據(jù)以及編碼數(shù)據(jù)等。要求系統(tǒng)能錄入這些數(shù)據(jù),并且能夠進(jìn)行修改。注意在數(shù)據(jù)錄入和修改的過程中應(yīng)保持?jǐn)?shù)據(jù)的參照完整性。
2、查詢
能夠查詢出學(xué)生數(shù)據(jù)、課程數(shù)據(jù)、教師數(shù)據(jù)以及學(xué)生選課數(shù)據(jù)等。
3、統(tǒng)計
要求能根據(jù)學(xué)生選課信息按學(xué)生統(tǒng)計平均成績和按課程統(tǒng)計平均成績。
4、打印輸出
打印學(xué)生成績單和教師工作量表。
【概要設(shè)計】
? 項(xiàng)目設(shè)計
一個典型的數(shù)據(jù)庫應(yīng)用程序有數(shù)據(jù)結(jié)構(gòu)、用戶界面、查詢選項(xiàng)和報表組成。在設(shè)計應(yīng)用程序時,應(yīng)仔細(xì)考慮每個組件將提供的功能以及與其他組件之間的關(guān)系。
一個經(jīng)過良好組織的Visula FoxPro應(yīng)用程序一般需要為用戶提供菜單;一個或多個表單,供數(shù)據(jù)輸入并顯示。同時還需要添加某些事件響應(yīng)代碼,提供特定的功能,保證數(shù)據(jù)的完整性和安全性。此外,還需要提供查詢和報表,允許用戶從數(shù)據(jù)庫中選擇信息。
Visual FoxPro提供的項(xiàng)目管理器作為集成管理各相關(guān)組件的組織工具,并把它們編譯為單個應(yīng)用文件。使用項(xiàng)目管理器創(chuàng)建一個項(xiàng)目后,就可以應(yīng)用程序已具備一個開發(fā)框架了,下一步的工作就是如何在這個框架之下利用項(xiàng)目管理器所提供的強(qiáng)大功能,按照需求來實(shí)現(xiàn)應(yīng)用程序所要求的功能。
1.建立“學(xué)生選課系統(tǒng)“項(xiàng)目
為快速建立一個應(yīng)用程序及其項(xiàng)目,即一個完整“應(yīng)用程序框架”的項(xiàng)目,可以使用“應(yīng)用程序向?qū)А保陧?xiàng)目建立后,便打開了應(yīng)用程序生成器。也可以使用“新建文件”,彈出創(chuàng)建對話框,指定項(xiàng)目及其組件的存儲路徑為“C:¥ 學(xué)生選課系統(tǒng)”,項(xiàng)目名為“學(xué)生選課系統(tǒng)”。
2.設(shè)置主文件
當(dāng)用戶運(yùn)行應(yīng)用程序時,Visual FoxPro將啟動主文件,然后主文件再依次調(diào)用所需要的應(yīng)用程序其他組件。一般最好的方法是為應(yīng)用程序建立一個主程序。但是,使用一個表單作為主程序,可以將主程序的功能和初始界面集成在一起。
本項(xiàng)目設(shè)置主文件為程序文件“主程序”,如圖1所示。
方法:在“主程序”上單擊鼠標(biāo)右鍵,選中“設(shè)置主文件”菜單項(xiàng),或先選中“主程序”,單擊“項(xiàng)目”菜單,選中選中“設(shè)置主文件”菜單項(xiàng)。
例如,主文件代碼編寫如下:
clear all
set talk off
set default to c:¥學(xué)生選課系統(tǒng)¥ && 設(shè)置程序的默認(rèn)路徑
public xh,jsbh,kcbh && xh、jsbh、kcbh分別用于存儲輸入的學(xué)號、
&&教師編號、課程編號
do form 封面 && 調(diào)用封面程序
modify window screen title '學(xué)生選課管理系統(tǒng)' && 設(shè)置主窗口的標(biāo)題
do 主菜單.mpr && 調(diào)用出菜單
read event && 建立時間循環(huán)
quit && 退出VFP
圖1 設(shè)置項(xiàng)目的主文件
? 數(shù)據(jù)庫的設(shè)計
數(shù)據(jù)庫設(shè)計的任務(wù)是確定系統(tǒng)所需的數(shù)據(jù)庫。數(shù)據(jù)庫是表的集合,通常一個系統(tǒng)只需一個數(shù)據(jù)庫。數(shù)據(jù)庫的設(shè)計一般可分為邏輯設(shè)計和物理設(shè)計兩步。邏輯設(shè)計的任務(wù)是根據(jù)需求分析,確定數(shù)據(jù)庫所包含的表及字段、表間的關(guān)系,物理設(shè)計就是具體確定表的結(jié)構(gòu),包括字段名、字段類型及寬度,需要的索引等。
(一)邏輯設(shè)計
根據(jù)對需求得到的數(shù)據(jù)結(jié)構(gòu)進(jìn)行分析,按數(shù)據(jù)輸入輸出的要求,確定表和表間的關(guān)系,并進(jìn)行驗(yàn)證、調(diào)整、修改、完善,使其能夠?qū)崿F(xiàn)用戶對數(shù)據(jù)和功能的要求。本例根據(jù)分析確定系統(tǒng)要設(shè)置如下表:
(1)學(xué)生基本表,包括字段:學(xué)號、姓名、性別、出生日期、是否團(tuán)員、照片、入學(xué)時間、入學(xué)成績、專業(yè)編號、簡歷。學(xué)號為主索引,為專業(yè)編號建立索引,通過該索引和專業(yè)基本表建立關(guān)聯(lián)。
(2)教師基本表,包括字段:教師編號、教師姓名、性別、職稱、電話、通訊地址、郵政編碼、電子信箱。教師編號為主索引。
(3)課程基本表,包括字段:課程編號、課程名稱、課程性質(zhì)、學(xué)時、學(xué)分、備注。課程編號為主索引。
(4)學(xué)生選課表,字段包括:學(xué)號、課程編號、開課時間、成績。學(xué)生、課程編號和開課時間共同做主索引,分別為學(xué)號、課程編號、開課時間、成績建立索引,通過學(xué)號和學(xué)生基本表建立關(guān)聯(lián),通過課程編號和課程基本表建立關(guān)聯(lián),開課時間和成績索引用于做統(tǒng)計計算。
(5)教師任課表,包括字段:教師編號、課程編號。分別為教師編號和課程編號建立索引,通過教師編號和教師基本表建立關(guān)聯(lián),通過課程編號和課程基本表建立關(guān)聯(lián)。
(6)專業(yè)表,字段包括:專業(yè)編號、專業(yè)名稱、所屬系、備注。為專業(yè)編號建立索引,通過專業(yè)編號和學(xué)生基本表建立關(guān)聯(lián)。
(二)物理設(shè)計
下面列出選課系統(tǒng)所有表的結(jié)構(gòu)和索引,為了便于理解,將部分?jǐn)?shù)據(jù)列出。
1.學(xué)生基本表
表名:學(xué)生
結(jié)構(gòu):
字段名 | 類型 | 寬度 | 小數(shù)位數(shù) | 索引 |
學(xué)號 | 字符型 | 12 |
| 主索引 |
姓名 | 字符型 | 8 |
|
|
性別 | 字符型 | 2 |
|
|
出生日期 | 日期型 |
|
|
|
是否團(tuán)員 | 邏輯型 |
|
|
|
照片 | 通用型 |
|
|
|
入學(xué)時間 | 日期型 |
|
|
|
入學(xué)成績 | 數(shù)值型 | 3 | 0 |
|
專業(yè)編號 | 字符型 | 4 |
| 普通索引 |
簡歷 | 記憶型 |
|
|
|
記錄:
學(xué)號 | 姓名 | 專業(yè)編號 | 性別 | 出生日期 | 入學(xué)時間 | 入學(xué)成績 | 團(tuán)員否 |
200010301001 | 謝勝 | 03 | 男 | 1980-10-23 | 2000-9-1 | 589 | TRUE |
200010301020 | 張輝 | 03 | 男 | 1981-5-20 | 2000-9-1 | 608 | TRUE |
200020302045 | 陳誠 | 03 | 男 | 1980-8-4 | 2000-9-1 | 598 | TRUE |
200034201002 | 劉玫 | 42 | 女 | 1980-9-4 | 2000-9-1 | 567 | FALSE |
200034202123 | 李丹 | 42 | 女 | 1981-3-5 | 2000-9-1 | 601 | TRUE |
199920403128 | 胡廣飛 | 04 | 男 | 1980-4-6 | 1999-9-1 | 521 | FALSE |
199924104112 | 廖榮化 | 41 | 男 | 1980-10-31 | 1999-9-1 | 534 | FALSE |
199934205255 | 趙雅娟 | 42 | 女 | 1980-7-8 | 1999-9-1 | 546 | TRUE |
200010401081 | 李文浩 | 04 | 男 | 1981-9-20 | 2000-9-1 | 638 | TRUE |
200010401032 | 陶冶 | 04 | 女 | 1980-7-30 | 2000-9-1 | 599 | TRUE |
199934202152 | 王濤 | 42 | 男 | 1980-1-2 | 1999-9-1 | 576 | TRUE |
199934101067 | 高磊 | 41 | 男 | 1980-5-3 | 1999-9-1 | 543 | FALSE |
2.教師基本表
表名:教師
結(jié)構(gòu):
字段名 | 類型 | 寬度 | 小數(shù)位數(shù) | 索引 |
教師編號 | 字符型 | 4 |
| 主索引 |
教師姓名 | 字符型 | 8 |
|
|
性別 | 字符型 | 2 |
|
|
職稱 | 字符型 | 8 |
|
|
通訊地址 | 字符型 | 40 |
|
|
郵政編碼 | 字符型 | 6 |
|
|
電話 | 字符型 | 20 |
|
|
電子信箱 | 字符型 | 40 |
|
|
記錄:
教師編號 | 教師姓名 | 性別 | 職稱 | 通訊地址 | 郵政編碼 | 電話 | 電子信箱 |
CC01 | 陳利民 | 男 | 教授 | 武漢大學(xué)182棟8號 | 430072 | 027-87675423 | lmchen@263.net |
CC02 | 王惠敏 | 女 | 副教授 | 武漢市武昌區(qū)民主路2345號 | 430043 | 027-87876745 | hmwang@163.net |
CC03 | 劉江 | 男 | 講師 | 武漢大學(xué)11棟12號 | 430072 |
|
|
CS01 | 張健中 | 男 | 副教授 | 武漢市中山大道345號 | 430030 | 027-83457231 | jzzhang@263.net |
CS02 | 吳秀芝 | 女 | 講師 | 武漢大學(xué)14棟8號 | 430072 | 027-87883476 | xzwu@263.net |
3.課程基本表
表名:課程
結(jié)構(gòu):
字段名 | 類型 | 寬度 | 小數(shù)位數(shù) | 索引 |
課程編號 | 字符型 | 4 |
| 主索引 |
課程名稱 | 字符型 | 20 |
|
|
學(xué)時 | 數(shù)值型 | 3 | 0 |
|
學(xué)分 | 數(shù)值型 | 2 | 0 |
|
課程性質(zhì) | 字符型 | 8 |
|
|
備注 | 備注型 |
|
|
|
記錄:
課程編號 | 課程名稱 | 學(xué)時 | 學(xué)分 | 課程性質(zhì) |
CC01 | C語言程序設(shè)計 | 48 | 3 | 選修課 |
CC02 | FoxPro數(shù)據(jù)庫及程序設(shè) | 32 | 2 | 選修課 |
CC03 | 多媒體計算機(jī)技術(shù) | 32 | 2 | 選修課 |
CS01 | 計算機(jī)原理 | 48 | 3 | 必修課 |
CS02 | 編譯原理 | 48 | 3 | 指定選修 |
4.學(xué)生選課表
表名:學(xué)生選課
結(jié)構(gòu):
字段名 | 類型 | 寬度 | 小數(shù)位數(shù) | 索引 |
學(xué)號 | 字符型 | 12 |
| 普通索引 |
課程編號 | 字符型 | 4 |
| 普通索引 |
開課時間 | 日期型 |
|
| 普通索引 |
成績 | 數(shù)值型 | 3 | 0 | 普通索引 |
記錄:
學(xué)號 | 課程編號 | 開課時間 | 成績 |
200010301001 | CC01 | 2001-2-20 | 0 |
200010301001 | CC03 | 2001-2-20 | 0 |
200010301001 | CS01 | 2001-9-1 | 0 |
200010301020 | CC02 | 2001-2-20 | 0 |
200010301020 | CS03 | 2001-2-20 | 0 |
200020302045 | CC02 | 2001-2-20 | 0 |
200034201002 | CC03 | 2001-2-20 | 0 |
200034202123 | CS02 | 2001-9-1 | 0 |
199920403128 | CC01 | 2000-2-23 | 86 |
199924104112 | CS02 | 2000-2-23 | 50 |
199924104112 | CS02 | 2001-2-20 | 0 |
199934202152 | CC02 | 2000-2-23 | 91 |
199934202152 | CC03 | 2000-2-23 | 85 |
199934202152 | CS01 | 2000-9-3 | 78 |
199934202152 | CS02 | 2000-9-3 | 75 |
200010401081 | CC02 | 2001-2-20 | 0 |
|
|
|
|
5.教師任課表
表名:教師任課表
結(jié)構(gòu):
字段名 | 類型 | 寬度 | 小數(shù)位數(shù) | 索引 |
課程編號 | 字符型 | 4 |
| 普通索引 |
教師編號 | 字符型 | 8 |
| 普通索引 |
記錄:
課程編號 | 教師編號 |
CC01 | CC01 |
CC01 | CC02 |
CC02 | CC01 |
CC02 | CC03 |
CC03 | CC02 |
CC03 | CC03 |
CS01 | CS01 |
CS01 | CS02 |
CS02 | CS01 |
6.專業(yè)表
表名:專業(yè)表
結(jié)構(gòu):
字段名 | 類型 | 寬度 | 小數(shù)位數(shù) | 索引 |
專業(yè)編號 | 字符型 | 4 |
| 主索引 |
專業(yè)名稱 | 字符型 | 40 |
|
|
所屬系 | 字符型 | 40 |
|
|
備注 | 備注型 |
|
|
|
記錄:
專業(yè)編號 | 專業(yè)名稱 | 所屬系 |
03 | 水動 | 水利 |
04 | 農(nóng)田 | 水利 |
05 | 水資源 | 水利 |
41 | 自動化 | 電力 |
42 | 熱動 | 電力 |
? 應(yīng)用程序設(shè)計
(一)程序總體結(jié)構(gòu)設(shè)計
在開始程序設(shè)計前,應(yīng)先將程序的總體結(jié)構(gòu)以層次圖的形式表示出來,便于對程序分層編程和實(shí)現(xiàn)。如圖3所示。
圖的第一層為系統(tǒng)層,通常對應(yīng)主程序;第二層為子系統(tǒng)層,一般起劃分系統(tǒng)功能的作用,通常對應(yīng)主菜單;第三層為功能層,對應(yīng)菜單項(xiàng),一般通過表單的調(diào)用實(shí)現(xiàn)某些特定的功能。
(二)界面設(shè)計
1.封面設(shè)計(封面.scx)
選中項(xiàng)目管理器中文檔-表單,按下“新建”按鈕,在隨后打開的對話框中單擊“新建表單”按鈕,彈出表單設(shè)計器和一個表單,其對象名為Form1。在表單中添加一個Lable對象,采用系統(tǒng)默認(rèn)名稱Label1,一個Timer對象,系統(tǒng)默認(rèn)名稱Timer1,如圖4所示。設(shè)置對象屬性如下:
圖4“封面”表單
(1)Form1的屬性設(shè)置及事件代碼
屬性名 | 設(shè)置值 | 說明 |
Left | 0 |
|
Top | 0 |
|
Heigh | 431 |
|
Width | 771 |
|
BorderStyle | 0-無邊框 |
|
Picture | C:¥windows¥circles.bmp | 設(shè)置窗口背景 |
TitleBar | 0-關(guān)閉 | 只顯示背景和標(biāo)簽 |
Window State | 2-最大化 |
|
Activate事件代碼: && 調(diào)整標(biāo)簽在啟動窗口中的位置
thisform.label1.top=thisform.height/3
thisform.label1.left=(thisform.width-thisform.label1.width)/2
thisform.label1.visible=.t.
RightClick事件代碼:
thisform.release &&關(guān)閉啟動窗口
(2)Label1的屬性設(shè)置
屬性名 | 設(shè)置值 | 說明 |
Top | 132 |
|
Left | 60 |
|
Height | 60 |
|
Width | 517 |
|
Caption | 學(xué)生選課管理系統(tǒng) |
|
FontName | 隸書 |
|
FontSize | 48 |
|
ForeColor | 255,128,128 |
|
BackStyle | 2-透明 | 以免遮住窗口背景 |
Visible | F.-假 | 以免在調(diào)整標(biāo)簽位置時閃動 |
(3)Timer1的屬性設(shè)置及事件代碼
屬性名 | 設(shè)置值 | 說明 |
Interval | 5000 | 每5000ms調(diào)用一次Timer事件 |
Timer事件代碼:
thisform.release
2.主菜單設(shè)計(主菜單.mnx)
選中項(xiàng)目設(shè)計器中其他-菜單,單擊“新建”按鈕,在彈出的對話框中選擇“菜單”按鈕,參照總體結(jié)構(gòu)圖,設(shè)計主菜單如下。
基本信息 | 選課信息 | 統(tǒng)計查詢 | 報表打印 | 代碼維護(hù) |
學(xué)生名冊 (學(xué)生基本情況.scx) | 選課登記 (選課登記.scx) | 按課程查詢 (按課程查詢.scx) | 學(xué)生成績單 | 課程代碼 |
教師名冊 (教師.scx) |
| 按學(xué)生查詢
| 教師工作量 |
|
課程信息 (課程信息.scx) |
| 按課程平均 (按課程求平均.scx) | 課程成績單 | |
退出 (命令) | 按學(xué)生平均 |
|
“退出”菜單項(xiàng)命令如下:
clear events && 退出事件循環(huán)
從菜單文件生成菜單程序“主菜單.mpr”
3.“學(xué)生名冊”表單(學(xué)生基本情況.scx)
學(xué)生名冊表單用于輸入、修改、刪除、查詢學(xué)生信息。窗口設(shè)計見圖5。在窗口上單擊鼠標(biāo)右鍵打開彈出菜單,選擇數(shù)據(jù)環(huán)境打開“數(shù)據(jù)環(huán)境設(shè)計器“,在數(shù)據(jù)環(huán)境中添加“學(xué)生”、“專業(yè)表”兩個表,建立關(guān)聯(lián)。如圖6所示。
(1)StudentForm的屬性設(shè)置
屬性名 | 設(shè)置值 | 說明 |
Name | StudentForm |
|
Caption | 學(xué)生基本情況 |
|
AutoCenter | .T.-真 | 窗口自動居中 |
BorderStyle | 2-固定對話框 | 無需用戶調(diào)整窗口大小 |
MaxButton | .F.-假 | 同上 |
圖5 “學(xué)生基本情況“表單
圖6“學(xué)生基本情況”表單的數(shù)據(jù)環(huán)境設(shè)置
(2)標(biāo)簽和文字框的設(shè)置
從數(shù)據(jù)環(huán)境將下列字段拖到表單中規(guī)定的位置,產(chǎn)生相應(yīng)的標(biāo)簽和文本框:學(xué)生表中的學(xué)號、姓名、出生日期、入學(xué)時間、入學(xué)成績、簡歷等字段;專業(yè)表中的專業(yè)編號、專業(yè)名稱、所屬系等字段。從數(shù)據(jù)環(huán)境來產(chǎn)生標(biāo)簽和文本框,不僅速度快,而且標(biāo)簽的Caption和Name屬性、文本框的Name屬性都會自動設(shè)定位與源字段有關(guān)的名字,文本框也會自動與源表中的源字段綁定。
(3)“專業(yè)編號”列表框的設(shè)置及事件代碼
從表單控件工具欄中選擇“組合框”工具,在窗口上相應(yīng)位置單擊,產(chǎn)生一個組合框Combo1,設(shè)置其屬性。
屬性名 | 設(shè)置值 | 說明 |
Name | Combo1 |
|
ControlSource | 學(xué)生.專業(yè)編號 | 數(shù)據(jù)存儲的字段 |
RowSource | 專業(yè)表.專業(yè)編號 | 列表框中數(shù)據(jù)來源字段 |
RowSourceType | 6-字段 | 數(shù)據(jù)來源為字段 |
Style | 2-下拉列表框 |
|
Valid事件代碼:
thisform.refresh
(4)“團(tuán)員”復(fù)選框的設(shè)置
從數(shù)據(jù)環(huán)境中將“學(xué)生.團(tuán)員否“字段拖到窗口上相應(yīng)的位置,會自動產(chǎn)生團(tuán)員復(fù)選框。并且將它與學(xué)生.團(tuán)員否字段綁定。
(5)“性別”選項(xiàng)按鈕組的設(shè)置
從表單控件工具欄中選擇選項(xiàng)按鈕組工具,在窗口相應(yīng)的位置單擊鼠標(biāo)左鍵,創(chuàng)建選項(xiàng)按鈕組控件,在控件上單擊鼠標(biāo)右鍵打開彈出式菜單,選擇生成器材單項(xiàng),打開選項(xiàng)組生成器窗口,如圖7所示,按步驟完成如下操作。
圖7設(shè)置“性別”選項(xiàng)組
第一步,將標(biāo)題改為“男”、“女”;
第二步,將布局改為水平排列;
第三步,將值與學(xué)生.性別字段綁定。單擊“確定”完成設(shè)置。
(6)命令按鈕組設(shè)置與事件代碼
從表單控件工具欄中選擇命令按鈕組工具,在窗口相應(yīng)的位置單擊鼠標(biāo)左鍵創(chuàng)建命令按鈕組控件CommandGroup1,在控件上單擊鼠標(biāo)右鍵彈出菜單,選擇生成器菜單項(xiàng),打開命令組生成器窗口,格式與圖8.14類似。按要求第一步設(shè)置按鈕數(shù)目及每個按鈕的標(biāo)題(見圖8.12);第二步設(shè)置布局為水平排列,單擊“確定”即可生成按鈕組。
CommandGroup1的Click事件代碼:
do case
case this.value=1 && 到首頁
go top
case this.value=2 && 到上頁
if not bof()
skip -1
endif
case this.value=3 && 到下頁
skip
if eof()
skip -1
endif
case this.value=4 && 到末頁
go bottom
case this.value=5 && 按學(xué)號查詢
xh=''
do form 輸入學(xué)號 && 打開學(xué)號輸入窗口(見下文),關(guān)閉時
&& 將輸入的學(xué)號返回
dqjlh=recno()
if len(xh)<>0
locate for 學(xué)號=xh
if not found()
wait window '無此學(xué)號!'
go dqjlh
endif
endif
case this.value=6 && 新增學(xué)生名單
zy=messagebox('需要增加學(xué)生名單嗎?',4+32+256,'確認(rèn)')
if zy=6 && 對話框含“是”“否”按鈕,按下“是”按鈕返回6
append blank
endif
case this.value=7 && 刪除當(dāng)前學(xué)生名單
sy=messagebox('需要刪除當(dāng)前的學(xué)生名單嗎?',4+32+256,'確認(rèn)')
if sy=6
delete
pack
endif
case this.value=8 && 關(guān)閉當(dāng)前窗口
thisform.release
endcase
thisform.refresh
4.“輸入學(xué)號”表單(輸入學(xué)號.scx)
在“學(xué)生名冊”窗口中,當(dāng)單擊尋頁按鈕時,調(diào)用“輸入學(xué)號”表單,通過公共變量xh,將輸入的需要查詢的學(xué)號傳回到“學(xué)生名冊”窗口,并進(jìn)行定位,如果沒有相應(yīng)學(xué)號的數(shù)據(jù),則在等待窗口中顯示“無此學(xué)號”?!拜斎雽W(xué)號”窗口如圖8所示。
圖8 “輸入學(xué)號”表單窗口
(1)Form的屬性設(shè)置
屬性名 | 設(shè)置值 | 說明 |
AutoCenter | .T.-真 |
|
BorderStyle | 2-固定對話框 |
|
Caption | 輸入學(xué)號 |
|
ControlBox | .F.-假 |
|
Name | noForm |
|
WindowStyle | 1-模式 | 在窗口關(guān)閉前不能操作其他窗口 |
(2)命令按鈕組的屬性設(shè)置及事件代碼
利用生成器,創(chuàng)建命令按鈕組CommandGroup1其中包含“確定”、“取消”兩個按鈕。
CommandGroup1的Click事件代碼:
do case
case this.value=1 &&單擊“確定”,將文本框中的值賦予全局變量xh
xh=trim(thisform.text1.value)
thisform.release
case this.value=2 &&單擊“取消”,將全局變量xh賦空字符串
xh=''
thisform.release
endcase
5.“選課登記”表單(選課登記.scx)
“選課登記”表單用于輸入、修改和查詢學(xué)生選課信息,需要使用學(xué)生選課表、學(xué)生表和課程表三個表。在“選課登記”表單的數(shù)據(jù)環(huán)境中加入這三個表,同時以建立學(xué)生選課表為主表建立學(xué)生選課表和學(xué)生表、學(xué)生選課表和課程表之間的關(guān)聯(lián),如圖9所示。
圖9 “選課登記”表單的數(shù)據(jù)環(huán)境
和“學(xué)生名冊”表單類似,從數(shù)據(jù)環(huán)境中將需要的數(shù)據(jù)拖到表單窗口的相應(yīng)位置,創(chuàng)建“選課登記”表單如圖10所示。
圖10 “選課登記”表單
窗口屬性的設(shè)置和“學(xué)生名冊”表單類似,其中命令組可以從“學(xué)生名冊”表單中復(fù)制過來,修改其Click事件中的代碼如下:
do case
case this.value=1
go top
case this.value=2
if not bof()
skip -1
endif
case this.value=3
skip
if eof()
skip -1
endif
case this.value=4
go bottom
case this.value=5
kcbh=''
do form 輸入學(xué)號
dqjlh=recno()
if len(kcbh)<>0
locate for 課程編號=kcbh
if not found()
wait window '無此選課記錄!'
go dqjlh
endif
endif
case this.value=6
zy=messagebox('需要增加選課記錄嗎?',4+32+256,'確認(rèn)')
if zy=6
append blank
endif
case this.value=7
sy=messagebox('需要刪除當(dāng)前的選課記錄嗎?',4+32+256,'確認(rèn)')
if sy=6
delete
pack
endif
case this.value=8
thisform.release
endcase
thisform.refresh
“課程編號”列表框?qū)傩缘脑O(shè)置參照“學(xué)生名冊”表單。
6.“按課程查詢”表單(按課程查詢.scx)
該表單可以按所選定的課程查詢出選修了該課程的所有學(xué)生名單、開課時間以及成績,數(shù)據(jù)涉及到學(xué)生選課和課程,將這兩個表加入到數(shù)據(jù)環(huán)境中,窗口格式的建立如圖11所示。
圖11 “按課程查詢”表單
(3)關(guān)閉命令按鈕的Click時間代碼
thisform.release
7.“按課程統(tǒng)計”表單(按課程統(tǒng)計.scx)
“按課程統(tǒng)計”表單提供用戶按課程統(tǒng)計沒門課程的平均成績,為了使表單界面設(shè)計簡單,可以先建立一視圖,將成績按課程分組求平均值,視圖的建立可利用VFP提供的視圖設(shè)計器,將學(xué)生選課表和課程表加入視圖設(shè)計器中,將學(xué)生選課.課程編號、課程.課程名稱從可選字段列表加入到選定字段列表框中,利用表達(dá)式生成器生成AVG(學(xué)生選課.成績),并將它加入到選定字段列表框中。如圖12所示。
圖12視圖設(shè)計器
設(shè)置連接條件為:學(xué)生選課.課程編號=課程.課程編號
篩選條件為:NOT 學(xué)生選課.成績=0
排序依據(jù)為:學(xué)生選課.課程編號
分組依據(jù)為:學(xué)生選課.課程編號
視圖名為: v學(xué)生選課_課程_統(tǒng)計1
最后將新建的視圖加到表單的數(shù)據(jù)環(huán)境中,表單窗口的設(shè)計如圖13所示。
圖13 “按課程平均”表單
成績列表框仍然利用列表框生成器設(shè)計。