《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第6章_第1頁
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第6章_第2頁
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第6章_第3頁
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第6章_第4頁
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第6章_第5頁
已閱讀5頁,還剩117頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章系教學(xué)管理系統(tǒng)之教務(wù)管理子系統(tǒng)

—基本的數(shù)據(jù)庫應(yīng)用

6.1教學(xué)管理系統(tǒng)案例分析

6.2相關(guān)知識(shí)點(diǎn)

6.3實(shí)現(xiàn)方法

6.4案例總結(jié)

6.1教學(xué)管理系統(tǒng)案例分析

6.1.1任務(wù)的提出

自動(dòng)化與信息工程系的教務(wù)干事日常工作繁忙,如果教學(xué)管理仍然采用手工管理方式,其工作效率低?,F(xiàn)希望有一個(gè)應(yīng)用程序,能夠?qū)ψ詣?dòng)化與信息工程系的學(xué)生所學(xué)習(xí)的課程進(jìn)行管理、記錄該系學(xué)生選修課程的信息、對(duì)開設(shè)課程的成績進(jìn)行數(shù)據(jù)維護(hù)并能夠提供給學(xué)生進(jìn)行成績查詢。這些日常教學(xué)工作如果能夠使用計(jì)算機(jī)進(jìn)行管理,將提高工作效率。自動(dòng)化與信息工程系的教學(xué)管理系統(tǒng)主要由兩個(gè)子系統(tǒng)組成:教務(wù)管理子系統(tǒng)和學(xué)生教務(wù)子系統(tǒng)。本章講解教務(wù)管理子系統(tǒng)的實(shí)現(xiàn),學(xué)生教務(wù)子系統(tǒng)的實(shí)現(xiàn)將在第7章講述。

教務(wù)管理子系統(tǒng)的實(shí)現(xiàn)主要是使用數(shù)據(jù)集組件TTable。通過本章子系統(tǒng)的實(shí)現(xiàn),我們將學(xué)習(xí)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行維護(hù)的方式之一,即使用數(shù)據(jù)集組件所提供的諸多方法來操作數(shù)據(jù)集中的數(shù)據(jù)。

6.1.2系統(tǒng)設(shè)計(jì)

1.自動(dòng)化與信息工程系教學(xué)管理系統(tǒng)之系統(tǒng)功能分析

本系統(tǒng)主要有以下功能要求:

●所開設(shè)課程的信息維護(hù),包括增加、刪除和修改課程信息。

●學(xué)生選課信息維護(hù),包括添加、刪除選課信息。

●課程成績維護(hù),包括輸入、修改課程成績。

學(xué)生成績查詢,包括學(xué)生所學(xué)課程成績和該課程的基本統(tǒng)計(jì)信息。

2.系統(tǒng)功能模塊設(shè)計(jì)

自動(dòng)化與信息工程系教學(xué)管理系統(tǒng)由教務(wù)管理子系統(tǒng)和學(xué)生教務(wù)子系統(tǒng)組成。此處給出本章的教務(wù)管理子系統(tǒng)的功能模塊圖,如圖6.1所示。

圖6.1教務(wù)管理子系統(tǒng)功能模塊圖

6.1.3數(shù)據(jù)庫設(shè)計(jì)及實(shí)現(xiàn)

1.?dāng)?shù)據(jù)庫需求分析

教學(xué)管理系統(tǒng)需要以下數(shù)據(jù)項(xiàng):

●課程:課程編號(hào)、課程名稱、講課教師、學(xué)分、學(xué)時(shí)、課程簡(jiǎn)介;

●學(xué)生:學(xué)號(hào)、姓名、性別、班級(jí);

●成績:學(xué)生、課程、成績;

●班級(jí):班級(jí)編號(hào)、班級(jí)名稱、所屬院系;

教師:教師編號(hào)、姓名、性別、所屬研究室。

2.數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計(jì)

圖6.2是本系統(tǒng)的E-R模型圖,圖中省略了各實(shí)體的屬性。

圖6.2教學(xué)管理系統(tǒng)E-R圖

3.數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計(jì)

根據(jù)圖6.2所示的E-R圖,需要5個(gè)基本信息表:教師信息、課程信息、班級(jí)信息、學(xué)生信息和成績信息。由于使用本系統(tǒng)的不僅僅是自動(dòng)化與信息工程系的教務(wù)干事,每個(gè)學(xué)生都可以登錄到學(xué)生教務(wù)子系統(tǒng)進(jìn)行課程選擇或成績查詢,因此需要對(duì)不同的登錄人員進(jìn)行用戶名和密碼認(rèn)證并進(jìn)行權(quán)限檢查以防止出現(xiàn)越權(quán)行為。用戶名、密碼和權(quán)限數(shù)據(jù)保存在1個(gè)數(shù)據(jù)表——用戶信息表中。這6個(gè)數(shù)據(jù)表的結(jié)構(gòu)見表6-1~表6-6。

表6-1USER_INFO(用戶)信息表

表6-3STUDENT(學(xué)生)基本信息表

表6-5COURSE(課程)基本信息表

表6-6SCORE(成績)信息表

4.?dāng)?shù)據(jù)庫結(jié)構(gòu)的實(shí)現(xiàn)

在SQLServer2000的企業(yè)管理器中創(chuàng)建數(shù)據(jù)庫TEACH,在查詢分析器中用CREATETABLE語句創(chuàng)建各數(shù)據(jù)表。

1)創(chuàng)建用戶信息表

CREATETABLEUSER_INFO(

IDCHAR(8)NOTNULLCONSTRAINTUSER_PKPRIMARYKEY,

PASSWDCHAR(10)NOTNULL,

AUTHORITYCHAR(1)NOTNULL

)

2)創(chuàng)建班級(jí)基本信息表

CREATETABLECLASS(

IDCHAR(6)NOTNULLCONSTRAINTCLASS_PKPRIMARYKEY,

NAMEVARCHAR(20)NOTNULL,

DEPARTMENTVARCHAR(20),

)

3)創(chuàng)建學(xué)生基本信息表

CREATETABLESTUDENT(

IDCHAR(8)NOTNULLCONSTRAINTSTU_PKPRIMARYKEY,

NAMEVARCHAR(20)NOTNULL,

SEXCHAR(1),

CLASSCHAR(6)CONSTRAINTCLASS_FKFOREIGNKEYREFERENCESCLASS(ID)

)

4)創(chuàng)建教師基本信息表

CREATETABLETEACHER(

IDCHAR(3)NOTNULLCONSTRAINTTEACHER_PKPRIMARYKEY,

NAMEVARCHAR(20)NOTNULL,

SEXCHAR(1),

OFFICEVARCHAR(20)

)

5)創(chuàng)建課程基本信息表

CREATETABLECOURSE(

IDCHAR(4)NOTNULLCONSTRAINTCOU_PKPRIMARYKEY,

NAMEVARCHAR(30)NOTNULL,

TEACHERCHAR(3)NOTNULLCONSTRAINTT_FKFOREIGNKEYREFERENCESTEACHER(ID),

CREDIT_HOURSMALLINT,

PERIODSMALLINT,

INTROVARCHAR(600)

)

6)創(chuàng)建成績信息表

CREATETABLESCORE(

IDINTIDENTITY(1,1)NOTNULLCONSTRAINTSCORE_PKPRIMARYKEY,

STUDENTCHAR(8)NOTNULLCONSTRAINTS_FKFOREIGNKEYREFERENCES

STUDENT(ID),

COURSECHAR(4)NOTNULLCONSTRAINTC_FKFOREIGNKEYREFERENCES

COURSE(ID),

SCORESMALLINT

)

6.2相

關(guān)

識(shí)

點(diǎn)

6.2.1本章案例使用到的新組件

1.TMaskEdit組件

TMaskEdit組件用于輸入單行文本,主要用于有格式要求的數(shù)據(jù)輸入(如電話號(hào)碼、日期等),它能夠根據(jù)定制的格式來強(qiáng)迫用戶輸入指定格式的數(shù)據(jù)。

該組件位于組件面板的“Additional”標(biāo)簽頁,類名為TMaskEdit。

TMaskEdit組件的主要屬性如下:

EditMask屬性

該屬性用于設(shè)置輸入掩碼字符串,決定了輸入數(shù)據(jù)及數(shù)據(jù)顯示的格式。當(dāng)輸入的數(shù)據(jù)不符合要求時(shí),該對(duì)象將拒絕接受此數(shù)據(jù)。

EditMask屬性是一個(gè)TEditMask對(duì)象,實(shí)際上是一個(gè)字符串。掩碼字符串包含用“;”分隔的三個(gè)部分:

(1)掩碼本身。具體含義如下:

L:只能輸入字母。

l:只能輸入字母,但可以不輸入。

A:允許輸入字母或數(shù)字。

a:允許輸入字母或數(shù)字,但可以不輸入。

0:只能輸入數(shù)字。

9:只能輸入數(shù)字,但可以不輸入。

#:只能輸入數(shù)字或正負(fù)號(hào),但可以不輸入。

>:將該字符后的所有字符轉(zhuǎn)換為大寫字符,直至結(jié)束或遇到“<”。

<:將該字符后的所有字符轉(zhuǎn)換為小寫字符,直至結(jié)束或遇到“>”。

C:可輸入任意一個(gè)字符。

c:可輸入任意一個(gè)字符,但可以不輸入。

::通常用來分隔時(shí)間的時(shí)、分、秒。

/:

通常用來分隔日期的年、月、日,將顯示默認(rèn)的字符,如“-”。

(2)指明掩碼字符是否作為數(shù)據(jù)的一部分。

該部分的值取0或1。值為0,掩碼字符不作為數(shù)據(jù)的一部分;值為1,則掩碼字符作為數(shù)據(jù)的一部分。

(3)指明用什么字符代替未輸入的字符。例如,課程編號(hào)由1個(gè)字母和3個(gè)數(shù)字組成,在輸入課程編號(hào)時(shí),可以使用掩碼字符串“L000;1;_”來進(jìn)行輸入數(shù)據(jù)的限制。

Text屬性

該屬性可以取到該組件對(duì)象輸入的文本內(nèi)容。

TMaskEdit組件其實(shí)就是在文本編輯框的基礎(chǔ)上加上了數(shù)據(jù)格式的限制,TEdit的常用方法及事件TMaskEdit組件也具有。如Clear方法、ClearSelection方法、SelectAll方法、OnChange事件、OnKeyPress事件等,詳見前面關(guān)于文本編輯框TEdit組件的介紹。

2.TDBText組件

TDBText組件類似于TLabel組件,只是TDBText組件用于顯示數(shù)據(jù)庫表中記錄的指定字段的值。因?yàn)門DBText組件顯示的是表中當(dāng)前記錄指定的字段的值,所以它顯示的內(nèi)容也是動(dòng)態(tài)的,在其中顯示的內(nèi)容隨著記錄指針的移動(dòng)而變化。

TDBText組件位于組件面板的DataControls選項(xiàng)卡上,如圖6.3所示。

圖6.3組件面板上的DataControls選項(xiàng)卡

TDBText組件的主要屬性如下:

DataSource屬性

該屬性是所有數(shù)據(jù)控制組件都有的,意義也相同,詳見TDBGrid組件關(guān)于該屬性的介紹。

DataField屬性

大多數(shù)的數(shù)據(jù)控制組件如TDBText、TDBEdit、TDBMemo、TDBLookupComboBox等均具有該屬性,是因?yàn)檫@些組件對(duì)象都是與數(shù)據(jù)庫中表的某一個(gè)字段的值綁定在一起的,所以要指定該組件對(duì)象是與哪個(gè)字段綁定的。而TDBGrid組件沒有該屬性,是因?yàn)門DBGrid組件不是與某單個(gè)字段相關(guān)聯(lián)的。

3.TDBEdit組件

TDBEdit組件是專門用于顯示、編輯數(shù)據(jù)庫表中當(dāng)前記錄的某個(gè)字段值的數(shù)據(jù)控制組件。在應(yīng)用程序中,我們常常用一個(gè)TDBEdit組件來對(duì)應(yīng)表中的一個(gè)字段。同樣,通過設(shè)置其DataSource、DataField屬性可以為TDBEdit組件對(duì)象指定表中相應(yīng)的字段。

如果希望用戶能夠通過TDBEdit組件修改數(shù)據(jù)庫表中的字段值,還要設(shè)置TDBEdit組件的ReadOnly屬性值為False;若ReadOnly屬性值為True,則只能瀏覽不能修改數(shù)據(jù)。

TDBEdit組件位于組件面板的DataControls選項(xiàng)卡上,如圖6.3所示。

4.TDBMemo組件

TDBMemo組件能夠顯示多行文本,也允許用戶在其中輸入和修改多行文本信息,它是Delphi中用來顯示和編輯數(shù)據(jù)庫表中的大二進(jìn)制類型的文本字段的唯一的數(shù)據(jù)控制組件。

TDBMemo組件位于組件面板的DataControls選項(xiàng)卡上,如圖6.3所示。

1)TDBMemo組件的主要屬性

ScrollBar屬性

該屬性指定TDBMemo組件是否顯示滾動(dòng)條。

AutoDisplay屬性

由于TDBMemo組件中包含著大量的文本信息,因此應(yīng)用程序在運(yùn)行過程中要顯示其中的信息便需要花費(fèi)很多的時(shí)間,特別是當(dāng)用戶移動(dòng)記錄指針時(shí),要更新TDBMemo組件中顯示的信息,這樣會(huì)大大減慢程序的運(yùn)行速度。為此Delphi為TDBMemo組件設(shè)定了AutoDisplay屬性,用來控制是否自動(dòng)顯示表中的備注型字段。當(dāng)AutoDisplay設(shè)置為False時(shí),在TDBMemo組件中只顯示其對(duì)應(yīng)表中的字段名而不顯示字段中的文本信息,用戶如果想瀏覽字段中的文本信息,雙擊TDBMemo組件即可;當(dāng)設(shè)置AutoDisplay屬性為True時(shí),會(huì)自動(dòng)顯示其對(duì)應(yīng)數(shù)據(jù)庫表中的字段值。

WordWrap屬性

該屬性指定在TDBMemo組件中輸入文本信息且輸入到右邊界時(shí),是否自動(dòng)換行。

2)TDBMemo組件主要的方法

在應(yīng)用程序運(yùn)行過程中,用戶對(duì)TDBMemo組件中顯示的文本信息是不能夠進(jìn)行剪切、復(fù)制和粘貼操作的,要想實(shí)現(xiàn)這些功能,用戶必須在程序中調(diào)用TDBMemo的CutToClipboard、CopyToClipboard和PasteFromClipboard方法分別來實(shí)現(xiàn)剪切、復(fù)制和粘貼操作。

5.TDBLookupComboBox組件

TDBLookupComboBox組件在數(shù)據(jù)庫應(yīng)用程序中的作用比較大。例如,我們?cè)谛薷恼n程信息時(shí),課程信息中有授課的教師信息,該教師信息在課程信息表中是教師的員工編號(hào),該員工編號(hào)是教師信息表中的主鍵,在課程信息表中是外鍵。在編輯該教師信息時(shí),首先受到外鍵約束,不能隨意修改;其次我們希望以下拉框的形式提供給我們選擇而不是輸入,并且希望下拉框中顯示的數(shù)據(jù)為教師的姓名,這樣更符合用戶的需求。這樣,提供給用戶選擇的是教師姓名(教師姓名在教師信息表中),而實(shí)際修改的卻是課程信息表中的教師編號(hào)。這樣的要求,看似比較復(fù)雜難于實(shí)現(xiàn),但使用TDBLookupComboBox組件卻可以輕松實(shí)現(xiàn)。

TDBLookupComboBox組件位于組件面板的DataControls選項(xiàng)卡上,如圖6.3所示。

TDBLookupComboBox組件的主要屬性如下:

DataSource屬性

該屬性指定修改的數(shù)據(jù)來自哪個(gè)數(shù)據(jù)集。

DataField屬性

該屬性指定修改的數(shù)據(jù)是數(shù)據(jù)集的哪個(gè)字段。

ListSource屬性

該屬性指定在下拉列表中提供選擇的數(shù)據(jù)來自哪個(gè)數(shù)據(jù)集。

ListField屬性

該屬性指定在下拉列表中提供選擇的數(shù)據(jù)來自數(shù)據(jù)集的哪個(gè)字段。

KeyField屬性

該屬性非常重要,在提供選擇的數(shù)據(jù)與真正修改的數(shù)據(jù)之間一定是有聯(lián)系的,由KeyField來說明這種聯(lián)系。該屬性可以在下拉列表中進(jìn)行選擇,提供選擇的是ListSource屬性對(duì)應(yīng)的數(shù)據(jù)集的全部字段,該屬性的值應(yīng)該是與DataSource、DataField指定的字段值相對(duì)應(yīng)的那個(gè)字段名稱。

設(shè)置好上述屬性,就可以在應(yīng)用程序中實(shí)現(xiàn):提供選擇的是一組來自于一個(gè)數(shù)據(jù)表的某一字段的數(shù)據(jù),而實(shí)際修改的是另一個(gè)數(shù)據(jù)表中的某字段值。

6.2.2TTable數(shù)據(jù)集組件對(duì)數(shù)據(jù)的操作

1.TTable組件的記錄導(dǎo)航

TTable組件提供了一系列方法,對(duì)數(shù)據(jù)集中的記錄進(jìn)行導(dǎo)航,也即進(jìn)行當(dāng)前記錄的定位。

First方法

該方法將記錄指針移動(dòng)到數(shù)據(jù)集的第一條記錄。

Last方法

該方法將記錄指針移動(dòng)到數(shù)據(jù)集的最后一條記錄。

Prior方法

該方法將記錄指針移動(dòng)到當(dāng)前記錄的前一條記錄。

Next方法

該方法將記錄指針移動(dòng)到當(dāng)前記錄的后一條記錄。

MoveBy方法

該方法接收一個(gè)Integer參數(shù),將記錄指針移動(dòng)到當(dāng)前記錄的向前或向后指定數(shù)目的記錄。

使用上述方法,結(jié)合BOF、EOF屬性可以遍歷數(shù)據(jù)表中的每一條記錄。常用的方式

如下:

Table1.First;

whilenotTable1.EOFdo

begin

<處理當(dāng)前的記錄>

Table1.Next;

end;

2.TTable組件中的數(shù)據(jù)維護(hù)

數(shù)據(jù)集中的數(shù)據(jù)維護(hù)主要包括數(shù)據(jù)記錄的添加、修改和刪除。Delphi為TTable數(shù)據(jù)集組件提供了相應(yīng)的方法用于其中的數(shù)據(jù)維護(hù)。

Edit方法

如果應(yīng)用程序想對(duì)數(shù)據(jù)集中的數(shù)據(jù)記錄進(jìn)行修改,我們必須將數(shù)據(jù)集設(shè)置成編輯狀態(tài)。Edit使數(shù)據(jù)集處于編輯狀態(tài),以便進(jìn)行修改及刪除等操作。當(dāng)數(shù)據(jù)集處于編輯狀態(tài)時(shí),移動(dòng)記錄指針或調(diào)用Post方法都可以將當(dāng)前記錄的修改寫回到磁盤數(shù)據(jù)庫表中。在程序中,

Edit方法和Post方法常常配合在一起使用,用于修改表中的記錄。

Append、Insert方法

Append和Insert方法都是將數(shù)據(jù)集組件置成插入狀態(tài),以在表中插入新記錄。Append方法是在表的尾部插入一條空白記錄,Insert方法是在當(dāng)前記錄的后面插入一條空白記錄。不過增加記錄到一個(gè)具有索引的表中時(shí),都是按照索引順序?qū)懭肫湮恢?,也就是說對(duì)于索引表Append方法和Insert方法的作用是一樣的。

Insert方法和

Append方法插入的記錄是空白記錄,要真正插入一條新記錄,我們還必須給新的空白記錄的各個(gè)字段賦值,最后調(diào)用Post方法,將插入的記錄寫回?cái)?shù)據(jù)庫表。

Post方法

Post方法將插入或修改的記錄寫回磁盤上的數(shù)據(jù)庫表,即投寄。當(dāng)投寄成功時(shí)數(shù)據(jù)集回到瀏覽狀態(tài),若投寄不成功數(shù)據(jù)集仍然保持原有狀態(tài)。

Post方法既可以顯式地調(diào)用,也可以隱含地調(diào)用。當(dāng)數(shù)據(jù)集處于編輯狀態(tài)或插入狀態(tài),且移動(dòng)記錄指針時(shí),Delphi會(huì)隱含地調(diào)用Post方法,將當(dāng)前記錄的修改寫回?cái)?shù)據(jù)庫表;當(dāng)程序調(diào)用Append方法或Insert方法時(shí),也會(huì)隱含地調(diào)用Post方法,將先前數(shù)據(jù)集的修改寫回?cái)?shù)據(jù)庫表。

Cancel方法

Cancel方法用于取消當(dāng)前的操作。當(dāng)程序還未調(diào)用Post方法對(duì)記錄的修改寫回?cái)?shù)據(jù)庫表時(shí),調(diào)用Cancel方法,可以將記錄恢復(fù)到?jīng)]有修改之前的狀態(tài)。在調(diào)用Cancel方法時(shí),它總是將數(shù)據(jù)集置成瀏覽狀態(tài)。

Delete方法

Delete方法用于刪除表中的記錄。調(diào)用Delete方法時(shí),將刪除表中當(dāng)前記錄,并且自動(dòng)地將記錄指針移到被刪記錄的下一條記錄,同時(shí)將數(shù)據(jù)集置成瀏覽狀態(tài)。

AppendRecord方法

語法:ProcedureAppendRecord(constValues:arrayofconst);

InsertRecord方法

語法:ProcedureInsertRecord(constValues:arrayofconst);

AppendRecord和InsertRecord方法分別與Append和Insert方法相似。它們都是用于在表中插入一條新記錄,但這兩個(gè)方法比Append和Insert方法更簡(jiǎn)單、更方便一些,它們直接在表中插入一條新記錄,新記錄的各個(gè)字段值組成的數(shù)組作為AppendRecord或InsertRecord方法的參數(shù)傳遞給新記錄,并且不需顯式地調(diào)用Post方法即可將插入的新記錄寫回?cái)?shù)據(jù)庫表。

在給插入的新記錄賦字段值時(shí),字段值數(shù)組可以為每一個(gè)字段提供一個(gè)值,或從左邊一列開始依次為字段賦值。用戶也可以省略字段序列后面的一些字段值,將會(huì)用空值來填充這些字段;用戶也可以對(duì)那些明確希望用空值填充的字段傳遞給保留字NIL。

例如,數(shù)據(jù)表t1,有編號(hào)、姓名、成績?nèi)齻€(gè)字段,可使用AppendRecord方法插入一條記錄:

AppendRecord(['003','張三',90]);

SetFields方法

語法:ProcedureSetFields(constValues:arrayofconst);

調(diào)用該方法可以修改表中當(dāng)前記錄的多個(gè)字段的值。調(diào)用該方法之前必須將數(shù)據(jù)集部件置成編輯狀態(tài),調(diào)用該方法之后,還要調(diào)用Post方法,才能真正將當(dāng)前記錄的修改寫回?cái)?shù)據(jù)庫表。調(diào)用該方法時(shí),被修改的字段值必須要與表中實(shí)際存在的字段名對(duì)應(yīng),并且數(shù)據(jù)類型要相匹配。

Lookup方法

使用Lookup方法可用來查詢數(shù)據(jù),對(duì)數(shù)據(jù)表本身沒有任何影響。

Lookup方法用于從參數(shù)KeyFields、KeyValues所標(biāo)識(shí)的行中返回指定字段的值,其返回值是一個(gè)可變類型數(shù)組,存儲(chǔ)返回的數(shù)據(jù)。其語法如下:

FunctionLookup(constKeyFields:String;constKeyValues:Variant;constResultFields:String):Variant;其中:

KeyFields標(biāo)識(shí)查找的字段,若是多個(gè)字段,字段間用分號(hào)分隔;

KeyValues標(biāo)識(shí)與KeyFields標(biāo)識(shí)中的字段應(yīng)相匹配;

ResultFields標(biāo)識(shí)返回字段,如果是多個(gè)字段,字段間用分號(hào)分隔。

例如,下列代碼將t_score數(shù)據(jù)集中查找student字段值為“20060058”且course字段值為“C001”的記錄,返回該記錄的score字段值并輸出:

procedureTForm1.Button1Click(Sender:TObject);

var

r:variant;

s:string;

begin

t_score.Open;

r:=t_score.Lookup('student;course',vararrayof(['20060058','C001']),'score');

s:=r;

showmessage(s);

end;

Locate方法

Locate方法能夠按照特定的條件進(jìn)行記錄定位。雖然同樣可以用來查詢數(shù)據(jù),但與Lookup方法不同的是,查找到符合條件的記錄指針將指向該記錄,該記錄成為當(dāng)前記錄,并返回True;若未定位成功,當(dāng)前記錄不變,并返回False。其語法如下:

FunctionLocate(constKeyFields:String;constKeyValues:Variant;Options:TLocateOptions)

:Boolean;

其中:

KeyFields、KeyValues同Lookup方法;

Options指定Locate方法的查找選項(xiàng),參數(shù)值為loCaseInsensitive(忽略大小寫)和loPartialKey(模糊查詢)的集合。

例如,下列代碼同樣在t_score數(shù)據(jù)集中查找student字段值為“20060058”且course字段值為“C001”的記錄,并輸出該記錄的score字段值:

procedureTForm1.Button1Click(Sender:TObject);

var

r:variant;

s:string;

begin

t_score.Open;

ift_score.Locate('student;course',vararrayof(['20060058','C001']),[])then

begin

s:=t_score['score'];

showmessage(s);

end;

end;

3.TTable組件中的字段值的引用

除了使用方法對(duì)數(shù)據(jù)進(jìn)行操作,有時(shí)需要直接引用數(shù)據(jù)集中當(dāng)前記錄的字段值,以取其值或?qū)ζ滟x值。引用TTable組件對(duì)象當(dāng)前記錄的字段值的方式如下:

1)通過“數(shù)據(jù)集對(duì)象名['字段名']”形式直接引用字段值

這種對(duì)字段值的引用形式最常用也最簡(jiǎn)單。例如,數(shù)據(jù)集Table1對(duì)應(yīng)著數(shù)據(jù)表COURSE,下列語句將COURSE表當(dāng)前記錄的ID字段的值賦值給Edit1的Text屬性,以顯示當(dāng)前記錄的ID字段值:

Edit1.Text:=Table1['ID'];下列語句將Edit1的文本內(nèi)容賦值給COURSE表當(dāng)前記錄的ID字段,以修改當(dāng)前記錄的ID字段值:

Table1['ID']:=Edit1.Text;

2)通過字段組件對(duì)字段的值進(jìn)行引用

數(shù)據(jù)庫表的每一列在應(yīng)用程序中都有其對(duì)應(yīng)的一個(gè)字段組件。在應(yīng)用程序運(yùn)行過程中,隨著數(shù)據(jù)集組件被激活,對(duì)應(yīng)于數(shù)據(jù)庫表中每一列的字段組件便動(dòng)態(tài)地被創(chuàng)建。字段組件又稱字段對(duì)象,它對(duì)應(yīng)著數(shù)據(jù)庫表中的列即字段,字段對(duì)象是不可見的組件。在設(shè)計(jì)過程中,程序設(shè)計(jì)人員利用字段編輯器(FieldsEditor)還可以創(chuàng)建永久性的字段組件。

字段組件在應(yīng)用程序中始終是不可見的組件,在程序運(yùn)行過程中如此,在程序設(shè)計(jì)階段也是如此。但字段組件在應(yīng)用中起著非常重要的作用,可以說它是所有數(shù)據(jù)控制組件從數(shù)據(jù)庫表中顯示、編輯數(shù)據(jù)的基礎(chǔ)。這是因?yàn)樽侄谓M件直接對(duì)應(yīng)著數(shù)據(jù)庫表中的字段,瀏覽和修改表中的數(shù)據(jù)必須通過字段組件。

由于動(dòng)態(tài)生成的字段組件是沒有自己的名字的,因此必須利用特殊的手段獲得數(shù)據(jù)庫表中各字段對(duì)應(yīng)的字段組件,然后對(duì)字段進(jìn)行訪問,方式有如下兩種:

(1)使用數(shù)據(jù)集組件的Fields屬性。

數(shù)據(jù)集組件的Fields屬性是與數(shù)據(jù)集組件相關(guān)聯(lián)的數(shù)據(jù)庫表中各個(gè)字段對(duì)應(yīng)的動(dòng)態(tài)字段組件的名字列表。因此我們可以通過Fields屬性的下標(biāo)(即索引號(hào))來訪問各字段組件,從而訪問數(shù)據(jù)庫表中的各個(gè)字段。索引號(hào)從0開始,也就是說數(shù)據(jù)庫表中第一個(gè)字段對(duì)應(yīng)著Fields列表的0索引,第二個(gè)字段對(duì)應(yīng)的Fields的索引號(hào)為1,以此類推。

下面的例子是訪問COURSE表的第一個(gè)字段并在編輯框Edit1中顯示其字段值,設(shè)數(shù)據(jù)集Table1與數(shù)據(jù)庫表COURSE相關(guān)聯(lián):

Edit1.Text:=Table1.Fields[0].AsString;下面的代碼是將編輯框Edit1中的字符值賦值給COURSE表中當(dāng)前記錄的第一個(gè)字段,以實(shí)現(xiàn)修改COURSE表當(dāng)前記錄的字段值:

Table1.Fields[0].AsString:=Edit1.Text;

(2)使用數(shù)據(jù)集組件的FieldByName方法。

在數(shù)據(jù)集組件中有一個(gè)FieldByName方法,專門用于訪問數(shù)據(jù)集組件中動(dòng)態(tài)生成的字段組件。調(diào)用FieldByName方法時(shí),必須把數(shù)據(jù)庫表中的字段名作為參數(shù)傳給FieldByName,調(diào)用該方法后便可以得到該字段所對(duì)應(yīng)的字段組件。這樣通過字段組件我們便可以讀寫數(shù)據(jù)表中相應(yīng)的字段值了。下面是訪問COURSE表中的ID字段的代碼:

Edit1.Text:=Table1.FieldByName('ID').AsString;

Table1.FieldByName('ID').AsString:=Edit1.Text;6.2.3數(shù)據(jù)庫自動(dòng)連接

一般的應(yīng)用程序均有自己實(shí)現(xiàn)的用戶驗(yàn)證功能,進(jìn)行使用該應(yīng)用程序的用戶名、密碼及權(quán)限的驗(yàn)證。在這種情況下肯定不希望出現(xiàn)進(jìn)行數(shù)據(jù)庫連接的對(duì)話框,否則將有使用應(yīng)用程序和登錄數(shù)據(jù)庫服務(wù)器的兩套用戶信息,會(huì)讓用戶感到極不方便。但是登錄大部分的數(shù)據(jù)庫服務(wù)器進(jìn)行數(shù)據(jù)庫連接時(shí),要求提供操作數(shù)據(jù)庫的用戶名及密碼,不出現(xiàn)輸入用戶名及密碼的對(duì)話框,用戶信息怎樣提供呢?這就涉及到怎樣實(shí)現(xiàn)無需輸入連接數(shù)據(jù)庫的用戶信息就能夠進(jìn)行數(shù)據(jù)庫的自動(dòng)連接。

實(shí)現(xiàn)數(shù)據(jù)庫的自動(dòng)連接要使用TDatabase組件,除了設(shè)置其AliasName、DatabaseName之外,還有兩個(gè)重要屬性要進(jìn)行設(shè)置:

LoginPrompt屬性

LoginPrompt屬性應(yīng)該設(shè)置為False,此時(shí)將不顯示數(shù)據(jù)庫連接對(duì)話框。

Params屬性

通過Params屬性設(shè)置連接參數(shù),一般要設(shè)置的參數(shù)有USERNAME和PASSWORD,其他參數(shù)根據(jù)需要決定是否進(jìn)行設(shè)置。Params參數(shù)的設(shè)置可以在Params屬性中直接進(jìn)行,如圖6.4所示;也可以通過雙擊TDatabase組件對(duì)象,在彈出的Database對(duì)話框中進(jìn)行設(shè)置,如圖5.13所示。圖6.4中的參數(shù)之所以很多,是因?yàn)樵贒atabase對(duì)話框中點(diǎn)擊了“Defaults”按鈕,導(dǎo)入了默認(rèn)參數(shù)。

圖6.4TDatabase組件對(duì)象的Params屬性設(shè)置

6.2.4主細(xì)表

有些時(shí)候,我們希望一個(gè)數(shù)據(jù)集中的數(shù)據(jù)是跟隨另外一個(gè)數(shù)據(jù)集的當(dāng)前記錄在發(fā)生變化。例如,我們?cè)诓僮髡n程信息表對(duì)應(yīng)數(shù)據(jù)集時(shí),希望教師信息表對(duì)應(yīng)數(shù)據(jù)集的內(nèi)容跟隨課程信息表對(duì)應(yīng)數(shù)據(jù)集的當(dāng)前記錄而發(fā)生變化,目的是反映出講授某門課程的教師信息。例如,課程信息表當(dāng)前記錄的課程編號(hào)是“C005”,講授教師員工號(hào)是“T06”,希望在教師信息表對(duì)應(yīng)的數(shù)據(jù)集中只有教師員工號(hào)為“T06”的數(shù)據(jù)記錄,這樣我們可以非常方便地獲取到“C005”課程的授課教師的姓名、所屬教研室等信息,因?yàn)榇藭r(shí)在教師信息表對(duì)應(yīng)數(shù)據(jù)集中,只有該教師信息一條記錄。而有時(shí),我們希望是這樣的情況,課程信息表的當(dāng)前記錄是哪門課程,在成績表對(duì)應(yīng)數(shù)據(jù)集中只有選修該門課程的所有學(xué)生的成績信息,這樣我們就可以非常方便地根據(jù)課程來瀏覽成績信息。

這種情況在實(shí)際應(yīng)用中是非常多見的,我們稱之為主細(xì)表結(jié)構(gòu),跟隨主表的當(dāng)前記錄而發(fā)生變化的表稱為明細(xì)表。

實(shí)現(xiàn)主細(xì)表結(jié)構(gòu),需要設(shè)置明細(xì)表數(shù)據(jù)集組件對(duì)象的兩個(gè)屬性:

MasterSource屬性

MasterSource屬性指定主表對(duì)應(yīng)的TDataSource組件對(duì)象名。

MasterFields屬性

MasterFields屬性指定主表和明細(xì)表之間建立聯(lián)系的字段。主表和明細(xì)表之間建立一對(duì)多關(guān)系時(shí),可能不只是基于一個(gè)字段,可能有多個(gè)字段。如果有多個(gè)字段,那么在說明MasterFields屬性時(shí),多個(gè)字段之間要用分號(hào)隔開。

在設(shè)計(jì)階段一般是使用字段連接設(shè)計(jì)器(FieldLinkDesigner)為兩個(gè)數(shù)據(jù)表創(chuàng)建一對(duì)多的關(guān)系,在ObjectInspector中雙擊明細(xì)表TTable組件的MasterFields便可以打開FieldLinkDesigner,進(jìn)行一對(duì)多關(guān)系的創(chuàng)建。如創(chuàng)建COURSE表和TEACHER表之間的主細(xì)表關(guān)系時(shí),使用FieldLinkDesigner設(shè)置明細(xì)表數(shù)據(jù)集對(duì)象的MasterFields,如圖6.5所示。

圖6.5使用FieldLinkDesigner設(shè)置MasterFields屬性

6.3實(shí)

現(xiàn)

6.3.1教務(wù)管理子系統(tǒng)功能模塊的創(chuàng)建

在Delphi7中創(chuàng)建一個(gè)新的工程,工程名為“TEACH.dpr”。

1.登錄窗體

本工程的第一個(gè)窗體是登錄窗體,窗體文件名是“clerk_login.pas”。用于用戶身份驗(yàn)證。整個(gè)應(yīng)用程序的數(shù)據(jù)庫連接也在此窗體中實(shí)現(xiàn)。登錄窗體的布局如圖6.6所示。

圖6.6登錄窗體布局

表6-7登錄窗體中主要組件對(duì)象及屬性表

用戶登錄的功能在“登錄”按鈕button1的OnClick事件中完成,代碼如下:

procedureTf_login.Button1Click(Sender:TObject);

begin

try

mydb.Open;

t_user.Filter:='id='''+edit1.Text+'''';

t_user.Filtered:=true;

t_user.Open;

except

application.MessageBox('請(qǐng)與系統(tǒng)管理員聯(lián)系。','數(shù)據(jù)庫連接錯(cuò)誤',MB_OK);

application.Terminate;

end;

ift_user.RecordCount=1then

begin

ift_user['passwd']=edit2.Textthen

begin

ift_user['authority']='0'then

begin

f_login.Hide;

f_clerk.Show;

end

else

application.MessageBox('您不具備使用本系統(tǒng)的權(quán)限!','用戶權(quán)限錯(cuò)誤',MB_OK);

end

else

application.MessageBox('請(qǐng)確認(rèn)密碼!','密碼錯(cuò)誤',MB_OK);

end

else

application.MessageBox('請(qǐng)確認(rèn)用戶名!','用戶名錯(cuò)誤',MB_OK);

end;

2.主要功能窗體

主要功能窗體名為“clerk_main.pas”。教務(wù)管理子系統(tǒng)有兩部分功能:課程信息維護(hù)和成績數(shù)據(jù)維護(hù)。因此,使用PageControl組件的兩個(gè)TabSheet來實(shí)現(xiàn)這兩部分功能。為了對(duì)照普通組件和數(shù)據(jù)控制組件以凸顯數(shù)據(jù)控制組件的優(yōu)點(diǎn),將添加課程信息和刪除、修改課程信息分別處理,因此在“課程管理”頁中又使用了一個(gè)PageControl組件,其兩個(gè)TabSheet分別對(duì)應(yīng)添加和刪改課程信息。

1)添加課程信息

該界面的功能是添加課程信息,在界面上輸入課程的具體信息,點(diǎn)擊“確認(rèn)”按鈕,將該課程信息添加至COURSE表;點(diǎn)擊“取消”按鈕,則課程信息不添加至數(shù)據(jù)表。

界面布局如圖6.7所示,其主要組件及屬性見表6-8。

表6-8

添加課程界面主要組件對(duì)象及屬性表

圖6.7添加課程

關(guān)閉該窗體,整個(gè)應(yīng)用程序應(yīng)該關(guān)閉。在該窗體的OnClose事件中加入如下代碼:

procedureTf_clerk.FormClose(Sender:TObject;varAction:TCloseAction);

begin

application.Terminate;

end;添加課程信息時(shí)要提供教師編號(hào),由于教師編號(hào)直接輸入不方便,且易違反外鍵約束。故使用Combobox組件進(jìn)行教師信息的選擇,這比輸入的方式要方便許多,而且當(dāng)中的教師信息來自于表TEACHER,所以不會(huì)違反外鍵約束。此處的教師信息是不隨教學(xué)子系統(tǒng)的使用而發(fā)生變化的,所以在Combobox組件對(duì)象中填入教師號(hào)及姓名在窗體創(chuàng)建時(shí)完成即可。窗體的OnCreate事件代碼如下:

procedureTf_clerk.FormCreate(Sender:TObject);

begin

t_teacher.Open;

combobox1.Clear;

whilenott_teacher.Eofdo

begin

combobox1.AddItem(t_teacher['id']+','+t_teacher['name'],nil);

t_teacher.Next;

end;

end;沒有查看課程編號(hào)是否重復(fù)之前,不能進(jìn)行添加操作,讓“確認(rèn)”不可用,代碼在TabSheet4的OnShow事件中:

procedureTf_clerk.TabSheet4Show(Sender:TObject);

begin

button2.Enabled:=false;

end;查看在數(shù)據(jù)表COURSE中是否已經(jīng)有此課程編號(hào)存在,若存在此編號(hào)還要添加該條記錄,將違反主鍵約束。為了避免違反主鍵約束,放置命令按鈕進(jìn)行檢查,若該課程編號(hào)在當(dāng)前數(shù)據(jù)表COURSE中沒有重復(fù),“確認(rèn)”按鈕才可用,否則給出提示信息。

procedureTf_clerk.Button1Click(Sender:TObject);

begin

t_course.Filter:='id='''+trim(MaskEdit1.Text)+'''';

t_course.Filtered:=true;

t_course.Open;

ift_course.RecordCount=1then

begin

showmessage('該課程編號(hào)已存在,請(qǐng)重新輸入!');

button2.Enabled:=false;

end

else

begin

showmessage('該課程編號(hào)可用!');

button2.Enabled:=true;

end;

end;

“取消”按鈕的功能是不將輸入的數(shù)據(jù)添加到數(shù)據(jù)表中,無需做什么操作,只需將前面輸入的內(nèi)容清除:

procedureTf_clerk.Button3Click(Sender:TObject);

begin

button2.Enabled:=false;

maskedit1.Text:='';

edit2.Text:='';

combobox1.Text:='';

spinedit1.Value:=0;

spinedit2.Value:=0;

memo1.Lines.Clear;

end;

“確認(rèn)”按鈕的功能是將當(dāng)前輸入的數(shù)據(jù)添加至數(shù)據(jù)表COURSE中。添加記錄時(shí)數(shù)據(jù)集組件提供了Append與AppendRecord兩種方法,注意兩者的區(qū)別。為了使教師信息更加詳細(xì)一些以便用戶確認(rèn)教師,在下拉框中給出了教師編號(hào)和姓名,在此要將這兩個(gè)信息分離,取出教師編號(hào)添加至TEACHER字段中。記錄添加后,應(yīng)將前面輸入的內(nèi)容清除。代碼如下:

procedureTf_clerk.Button2Click(Sender:TObject);

var

len1,len2,len:integer;

s1,s2,str:string;

begin

s1:=trim(combobox1.Text);

s2:=strpos(pchar(s1),pchar(','));

len1:=length(s1);

len2:=length(s2);

len:=len1-len2;

str:=copy(s1,1,len);//取教師列表中的教師編號(hào)

t_course.Filtered:=false;

t_course.Open;//t_course.AppendRecord([maskedit1.Text,trim(edit2.Text),str,spinedit1.Value,spinedit2.Value,memo1.

Text]);

t_course.Append;

t_course['id']:=maskedit1.Text;

t_course['name']:=trim(edit2.Text);

t_course['teacher']:=str;

t_course['credit_hour']:=spinedit1.Value;

t_course['period']:=spinedit2.Value;

t_course['intro']:=memo1.Text;

t_course.post;

Button3Click(nil);

end;

2)刪除、修改課程信息

本界面的功能是對(duì)課程信息進(jìn)行刪除或修改操作。用一個(gè)RadioGroup組件對(duì)象讓用戶選擇對(duì)課程信息做刪除還是修改操作。刪除、修改是對(duì)現(xiàn)有的課程信息進(jìn)行操作,此處用一個(gè)DBGrid組件對(duì)象以表格形式給出現(xiàn)有的全部課程,以提供給用戶進(jìn)行選擇。當(dāng)選定數(shù)據(jù)表格中的一行時(shí),在界面的右側(cè)給出該課程的具體信息,刪除操作時(shí)提供給用戶進(jìn)行課程確認(rèn),修改操作時(shí)直接在其中修改課程信息。點(diǎn)擊“確認(rèn)”按鈕,確認(rèn)刪除或修改;點(diǎn)擊“取消”按鈕,取消前面的刪除或修改操作。

圖6.8刪除、修改課程

表6-9刪除、修改課程界面主要組件對(duì)象及屬性表

表6-9刪除、修改課程界面主要組件對(duì)象及屬性表

“刪除修改課程信息”頁顯示時(shí),數(shù)據(jù)表格中應(yīng)該出現(xiàn)現(xiàn)有全部課程的課程編號(hào)及課程名稱信息。TabSheet5的OnShow事件代碼如下:

procedureTf_clerk.TabSheet5Show(Sender:TObject);

begin

t_course.Filtered:=false;

t_course.Open;

dbgrid2.Columns[0].Width:=60;

dbgrid2.Columns[1].Width:=149;

dbgrid2.Refresh;

end;點(diǎn)擊“取消”按鈕,取消前面所做的更新。Button5的OnClick事件代碼如下:

procedureTf_clerk.Button5Click(Sender:TObject);

begin

t_course.Cancel;

end;點(diǎn)擊“確認(rèn)”按鈕,判斷是刪除還是修改操作,并執(zhí)行相應(yīng)操作。注意由于課程編號(hào)是SCORE數(shù)據(jù)表中的外鍵,刪除課程信息時(shí)可能會(huì)違反外鍵約束。為了避免違反外鍵約束,刪除課程信息之前應(yīng)該先將SCORE數(shù)據(jù)表中的該課程的選修信息刪除,刪除前要讓用戶確認(rèn)。

procedureTf_clerk.Button4Click(Sender:TObject);

begin

caseradiogroup1.ItemIndexof

0:

ifapplication.MessageBox('確認(rèn)刪除該課程信息嗎?','刪除確認(rèn)',MB_OKCANCEL)=IDOK

then

begin

t_score.Filter:='course='''+t_course['id']+'''';

t_score.Filtered:=true;

t_score.Open;

ift_score.RecordCount>0then

begin

ifapplication.MessageBox('刪除該課程信息將刪除成績表中此課程全部成績信息,確認(rèn)刪除嗎?','刪除確認(rèn)',MB_OKCANCEL)=IDOKthen

begin

whilenott_score.Eofdo

t_score.Delete;

t_course.Delete;

end;

end

else

t_course.Delete;

end;

1:

t_course.Post;

end;

end;

3)成績管理

本界面的功能是按課程對(duì)該課程的成績數(shù)據(jù)進(jìn)行維護(hù)。在下拉框中選擇課程編號(hào),并在下方顯示該課程的具體信息以便教務(wù)干事確認(rèn)課程。確認(rèn)是該課程后,點(diǎn)擊“確認(rèn)”按鈕,將在下方的數(shù)據(jù)表格中顯示課程編號(hào)、選修學(xué)生的學(xué)號(hào)及課程成績,只有成績列是可修改的,輸入成績數(shù)據(jù)即可。

圖6.9成績管理

表6-10成績管理界面主要組件對(duì)象及屬性表

編輯成績信息,是針對(duì)某一門課程進(jìn)行的,首先要確定課程的編號(hào)。課程的編號(hào)直接輸入不夠方便,在此使用ComboBox組件對(duì)象進(jìn)行課程編號(hào)的選擇。在“成績管理”頁顯示時(shí),應(yīng)該在ComboBox2中填入現(xiàn)有的全部課程編號(hào)。TabSheet2的OnShow事件代碼如下:

procedureTf_clerk.TabSheet2Show(Sender:TObject);

begin

dbgrid1.Columns[0].Width:=130;

dbgrid1.Columns[1].Width:=150;

dbgrid1.Columns[2].Width:=110;

dbgrid1.Enabled:=false;

t_course.Close;

t_teacher_1.Close;

t_course.DisableControls;

t_course.Filtered:=false;

t_course.Open;

combobox2.Clear;

whilenott_course.Eofdo

begin

combobox2.AddItem(t_course['id'],nil);

t_course.Next;

end;

end;

在下拉框中選擇某課程編號(hào)后,下方立刻顯示該課程的具體信息,注意顯示的是教師姓名而非教師號(hào),而教師姓名數(shù)據(jù)在COURSE表中是沒有的,存在于TEACHER表中。怎樣使教師表的當(dāng)前記錄動(dòng)態(tài)地根據(jù)課程表的當(dāng)前記錄發(fā)生變化,從而使得教師表的當(dāng)前記錄即為教授課程表當(dāng)前記錄課程的教師信息?這里采用了主細(xì)表的方式,即COURSE表為主表,TEACHER表為明細(xì)表。主細(xì)表是通過明細(xì)表的MasterSource及MasterFields屬性來設(shè)置的。

點(diǎn)擊“確認(rèn)”按鈕,確認(rèn)編輯該課程的成績數(shù)據(jù),數(shù)據(jù)表格dbgrid2中顯示該門課程的全部選修信息,提供給用戶編輯成績。

procedureTf_clerk.Button6Click(Sender:TObject);

begin

t_score.Filter:='course='''+t_course['id']+'''';

t_score.Filtered:=true;

t_score.Open;

dbgrid1.Enabled:=true;

end;圖6.10用戶登錄窗體

6.3.2系統(tǒng)的實(shí)現(xiàn)

通過以上步驟,本案例已完成。程序啟動(dòng)后,首先會(huì)彈出一個(gè)用戶登錄窗體,如圖6.10所示。

輸入用戶名和密碼后,單擊“登錄”按鈕,程序驗(yàn)證用戶名、密碼和權(quán)限,若其中任一處驗(yàn)證失敗,將分別給出提示信息。驗(yàn)證通過,將顯示主要功能窗體,如圖6.11所示。

圖6.11添加課程信息

輸入課程編號(hào),點(diǎn)擊“查看編號(hào)是否沖突”按鈕,若數(shù)據(jù)表中已存在該課程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論