局域網(wǎng)圖書(shū)資料查詢論文
時(shí)間:2022-03-13 04:49:00
導(dǎo)語(yǔ):局域網(wǎng)圖書(shū)資料查詢論文一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要
本文結(jié)合日常圖書(shū)查詢系統(tǒng)的實(shí)際需要,通過(guò)對(duì)C/S模式、PowerBuilder6.5開(kāi)發(fā)工具、數(shù)據(jù)庫(kù)以
及SQL語(yǔ)言的深入學(xué)習(xí)及實(shí)踐,主要完成了局域網(wǎng)圖書(shū)資料查詢系統(tǒng)的需求分析、數(shù)據(jù)庫(kù)設(shè)計(jì)、應(yīng)
用程序設(shè)計(jì)的工作。
首先,在緒論部分介紹了局域網(wǎng)圖書(shū)資料查詢系統(tǒng)的應(yīng)用背景、開(kāi)發(fā)環(huán)境以及選用的開(kāi)發(fā)工具與
數(shù)據(jù)庫(kù)的關(guān)系,闡明了局域網(wǎng)的概念。并對(duì)數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)、DBMS進(jìn)行了介紹。
第二章的開(kāi)始介紹了關(guān)系型數(shù)據(jù)庫(kù)的基本概念,著重說(shuō)明了幾個(gè)關(guān)鍵概念的定義;然后對(duì)SQL語(yǔ)言
作了一個(gè)介紹說(shuō)明;最后通過(guò)兩個(gè)例子介紹了PB6.5用PowerScript語(yǔ)言調(diào)用SQL的方式。
第三章從特點(diǎn)和功能入手,介紹了開(kāi)發(fā)工具PowerBuilder6.5;并且介紹了C/S模式的概念、特點(diǎn)
以及C/S模式與開(kāi)發(fā)工具PowerBuilder6.5的聯(lián)系;在這個(gè)章節(jié)的最后簡(jiǎn)單介紹了PB6.5對(duì)數(shù)據(jù)庫(kù)的
操作。
第四章用軟件工程的方法分析了局域網(wǎng)圖書(shū)資料查詢系統(tǒng),對(duì)整個(gè)系統(tǒng)進(jìn)行了需求分析、功能模
塊劃分,并通過(guò)ER圖對(duì)數(shù)據(jù)庫(kù)進(jìn)行概念設(shè)計(jì)、用MicrosoftAccess對(duì)數(shù)據(jù)庫(kù)進(jìn)行邏輯設(shè)計(jì)。
第五章是對(duì)局域網(wǎng)圖書(shū)資料查詢系統(tǒng)的具體設(shè)計(jì)。描述了整個(gè)系統(tǒng)詳細(xì)的功能模塊劃分,描述了
登錄模塊、模糊(分類)查詢、多條件(組合)查詢、數(shù)據(jù)編輯更新模塊以及數(shù)據(jù)維護(hù)模塊的實(shí)
現(xiàn)過(guò)程,并對(duì)設(shè)計(jì)源代碼進(jìn)行了注釋分析。
設(shè)計(jì)充分利用PowerBuilder6.5的PowerScript語(yǔ)言對(duì)SQL語(yǔ)言的操作特性,靈活運(yùn)用數(shù)據(jù)窗口技術(shù)
、以及PB的控件技術(shù)等,提高了程序設(shè)計(jì)質(zhì)量。
關(guān)鍵詞:C/S結(jié)構(gòu),局域網(wǎng),數(shù)據(jù)庫(kù),SQL語(yǔ)言,PowerBuilder6.5
目錄
摘要…………………………………………………………………………………I
第一章緒論………………………………………………………………………1
§1.1數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)簡(jiǎn)介…………………………………………………1
§1.2局域網(wǎng)圖書(shū)資料查詢系統(tǒng)……………………………………………………3
§1.3本文所作工作……………………………………………………………4
第二章數(shù)據(jù)庫(kù)理論基礎(chǔ)……………………………………………………………6
§2.1關(guān)系型數(shù)據(jù)………………………………………………………………6
§2.2SQL語(yǔ)言介紹………………………………………………………………9
§2.3PB6.5對(duì)數(shù)據(jù)庫(kù)的操作………………………………………………………11
第三章PB6.5及其數(shù)據(jù)庫(kù)編程………………………………………………………13
§3.1開(kāi)發(fā)工具PowerBuilder6.5……………………………………………………13
§3.2PowerBuilder與Client/Server體系結(jié)構(gòu)………………………………………16
§3.3PowerBuilder6.5數(shù)據(jù)庫(kù)編程………………………………………………18
第四章局域網(wǎng)圖書(shū)資料查詢系統(tǒng)設(shè)計(jì)分析…………………………………………21
§4.1應(yīng)用需求分析………………………………………………………………22
§4.2系統(tǒng)功能模塊劃分…………………………………………………………23
§4.3系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)……………………………………………………………24
第五章局域網(wǎng)圖書(shū)資料查詢系統(tǒng)應(yīng)用程序設(shè)計(jì)…………………………………29
§5.1系統(tǒng)模塊組成…………………………………………………………29
§5.2登錄模塊的實(shí)現(xiàn)………………………………………………………30
§5.3查詢模塊的實(shí)現(xiàn)……………………………………………………………33
5.3.1模糊(分類)查詢的實(shí)現(xiàn)………………………………………………39
5.3.2組合(條件)查詢的實(shí)現(xiàn)………………………………………………44
5.3.3更新打印模塊的實(shí)現(xiàn)…………………………………………………51
§5.4數(shù)據(jù)維護(hù)模塊的實(shí)現(xiàn)…………………………………………………………56
第六章結(jié)束語(yǔ)………………………………………………………………………63
致謝…………………………………………………………………………………64
參考書(shū)目………………………………………………………………………………65
第一章緒論
§1.1數(shù)據(jù)庫(kù)技術(shù)
數(shù)據(jù)庫(kù)技術(shù)作為數(shù)據(jù)管理技術(shù),是計(jì)算機(jī)軟件領(lǐng)域的一個(gè)重要分支,產(chǎn)生于60年代末?,F(xiàn)已
形成相當(dāng)規(guī)模的理論體系和實(shí)用技術(shù)。優(yōu)秀的數(shù)據(jù)庫(kù)設(shè)計(jì)是應(yīng)用成功的基石。萬(wàn)萬(wàn)丈高樓平地起
,數(shù)據(jù)庫(kù)設(shè)計(jì)如同高樓的基石,是開(kāi)發(fā)高品質(zhì)應(yīng)用的前提。
1.1.1數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)
數(shù)據(jù)的體系結(jié)構(gòu)分成三級(jí):內(nèi)部級(jí)(Internal),概念級(jí)(Conceptual)和外部級(jí)(External)。這
個(gè)三級(jí)結(jié)構(gòu)有時(shí)也稱為“三級(jí)模式結(jié)構(gòu)”。
l外部級(jí):最接近用戶,是單個(gè)用戶所能看到的數(shù)據(jù)特性。單個(gè)用戶使用的數(shù)據(jù)視圖的描述稱為
“外模式”。
l概念級(jí):涉及到所有用戶的數(shù)據(jù)定義、是全局的數(shù)據(jù)視圖。全局視圖的描述稱為“概念模式”
。
l內(nèi)部級(jí):最接近于物理存儲(chǔ)設(shè)備,涉及到實(shí)際數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)物理存儲(chǔ)數(shù)據(jù)視圖的描述稱為“
內(nèi)模式”。
數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)是數(shù)據(jù)的三個(gè)抽象級(jí)別。它把數(shù)據(jù)的具體組織留給DBMS
去做,用戶只要抽象地處理數(shù)據(jù),而不必關(guān)心數(shù)據(jù)在計(jì)算機(jī)中的表示和存儲(chǔ),這樣就減輕了用戶
使用系統(tǒng)的負(fù)擔(dān)。
1.1.2數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)是指數(shù)據(jù)庫(kù)系統(tǒng)中管理數(shù)據(jù)的軟件系統(tǒng)。DBMS是數(shù)據(jù)庫(kù)系統(tǒng)的核心組成
部分。對(duì)數(shù)據(jù)庫(kù)的一切操作,包括定義、查詢、更新及各種控制,都是通過(guò)DBMS進(jìn)行的。
在不同的計(jì)算機(jī)系統(tǒng)中,由于缺乏統(tǒng)一的標(biāo)準(zhǔn),即使同種數(shù)據(jù)模型的DBMS,它們?cè)谟脩艚涌?、?/p>
統(tǒng)功能方面也常常是不相同的。
用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,是由DBMS把操作從應(yīng)用程序帶到外部級(jí)、概念級(jí)、再導(dǎo)向內(nèi)部級(jí),進(jìn)而
操作存儲(chǔ)器中的數(shù)據(jù)。DBMS的主要目標(biāo),是使數(shù)據(jù)作為一種可管理的資源處理。
DBMS的主要功能為:
l數(shù)據(jù)庫(kù)定義功能:DBMS提供數(shù)據(jù)定義語(yǔ)言(DDL)定義數(shù)據(jù)庫(kù)的三級(jí)結(jié)構(gòu),包括外模式、概念模
式、內(nèi)模式及基相互之間的映象,定義數(shù)據(jù)的完整性、安全控制等約束。因此,在DBMS中應(yīng)包括
DDL的編譯程序。
l數(shù)據(jù)庫(kù)的操縱功能:DBMS提供數(shù)據(jù)操縱語(yǔ)言(DML)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的操作。基本的數(shù)據(jù)操
作分成兩類四種:
²檢索(查詢)
²更新(插入、刪除、修改)
l數(shù)據(jù)庫(kù)的保護(hù)功能:數(shù)據(jù)庫(kù)中的數(shù)據(jù)是信息社會(huì)的戰(zhàn)略資源,對(duì)數(shù)據(jù)的保護(hù)是至關(guān)重要的大事
。DBMS對(duì)數(shù)據(jù)庫(kù)的保護(hù)主要通過(guò)四個(gè)方面實(shí)現(xiàn):
²數(shù)據(jù)庫(kù)的恢復(fù):在數(shù)據(jù)庫(kù)被破壞或數(shù)據(jù)不正確時(shí),系統(tǒng)有能力把數(shù)據(jù)庫(kù)恢復(fù)到正確的狀態(tài)。
²數(shù)據(jù)庫(kù)的并發(fā)控制:DBMS的并發(fā)控制子系統(tǒng)能防止錯(cuò)誤發(fā)生,正確處理好多用戶、多任務(wù)環(huán)境
下的并發(fā)操作。
²數(shù)據(jù)庫(kù)的完整性控制:保證數(shù)據(jù)庫(kù)中數(shù)據(jù)及語(yǔ)義的正確性和有效性,防止任何對(duì)數(shù)據(jù)造成錯(cuò)誤
的操作。
²數(shù)據(jù)庫(kù)的安全性控制:防止未經(jīng)授權(quán)的用戶蓄謀或無(wú)意地存取數(shù)據(jù)庫(kù)中的數(shù)據(jù),以免數(shù)據(jù)的泄
露、更改或破壞。
²數(shù)據(jù)庫(kù)的存儲(chǔ)管理:把各種DML語(yǔ)句轉(zhuǎn)換成低層的文件系統(tǒng)命令,起到數(shù)據(jù)的存儲(chǔ)、檢索和更新
的作用。
²數(shù)據(jù)庫(kù)的維護(hù)功能:它有許多實(shí)用程序提供給數(shù)據(jù)庫(kù)管理員:
Ø數(shù)據(jù)裝載程序
Ø備份程序
Ø文件重組織程序
Ø性能監(jiān)控程序
²數(shù)據(jù)字典:數(shù)據(jù)庫(kù)系統(tǒng)中存放三級(jí)結(jié)構(gòu)定義的數(shù)據(jù)庫(kù)稱為數(shù)據(jù)字典(DD)。對(duì)數(shù)據(jù)庫(kù)的操作都
要通過(guò)訪問(wèn)DD才能實(shí)現(xiàn),通常DD中還存放數(shù)據(jù)庫(kù)運(yùn)行時(shí)的統(tǒng)計(jì)信息。
1.1.3PowerBuilder與數(shù)據(jù)庫(kù)
nPowerBuilder與數(shù)據(jù)庫(kù)是“配合”與“協(xié)調(diào)”的關(guān)系
PowerBuilder是客戶/服務(wù)器體系結(jié)構(gòu)下客戶端的開(kāi)發(fā)工具,用于開(kāi)發(fā)客戶應(yīng)用程序。這個(gè)程序首
先建立一個(gè)與數(shù)據(jù)庫(kù)的通信渠道,然后將用戶的需求以某種方式傳送給數(shù)據(jù)庫(kù)服務(wù)器。在應(yīng)用程
序接收到數(shù)據(jù)庫(kù)服務(wù)器返回的數(shù)據(jù)后,它分析返回的數(shù)據(jù)并呈現(xiàn)給用戶。因此我們說(shuō),客戶應(yīng)用
程序只完成請(qǐng)求和表現(xiàn)數(shù)據(jù)的工作,是用戶操作計(jì)算機(jī)的人機(jī)界面,大多數(shù)數(shù)據(jù)處理是由服務(wù)器
完成的。
數(shù)據(jù)庫(kù)數(shù)據(jù)器是一個(gè)存取數(shù)據(jù)和管理數(shù)據(jù)的軟件,它針對(duì)客戶的請(qǐng)求為客戶提供數(shù)據(jù)服務(wù)。這些
服務(wù)包括數(shù)據(jù)插入、修改和查詢等。客戶對(duì)數(shù)據(jù)庫(kù)服務(wù)器提出請(qǐng)求用的語(yǔ)言是SQL(Strucrured
QueryLanguage)。SQL是大多數(shù)數(shù)據(jù)庫(kù)服務(wù)器使用的查詢語(yǔ)言。
因此我們說(shuō),PowerBuilder與數(shù)據(jù)庫(kù)的關(guān)系是“配合”與“協(xié)調(diào)”的關(guān)系。PowerBuilder完成數(shù)
據(jù)請(qǐng)求、數(shù)據(jù)表現(xiàn)、菜單、界面等表象方面的工作,而數(shù)據(jù)庫(kù)服務(wù)器完成數(shù)據(jù)庫(kù)的存儲(chǔ)管理、并
發(fā)控制、事務(wù)管理、完整性維護(hù)、查詢優(yōu)化等工作。
§1.2局域網(wǎng)圖書(shū)資料查詢系統(tǒng)
1.2.1局域網(wǎng)(LAN)
計(jì)算機(jī)網(wǎng)絡(luò)是指將多臺(tái)具有獨(dú)立功能的計(jì)算機(jī),通過(guò)通信線路和通信設(shè)備連接起來(lái),在網(wǎng)絡(luò)軟件
的支持下實(shí)現(xiàn)數(shù)據(jù)通信和資源共享的計(jì)算機(jī)系統(tǒng)。
計(jì)算機(jī)網(wǎng)絡(luò)的規(guī)模有大有小,大的可以覆蓋全球,小的僅局限于一個(gè)辦公室?,F(xiàn)在一般按照網(wǎng)絡(luò)
覆蓋的地理范圍將計(jì)算機(jī)網(wǎng)絡(luò)分為三類:局域網(wǎng)(LAN)、城域網(wǎng)(MAN)、廣域網(wǎng)(WAN)。
局域網(wǎng)是覆蓋范圍在10公里以內(nèi)的計(jì)算機(jī)網(wǎng)絡(luò)。局域網(wǎng)傳輸速度快,一般局限在一個(gè)單位內(nèi)部,
例如一所學(xué)?;蛞患移髽I(yè)。
1.2.2應(yīng)用程序開(kāi)發(fā)背景
一個(gè)數(shù)十人的科研或開(kāi)發(fā)小組,搜集了上千冊(cè)有用的圖書(shū)資料,其中有一部分分布在個(gè)人手中,
為了方便大家查閱,需要對(duì)每本書(shū)的狀態(tài)進(jìn)行跟蹤,另新進(jìn)和丟失的圖書(shū)資料必須得到及時(shí)的反
映。
1.2.3系統(tǒng)功能
l圖書(shū)分類查詢,多條件查詢,模糊查詢
l用戶必須登錄方能執(zhí)行各種操作,允許用戶在客戶機(jī)或?yàn)g覽器修改,添加
刪除圖書(shū)資料,實(shí)行松散管理,這建立在用戶高度自覺(jué)的基礎(chǔ)之上,當(dāng)然也可由管理員在服務(wù)器
上直接對(duì)數(shù)據(jù)庫(kù)操作。
l能將查詢結(jié)果生成報(bào)表,并打印輸出。
1.2.4系統(tǒng)運(yùn)行環(huán)境
該系統(tǒng)采用Client/Server模式進(jìn)行設(shè)計(jì):局域網(wǎng)中有一臺(tái)服務(wù)器,其上運(yùn)行服務(wù)器程序,操作系
統(tǒng)為windows2000server,客戶機(jī)操作為Windows98,其上運(yùn)行客戶端程序。
1.2.5系統(tǒng)開(kāi)發(fā)工具
該系統(tǒng)采用PowerBuilder6.5進(jìn)行開(kāi)發(fā),數(shù)據(jù)庫(kù)服務(wù)器端為SQLAnywhere5.0Server;客戶端則
為SQLAnywhereclient,整個(gè)系統(tǒng)在SQLAnywhereLocal端調(diào)試完成。
§1.3本文所作工作
首先,在緒論部分介紹了局域網(wǎng)圖書(shū)資料查詢系統(tǒng)的應(yīng)用背景、開(kāi)發(fā)環(huán)境以及選用的開(kāi)發(fā)工具與
數(shù)據(jù)庫(kù)的關(guān)系,闡明了局域網(wǎng)的概念。并對(duì)數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)、DBMS進(jìn)行了介紹。
第二章的開(kāi)始介紹了關(guān)系型數(shù)據(jù)庫(kù)的基本概念,著重說(shuō)明了幾個(gè)關(guān)鍵概念的定義;然后對(duì)SQL語(yǔ)言
作了一個(gè)介紹說(shuō)明;最后通過(guò)兩個(gè)例子介紹了PB6.5用PowerScript語(yǔ)言調(diào)用SQL的方式。
第三章從特點(diǎn)和功能入手,介紹了開(kāi)發(fā)工具PowerBuilder6.5;并且介紹了C/S模式的概念、特點(diǎn)
以及C/S模式與開(kāi)發(fā)工具PowerBuilder6.5的聯(lián)系;在這個(gè)章節(jié)的最后簡(jiǎn)單介紹了PB6.5對(duì)數(shù)據(jù)庫(kù)的
操作。
第四章用軟件工程的方法分析了局域網(wǎng)圖書(shū)資料查詢系統(tǒng),對(duì)整個(gè)系統(tǒng)進(jìn)行了需求分析、功能模
塊劃分,并通過(guò)ER圖對(duì)數(shù)據(jù)庫(kù)進(jìn)行概念設(shè)計(jì)、用MicrosoftAccess對(duì)數(shù)據(jù)庫(kù)進(jìn)行邏輯設(shè)計(jì)。
第五章是對(duì)局域網(wǎng)圖書(shū)資料查詢系統(tǒng)的具體設(shè)計(jì)。描述了整個(gè)系統(tǒng)詳細(xì)的功能模塊劃分,描述了
登錄模塊、模糊(分類)查詢、多條件(組合)查詢、數(shù)據(jù)編輯更新模塊以及數(shù)據(jù)維護(hù)模塊的實(shí)
現(xiàn)過(guò)程,并對(duì)設(shè)計(jì)源代碼進(jìn)行了注釋分析。
最后,在結(jié)束語(yǔ)的總結(jié)部分指出了系統(tǒng)的亮點(diǎn)以及不足之處。簡(jiǎn)單介紹了自己開(kāi)發(fā)過(guò)程中的體會(huì)
與心得:在摸索中實(shí)踐,在實(shí)踐中摸索。
第二章數(shù)據(jù)庫(kù)理論基礎(chǔ)
§2.1關(guān)系型數(shù)據(jù)庫(kù)
2.1.1關(guān)系模型的基本概念
用二維表格結(jié)構(gòu)表示實(shí)體集,外鍵表示實(shí)體間聯(lián)系的數(shù)據(jù)模型稱為關(guān)系模型。
1.二維表格
表2-1是一張職工登記表,這是二維表格
工號(hào)姓名年齡性別工資
0001Zhang26男1000
0002Li25女1500
0003Liu29男1000
0004Wang22女1500
表2-1二維表格實(shí)例
為簡(jiǎn)單起見(jiàn),對(duì)表格數(shù)學(xué)化,用字母表示表格的內(nèi)容。表2-1可用圖2-1表示:
ABCDE
A1A2A3A4B1B2B3B4C1C2C3C4D1D2D3D4E1E2E3E4
2.鍵(KEY)
鍵由一個(gè)或幾個(gè)屬性組成,在實(shí)際使用中,有下列幾種鍵:
1)超鍵(SuperKey):在關(guān)系中能惟一標(biāo)識(shí)元組的屬性集稱為關(guān)系模式的超鍵。
2)候選鍵(CandidateKey):不含有多余屬性的超鍵稱為候選鍵。也就是在候選鍵中,若要再刪
除屬性,就不是鍵了。
3)主鍵:(PrimaryKey):用戶選作元組標(biāo)識(shí)的一個(gè)侯選鍵稱為主鍵。一般,如不加說(shuō)明,則鍵
是指主鍵。
3.關(guān)系的定義和性質(zhì)
我們可以用集合的觀點(diǎn)定義關(guān)系。關(guān)系是一個(gè)元數(shù)為K(K>=1)的元組的集合。
把關(guān)系看成是一個(gè)集合,集合中的元素是元組,每個(gè)元組的屬性個(gè)數(shù)應(yīng)相同。在關(guān)系模型中,對(duì)
關(guān)系作了下列規(guī)范性限制:
1)關(guān)系中每一個(gè)屬性值都是不可分解的。
2)關(guān)系中允許出現(xiàn)相同的元組(沒(méi)有重復(fù)元組)
3)由于關(guān)系是一個(gè)集合,因此不考慮元組間的順序,即沒(méi)有行序。
4)元組中,屬性在理論上也是無(wú)序的,但在使用時(shí)按習(xí)慣考慮列的順序。
2.1.2數(shù)據(jù)庫(kù)的設(shè)計(jì)理論
關(guān)系數(shù)據(jù)庫(kù)的設(shè)計(jì)理論主要包括三個(gè)方面的內(nèi)容:數(shù)據(jù)依賴、范式,模式設(shè)計(jì)方法。其中數(shù)據(jù)依
賴起著核心的作用。
1.函數(shù)依賴(Functionaldependency,FD)的定義
設(shè)R(U)是一個(gè)關(guān)系模式,U是R的屬性集合,X和Y是U的子集。對(duì)于R(U)的任何一個(gè)可能的關(guān)系r,
如果r中不存在兩個(gè)元組,它們?cè)赬上的屬性值相同,而在Y上的屬性值不同,則稱“Y函數(shù)依賴于X
”,記作X→Y。如果X→Y,并且對(duì)于X的任一真子集X’,都有Y不函數(shù)依賴于X’,則稱“Y完
全函數(shù)依賴于X”,記作XfY。若X→Y,但Y不完全函數(shù)依賴于X,則稱“Y部分函數(shù)依賴于X”
,記作XPY。如果X→Y,Y→Z,且Y≮X,X不函數(shù)依賴于Y,則稱“Z傳遞函數(shù)依賴于X”。
2.范式
在對(duì)表的形式進(jìn)行了規(guī)范化定義后,數(shù)據(jù)結(jié)構(gòu)還有五種規(guī)范化定義,定名為規(guī)范化模式,稱為范
式。在這五種范式中,一般只用前三種,對(duì)于常用系統(tǒng)就足夠了。而且這五種范式是“向上兼容
”的,即滿足第五范式的數(shù)據(jù)結(jié)構(gòu)自動(dòng)滿足一、二、三、四范式,滿足第四范式的數(shù)據(jù)結(jié)構(gòu)自動(dòng)
滿足第一、二、三范式,……,依此類推。
第一范式(firstnormalform,簡(jiǎn)稱1stNF)就是指在同一表中沒(méi)有重復(fù)項(xiàng)出現(xiàn),如果有則應(yīng)將重
復(fù)項(xiàng)去掉。這個(gè)去掉重復(fù)項(xiàng)的過(guò)程就稱之為規(guī)范化處理。在本文所討論的開(kāi)發(fā)方法里,1stNF實(shí)
際上是沒(méi)有什么意義的。因?yàn)槲覀儼匆?guī)范化建立的指標(biāo)體系和表的過(guò)程都自動(dòng)保證了所有表都滿
足1stNF。
第二范式(secondnormalform,簡(jiǎn)稱2ndNF)是指每個(gè)表必須有一個(gè)(而且僅一個(gè))數(shù)據(jù)元素為主
關(guān)鍵字(primarykey),其它數(shù)據(jù)元素與主關(guān)鍵字一一對(duì)應(yīng)。例如,在圖l9.7中如果我們將合同號(hào)
定義為主關(guān)鍵字(其它數(shù)據(jù)元素中的記錄數(shù)據(jù)都有可能重名,故不能作為主關(guān)鍵字),故只要知道
了一個(gè)合同記錄的合同號(hào),就可以唯一地在同一行中找到該合同的任何一項(xiàng)具體信息。通常我們
稱這種關(guān)系為函數(shù)依賴(functionaldepEndence)關(guān)系。即表中其它數(shù)據(jù)元素都依賴于主關(guān)鍵字,
或稱該數(shù)據(jù)元素唯一地被主關(guān)鍵字所標(biāo)識(shí)。
第三范式(thirdnormalform,簡(jiǎn)稱3rdNF)就是指表中的所有數(shù)據(jù)元素不但要能夠唯一地被主
關(guān)鍵字所標(biāo)識(shí),而且它們之間還必須相互獨(dú)立,不存在其它的函數(shù)關(guān)系。也就是說(shuō)對(duì)于一個(gè)滿足
了2ndNF的數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),表中有可能存在某些數(shù)據(jù)元素依賴于其它非關(guān)鍵宇數(shù)據(jù)元素的現(xiàn)象,
必須加以消除。
為防止數(shù)據(jù)庫(kù)出現(xiàn)更新異常、插入異常、刪除異常、數(shù)據(jù)冗余太大等現(xiàn)象,關(guān)系型數(shù)據(jù)庫(kù)要盡量
按關(guān)系規(guī)范化要求進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)。下面以教務(wù)管理信息系統(tǒng)為例來(lái)進(jìn)行分析。
3.模式設(shè)計(jì)方法
一個(gè)好的模式設(shè)計(jì)方法應(yīng)符合下列三條原則:
l表達(dá)性:涉及到兩個(gè)數(shù)據(jù)庫(kù)模式的等價(jià)性問(wèn)題,即數(shù)據(jù)等價(jià)和依賴等價(jià),分別用無(wú)損聯(lián)接和保
持函數(shù)依賴來(lái)衡量。
l分離性:是指屬性間的“獨(dú)立關(guān)系”應(yīng)該用不同的關(guān)系模式表達(dá)。獨(dú)立聯(lián)系是我們所考慮的“
基本信息單位”。實(shí)際上分離就是清除存儲(chǔ)異常和數(shù)據(jù)冗余現(xiàn)象。如果能達(dá)到這個(gè)目的,就分離
。分離的基準(zhǔn)就是一系列范式,分離與依賴等價(jià)有時(shí)是不可兼容的。
l最小冗余性:要求在分解后的數(shù)據(jù)庫(kù)能表達(dá)原來(lái)數(shù)據(jù)庫(kù)的所有信息這個(gè)前提下實(shí)現(xiàn)。目的就是
節(jié)省存儲(chǔ)空間,提高對(duì)關(guān)系的操作效率,清除不必要的冗余。但要注意,在實(shí)際使用中,并不一
定要達(dá)到最小宙余。因?yàn)橛袝r(shí)帶點(diǎn)冗余對(duì)于查詢處理是有好處的。
關(guān)系模式的方法基本上可以分為分解與合成兩大類。分解型算法要求輸入一個(gè)
初始模式集和依賴集,而結(jié)果滿足數(shù)據(jù)等價(jià)要求。對(duì)于合成型算法只要求輸入初始依賴集,結(jié)果
滿足依賴等要求。但它們依據(jù)的基本思想是共同的,即獨(dú)立的聯(lián)系獨(dú)立表示。
§2.2SQL語(yǔ)言介紹
SQL(StructuredQueryLanguage)即“結(jié)構(gòu)式查詢語(yǔ)言”。SQL雖然名為查詢語(yǔ)
言,但實(shí)際上具有定義、查詢、更新和控制等多種功能。由于它使用方便、功能豐富、語(yǔ)言簡(jiǎn)單
易學(xué),很快得到應(yīng)用和推廣。從20世紀(jì)70年代末起,在推出的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)產(chǎn)品ORACLE、SQL/
DS、DB2、SYBASE上實(shí)現(xiàn)了SQL語(yǔ)言。很快,SQL語(yǔ)言被整個(gè)計(jì)算機(jī)界認(rèn)可。1987年6月,國(guó)際標(biāo)準(zhǔn)
化組織(ISO)采納為國(guó)際標(biāo)準(zhǔn)。隨后,ISO對(duì)標(biāo)準(zhǔn)進(jìn)行了大量的修改和擴(kuò)充。在1992年推出了新
的標(biāo)準(zhǔn)-SQL2。SQL的標(biāo)準(zhǔn)化工作還在繼續(xù),新的標(biāo)準(zhǔn)已被命名為SQL3,將包括許多新的數(shù)據(jù)庫(kù)概
念,正在不征求意見(jiàn)和進(jìn)行修改
這里將簡(jiǎn)單介紹基于SQL89和SQL2的語(yǔ)言使用概貌:
2.2.1SQL的組成
SQL主要分成四個(gè)部分:
1)數(shù)據(jù)定義:這一部分也稱為“SQLDDL”,用于定義SQL模式、基本表、視圖和索引。
2)數(shù)據(jù)操縱:這一部分也稱為“SQLDML”。它分為數(shù)據(jù)查詢和數(shù)據(jù)更新兩類。其中數(shù)據(jù)更新又
分成插入、刪除、和修改三種操作。
3)數(shù)據(jù)控制:這一部分包括對(duì)基本表和視圖的授權(quán),完整性規(guī)則的描述,事務(wù)控制等內(nèi)容。
4)嵌入式SQL的使用規(guī)定:這一部分內(nèi)容涉及到SQL語(yǔ)句嵌入在宿主語(yǔ)言程序中使用的規(guī)則。
2.2.2SQL的數(shù)據(jù)查詢
nSELECT語(yǔ)句的語(yǔ)法
SELECT目標(biāo)表的列名或列表達(dá)式序列
FROM基本表和(或)視圖序列
[WHERE行條件表達(dá)式]
[GROUPBY列名序列
[HAVING組條件表達(dá)式]]
[ORDERBY列名[ASC|DESC]…]
句法中[]表示該成分可有,也可無(wú)。
整個(gè)語(yǔ)句的執(zhí)行過(guò)程如下:
a)讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。
b)讀取滿足WHERE子句中給出的條件表達(dá)式的元組。
c)按GROUP子句中指定列的值分組,同時(shí)提取滿足HAVING子句中組條件表達(dá)式的那些組。
d)按SELECT子句中給出的列名或列表達(dá)式求值輸出。
e)ORDER子句對(duì)輸出的目標(biāo)表進(jìn)行排序,按附加說(shuō)明ASC升序排列,或按DESC降序排列。
SELECT語(yǔ)句中,WHERE子句稱為“行條件子句”,GROUP子句稱為“分組
子句”,HAVING子句稱為“組條件子句”,ORDER子句稱為“排序子句”。
2.2.3SQL的數(shù)據(jù)更新
SQL的數(shù)據(jù)更新包括數(shù)據(jù)插入、刪除和修改等三種操作
1)數(shù)據(jù)插入
a)元組值的插入
INSERTINTO基本表名(列名表)
VALUES(元組值)
或者INSERTINTO基本表名(列名表)
(TABLE(元組值),
(元組值),
……)
前一種格式只能插入一個(gè)元組,后一種格式可以插入多個(gè)元組。
2)數(shù)據(jù)刪除
SQL的刪除操作是指從基本表刪除元組,其語(yǔ)法如下:
DELETEFROM基本表名
[WHERE條件表達(dá)式]
其語(yǔ)義是從基本表中刪除滿足條件表達(dá)式的元組。
3)數(shù)據(jù)修改
當(dāng)需要修改基本表中元組的某些列值時(shí),可以用UPDATE語(yǔ)句實(shí)現(xiàn),其句法如下:
UPDATE基本表名
SET列名=值表達(dá)式[,列名=值表達(dá)式…]
[WHERE條件表達(dá)式]
其語(yǔ)義是:修改基本表中滿足條件表達(dá)式的那些元組中的列值,需修改的列值在SET子句中指出。
§2.3PB6.5對(duì)數(shù)據(jù)庫(kù)的操作
PowerBuilder對(duì)數(shù)據(jù)庫(kù)的操作即可以通過(guò)數(shù)據(jù)窗口完成(本質(zhì)上是數(shù)據(jù)窗口把在屏幕上對(duì)數(shù)據(jù)
庫(kù)的操作轉(zhuǎn)化成SQL語(yǔ)句),又可以在PowerScript語(yǔ)言中直接調(diào)用SQL或存儲(chǔ)過(guò)程(本質(zhì)上仍是SQL
語(yǔ)句)完成。下面通過(guò)列舉兩個(gè)簡(jiǎn)單實(shí)例來(lái)描述在PowerScript程序調(diào)用SQL的方式:
1、SELECT語(yǔ)句查詢返回一行
如果SQLSELECT語(yǔ)句返回的結(jié)果只有一行,可以在PowerScript中書(shū)寫(xiě)以下的SQL語(yǔ)句:
SELECT列名1,列名2,列名3,…
INTO:變量1,:變量2,:變量3…
FROM表名1,表名2,表名3,…
WHERE…
其中,“變量1”,“變量2”和“變量3”等都是PowerScript語(yǔ)言的變量。該語(yǔ)句的作用是把數(shù)
據(jù)庫(kù)表的“列名1”,“列名2”和“列名3”等列的值從數(shù)據(jù)庫(kù)中取出,然后放入對(duì)應(yīng)的“變量1
”,“變量2”和“變量3”等變量中。例如:
Stringname,extrace
SELECTname,extractINTO:name,:extracefromauths
Whereauthor_code=’A00001’;
該語(yǔ)句僅僅適合于查詢到一條記錄的情況。如果查詢到的記錄是多條,則要用下面的方法。
2、查詢多行
SELECT是描述型語(yǔ)言,它面向的是集合,是一組記錄。而PowerScript語(yǔ)言卻是面向過(guò)程的,它要
一條條地接收并處理記錄。PowerScript通過(guò)描述型光標(biāo)(CURSOR)在這組記錄上游動(dòng)的方法,給
Script語(yǔ)句逐個(gè)地傳送記錄,建立了集合與記錄間的內(nèi)在聯(lián)系。請(qǐng)看下例:
Stringname
StringV1=’A%’
DECLARECURSORFORfile://定義光標(biāo),光標(biāo)名為C1
SELECTnameFROMauthsfile://光標(biāo)對(duì)應(yīng)的SELECT語(yǔ)句
WHEREauthor_codelike:V1;file://SELECT語(yǔ)句中用到了變量V1
OPENC1;//打開(kāi)光標(biāo),此時(shí)執(zhí)行此光標(biāo)對(duì)應(yīng)的SQLSELECT語(yǔ)句。
Lab1:
FETCHC1INTO:name;file://取記錄,光標(biāo)下移一條
IfSQLCA.SQLCode=0thenfile://取記錄成功
Gotolab1file://如果成功取出記錄,則取下一條
Endif
打開(kāi)光標(biāo)的時(shí)候,變量V1被其值“A%”替換,因此最后執(zhí)行的SQLSELECT語(yǔ)句為:
SELECTnameFROMauths
WHEREauthor_codelike‘A%’
執(zhí)行完這條語(yǔ)句后,把光標(biāo)C1定位到了查詢出的第一條記錄上。每執(zhí)行一次語(yǔ)句:
FECTCHC1INTO:name;
則取出一條記錄送給變量name,然后光標(biāo)移到下一條記錄。如果想控制查詢結(jié)果的次序,必須在
SELECT語(yǔ)句中用ORDERBY子句,否則,沒(méi)有其它的辦法。我們不可能一下子把光標(biāo)定位在某條記
錄上,只能從第一條開(kāi)始,一個(gè)個(gè)地移。
第三章PB6.5及其數(shù)據(jù)庫(kù)編程
§3.1開(kāi)發(fā)工具PowerBuilder6.5
3.1.1PowerBuilder6.5特點(diǎn)及功能
要適應(yīng)企業(yè)環(huán)境不斷變化的需求,成功地開(kāi)發(fā)出高質(zhì)量的應(yīng)用系統(tǒng),必須采用先進(jìn)的應(yīng)用開(kāi)發(fā)工
具。這對(duì)于減輕應(yīng)用開(kāi)發(fā)人員的開(kāi)發(fā)負(fù)擔(dān),提高開(kāi)發(fā)速度和質(zhì)量都有十分重要的意義。Sybase公
司推出的PowerBUilder6.0/6.5是用于Client/Server、Web及組件開(kāi)發(fā)的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)工具。它
占全球開(kāi)發(fā)工具市場(chǎng)近50%,是當(dāng)前最優(yōu)秀的開(kāi)發(fā)工具之一。它具有以下優(yōu)異的功能和特點(diǎn):
1、內(nèi)置的關(guān)系數(shù)據(jù)庫(kù)
PowerBuilder本身帶有一套數(shù)據(jù)庫(kù)系統(tǒng)SybaseSQLAnywhere。這樣做的好處是,PowerBuilder
可以脫離網(wǎng)絡(luò)數(shù)據(jù)庫(kù)服務(wù)器獨(dú)立運(yùn)行,從而在開(kāi)發(fā)階段脫離網(wǎng)絡(luò)服務(wù)器上的數(shù)據(jù)庫(kù)。當(dāng)然,利用
這一功能也可以開(kāi)發(fā)和調(diào)試單用戶的獨(dú)立的數(shù)據(jù)庫(kù)應(yīng)用。下圖顯示了內(nèi)置數(shù)據(jù)庫(kù)的工作原理:
如果沒(méi)有內(nèi)置的數(shù)據(jù)庫(kù)SybaseSQLAnywhere,開(kāi)發(fā)時(shí)則不能脫離網(wǎng)絡(luò)服務(wù)器上的數(shù)據(jù)庫(kù)(如圖3
-2所示):
2、數(shù)據(jù)窗口(Datawindow)對(duì)象
PowerBuilder擁有數(shù)據(jù)窗口這個(gè)具有專利技術(shù)的智能對(duì)象,利用該對(duì)象可以操作關(guān)系數(shù)據(jù)庫(kù)的數(shù)
據(jù)而無(wú)需編寫(xiě)SQL語(yǔ)句。用戶可以查詢、修改、插入、刪除、瀏覽、打印、以多種文件格式打開(kāi)和
存儲(chǔ)數(shù)據(jù),或在數(shù)據(jù)窗口中直接定義功能按鈕實(shí)現(xiàn)預(yù)定義的系統(tǒng)功能,如插入、刪除數(shù)據(jù)的操作
。它還支持?jǐn)?shù)據(jù)庫(kù)事務(wù)管理和并發(fā)控制等機(jī)制。其工作機(jī)理如下圖所示:
3、豐富的數(shù)據(jù)窗口數(shù)據(jù)源和多種樣式的數(shù)據(jù)顯示格式
數(shù)據(jù)窗口可以用來(lái)維護(hù)數(shù)據(jù)和顯示數(shù)據(jù),可定義多種顯示風(fēng)格和數(shù)據(jù)顯示格式;并且還可以與
TreeView控制、ListView控制配合使用,創(chuàng)建出更豐富的數(shù)據(jù)顯示格式
4、支持多種商業(yè)圖形,包括多種類型的二維和三維的圖形
5、支持組件的開(kāi)發(fā)和調(diào)用
用PowerBuilder開(kāi)發(fā)的組件,可以在其它應(yīng)用中調(diào)用,可以由多種事務(wù)管理服務(wù)器管理。
6、具有面向?qū)ο蟮奶卣?/p>
PowerBuilder采用了面向?qū)ο蟮拈_(kāi)方式,這可以使系統(tǒng)開(kāi)發(fā)人員在無(wú)需精通專用語(yǔ)言的情況下就
可以迅速轉(zhuǎn)向面向?qū)ο蟮拈_(kāi)發(fā)。PowerBuilder應(yīng)用是由一系列對(duì)象組成的,包括窗口、菜單、函
數(shù)、數(shù)據(jù)窗口和各種控制等對(duì)象,它支持對(duì)象的繼承、封裝和多態(tài)性。
7、有機(jī)結(jié)合的集成開(kāi)發(fā)環(huán)境
8、完全支持Windows的窗口信息和控制
9、強(qiáng)有力的PowerScript編程語(yǔ)言
它能使開(kāi)發(fā)人員很容易地將簡(jiǎn)單或復(fù)雜的事務(wù)邏輯與應(yīng)用相配合。該語(yǔ)言還有幾百個(gè)函數(shù)用于操
縱對(duì)象、處理數(shù)字、文本、字符串、日期和應(yīng)用分布,進(jìn)行文件處理、報(bào)表打印,用DDE和OLE2
.0進(jìn)行程序之間的通信,直接調(diào)用SQL語(yǔ)句操縱數(shù)據(jù)庫(kù)等等。
10、PowerBuilder提供了多種流行軟件的接口庫(kù)
NetwareLibrary
PenComputingLibrary
LotusNotesLibrary
MicrosoftMAPI
11、PowerBuilder支持多種平臺(tái)
目前,PowerBuilder能夠在MicrosoftWindows3.X、Windows95WindowsNTAlpha/IntelApple
MacSunSalorisIBMAIXHPUnix等多種平臺(tái)上開(kāi)發(fā)和運(yùn)行應(yīng)用程序,并能夠不加改動(dòng)地應(yīng)用于
其它平臺(tái)上。
12、支持Internet/Intranet下的Web應(yīng)用開(kāi)發(fā)
13、支持團(tuán)體開(kāi)發(fā)
14、對(duì)多種數(shù)據(jù)庫(kù)的支持
PowerBuilder幾乎支持所有的數(shù)據(jù)庫(kù),它提供了到多種數(shù)據(jù)庫(kù)的專用接口和ODBC接口。
§3.2PowerBuilder與Client/Server體系結(jié)構(gòu)
3.2.1Client/Server模式
在C/S結(jié)構(gòu)中,存在著幾個(gè)非常重要的基本概念,它們是:主機(jī)、終端、客戶機(jī)、工作站和服務(wù)器
。在分析C/S網(wǎng)絡(luò)結(jié)構(gòu)之前,必須搞清楚它們之間的區(qū)別。
最早的計(jì)算機(jī)網(wǎng)絡(luò)是伴隨著主機(jī)(Host)和終端(Terminal)這兩個(gè)概念的出現(xiàn)而產(chǎn)生的。當(dāng)時(shí)的
主機(jī)通常是指具有中央處理單元(CPU)的大型機(jī)或功能較強(qiáng)的小型機(jī),而終端則是指計(jì)算機(jī)的輸
入輸出設(shè)備。終端沒(méi)有自己的CPU,當(dāng)然也沒(méi)有自己的內(nèi)存,其主要功能是將鍵盤輸入的請(qǐng)求數(shù)據(jù)
發(fā)往主機(jī)并將主機(jī)的運(yùn)算結(jié)果顯示出來(lái)。主機(jī)和終端共同構(gòu)成了集中式系統(tǒng)結(jié)構(gòu)。在這種應(yīng)用系
統(tǒng)中,幾乎所有的工作都是由主機(jī)來(lái)完成,終端僅僅作為一種輸入輸出設(shè)備,因此系統(tǒng)負(fù)荷重、
效率低、擴(kuò)充性差。
之后隨著計(jì)算機(jī)網(wǎng)絡(luò)結(jié)構(gòu)的細(xì)化,不同的計(jì)算機(jī)開(kāi)始在網(wǎng)絡(luò)中擔(dān)負(fù)不同的任務(wù),于是出現(xiàn)了文件
服務(wù)器/網(wǎng)絡(luò)工作站(F/W)式結(jié)構(gòu)的模型。其中,工作站(Workstation)和服務(wù)器(Server)都
是獨(dú)立的計(jì)算機(jī)。當(dāng)一臺(tái)連入網(wǎng)絡(luò)的計(jì)算機(jī)向其它計(jì)算機(jī)(工作站)提供各種網(wǎng)絡(luò)服務(wù)(如數(shù)據(jù)
、文件的共享)時(shí),它就被叫做服務(wù)器。而那些用于訪問(wèn)服務(wù)器資料的計(jì)算機(jī)則被叫做工作站。
在F/W結(jié)構(gòu)中,所有實(shí)際的數(shù)據(jù)處理工作仍在運(yùn)行數(shù)據(jù)庫(kù)應(yīng)用程序的PC工作站上完成,因此不論文
件服務(wù)器的性能有多高,其整體網(wǎng)絡(luò)性能都將受到PC機(jī)能力的限制。
客戶機(jī)(Client)是伴隨C/S數(shù)據(jù)訪問(wèn)的興起而被提出來(lái)的,在一般人的理解中它和F/W概念沒(méi)有
本質(zhì)的區(qū)別。但是,嚴(yán)格說(shuō)來(lái),C/S模型并不是從物理分布的角度來(lái)定義的。它既包括具體的網(wǎng)絡(luò)
結(jié)構(gòu)設(shè)計(jì),又包括軟件的運(yùn)行和組織,所體現(xiàn)的是一種網(wǎng)絡(luò)數(shù)據(jù)的訪問(wèn)方式。這里的客戶機(jī)和服
務(wù)器不僅指承擔(dān)不同任務(wù)的計(jì)算機(jī)本身,而且包括主機(jī)上運(yùn)行的客戶端和服務(wù)器端的軟件環(huán)境。
它們的區(qū)別,是相對(duì)于各自在網(wǎng)絡(luò)數(shù)據(jù)庫(kù)訪問(wèn)中所處的地位或?qū)崿F(xiàn)的功能而言的。
理解了以上的基本概念,才可以更好地理解C/S結(jié)構(gòu)的實(shí)質(zhì)和運(yùn)行方式:所謂C/S結(jié)構(gòu),是將數(shù)據(jù)
存取與應(yīng)用程序分離開(kāi)來(lái),把一個(gè)軟件系統(tǒng)或應(yīng)用系統(tǒng)按功能分成若干個(gè)部分,再將這些軟件的
組成部分按其不同的角色分成Client軟件和Server軟件,分別放置在客戶機(jī)和服務(wù)器上??蛻魴C(jī)
程序負(fù)責(zé)用戶交互界面、數(shù)據(jù)表示及應(yīng)用處理邏輯等應(yīng)用部分,而服務(wù)器端則負(fù)責(zé)數(shù)據(jù)存取管理
、完整性控制及并發(fā)控制等數(shù)據(jù)庫(kù)管理部分。客戶機(jī)程序應(yīng)用通過(guò)SQL語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù),相應(yīng)的
SQL語(yǔ)句經(jīng)網(wǎng)絡(luò)傳輸?shù)椒?wù)器端,由服務(wù)器端的數(shù)據(jù)庫(kù)服務(wù)器解釋執(zhí)行這些SQL語(yǔ)句,執(zhí)行后的結(jié)
果數(shù)據(jù)送回客戶機(jī)。
3.2.2Client/Server體系結(jié)構(gòu)的優(yōu)缺點(diǎn)
我們看到,客戶/服務(wù)器體系結(jié)構(gòu)有以下優(yōu)點(diǎn):
l應(yīng)用邏輯與數(shù)據(jù)實(shí)現(xiàn)分離,實(shí)現(xiàn)了在網(wǎng)絡(luò)上的負(fù)載均衡;
l充分利用了網(wǎng)絡(luò)服務(wù)器的處理能力??蛻糁行鑼⒄?qǐng)求送數(shù)據(jù)庫(kù)服務(wù)器,數(shù)據(jù)查詢工作由服務(wù)器
來(lái)承擔(dān),服務(wù)器的能力可以得到充分的發(fā)揮。
但是它也有以下一些缺點(diǎn):
l由于計(jì)算機(jī)技術(shù)的快速進(jìn)步和企業(yè)需求變化的加快,企業(yè)面臨的硬件、網(wǎng)絡(luò)操作系統(tǒng)、數(shù)據(jù)庫(kù)
系統(tǒng)、開(kāi)發(fā)工具、應(yīng)用系統(tǒng)的升級(jí)周期越來(lái)越短,因此“維護(hù)”客戶服務(wù)器的費(fèi)用就變得越來(lái)越
高昂。
l快速升級(jí)的硬件、網(wǎng)絡(luò)操作系統(tǒng)、數(shù)據(jù)庫(kù)系統(tǒng)、開(kāi)發(fā)工具使企業(yè)的技術(shù)人員失去了方向:不斷
地消化新技術(shù),卻無(wú)瑕顧及企業(yè)要解決的問(wèn)題
l在客戶端,必須安裝操作系統(tǒng)(一般為Windows95/NT)、網(wǎng)絡(luò)軟件、特定的中間件(Sybasse
Net-Library)以及應(yīng)用軟件系統(tǒng)才能工作,因此應(yīng)用系統(tǒng)的安裝、升級(jí)和維護(hù)通常需要專業(yè)人員
才能用勝任,且必須各站點(diǎn)逐個(gè)安裝,從而使客戶端的維護(hù)費(fèi)用變得也很高昂。對(duì)主機(jī)系統(tǒng)來(lái)說(shuō)
,這一點(diǎn)要優(yōu)越的多,只需要在主機(jī)上安裝一次即可。
3.2.3PowerBuilder是客戶/服務(wù)器體系結(jié)構(gòu)下客戶端的開(kāi)發(fā)工具
前面已提到,PowerBuilder是客戶/服務(wù)器體系結(jié)構(gòu)下開(kāi)發(fā)客戶程序用的開(kāi)發(fā)工具,用
PowerBuilder開(kāi)發(fā)出的程序可以存取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。下圖表示了PowerBuilder與數(shù)據(jù)庫(kù)配合工
作的方式。
我們看到,PowerBuilder作為客戶端的應(yīng)用開(kāi)發(fā)工具,主要完成的是表示邏輯方面的工作,例如
,菜單、錄入界面。而數(shù)據(jù)庫(kù)服務(wù)器管理的是事務(wù)邏輯和數(shù)據(jù)存取方面的工作。因此,
PowerBuilder開(kāi)發(fā)工作應(yīng)分為兩部分,一部分是前臺(tái)表示邏輯方面的工作,另一部分是數(shù)據(jù)庫(kù)后
臺(tái)方面的設(shè)計(jì)工作(如數(shù)據(jù)庫(kù)觸發(fā)器、存儲(chǔ)過(guò)程和視圖等的設(shè)計(jì))。一個(gè)好的應(yīng)用系統(tǒng),前臺(tái)開(kāi)
發(fā)與后設(shè)計(jì)應(yīng)是有機(jī)結(jié)合、合理分布的;良好的后臺(tái)設(shè)計(jì)可以降低前臺(tái)的開(kāi)工作量,提高系統(tǒng)的
運(yùn)行效率。
§3.3PowerBuilder6.5數(shù)據(jù)庫(kù)編程
PowerBuilder與數(shù)據(jù)庫(kù)的關(guān)系是“配合”與“協(xié)調(diào)”的關(guān)系。PowerBuilder完成數(shù)據(jù)請(qǐng)求、數(shù)據(jù)
表現(xiàn)、菜單、界面等表象方面的工作,而數(shù)據(jù)庫(kù)服務(wù)器完成數(shù)據(jù)庫(kù)數(shù)據(jù)的存儲(chǔ)管理、安全管理、
并發(fā)控制、事務(wù)管理、完整性維護(hù)、查詢優(yōu)化等工作。
PowerBuilder在操作數(shù)據(jù)庫(kù)時(shí)與以下幾方面有關(guān):
1、在數(shù)據(jù)庫(kù)畫(huà)筆中定義數(shù)據(jù)庫(kù)表和視圖
l定義表的結(jié)構(gòu)
l表中列的擴(kuò)展屬性
²定義表中列的顯示風(fēng)格
²定義表中列的編輯屏蔽
²定義表中列的校驗(yàn)
l定義表的主鍵
l定義表的外部鍵
l定義表的索引
PowerBuilder有五個(gè)系統(tǒng)表,這五個(gè)系統(tǒng)表是PowerBuilder初次連接到數(shù)據(jù)庫(kù)時(shí)系統(tǒng)自動(dòng)建立的
。下表給出了這個(gè)系統(tǒng)表的表名和它們的作用
PowerBuilder系統(tǒng)表用途
PBCATTBL存放表或視圖,表或視圖中列的缺省字體。
PBCATCOL存放列用到的顯示風(fēng)格名、校驗(yàn)規(guī)則名和編輯風(fēng)格名;列的標(biāo)題、列的標(biāo)簽、字體的大
小寫(xiě),字體的對(duì)齊方式。
PBCATFMT列的顯示風(fēng)格定義。
PBCATVLD列的校驗(yàn)規(guī)則定義。
PBCATEDT列的編輯風(fēng)格定義。
表3-1PowerBuilder系統(tǒng)表
2、在數(shù)據(jù)庫(kù)畫(huà)筆中在圖形方式下操作數(shù)據(jù)庫(kù)
這些操作包括:
l插入記錄
l修改記錄
l刪除記錄
l查詢記錄
l把查詢出的記錄存入文件
l把表或視圖的定義轉(zhuǎn)變成建表的SQL語(yǔ)名
這些功能是給開(kāi)發(fā)人員和管理人員提供的。
3、在數(shù)據(jù)庫(kù)畫(huà)筆中用SQL語(yǔ)句執(zhí)行平臺(tái)管理操作數(shù)據(jù)庫(kù)
l生成數(shù)據(jù)庫(kù)
l管理數(shù)據(jù)庫(kù)
l維護(hù)數(shù)據(jù)
在這里創(chuàng)建的表和規(guī)則不會(huì)記錄在PowerBuilder系統(tǒng)表中
4、在查詢畫(huà)筆中定義查詢對(duì)象
如果一個(gè)查詢動(dòng)作要多次使用,還可以用PowerBuilder的查詢畫(huà)表生成查詢對(duì)象這個(gè)查詢對(duì)象不
能由數(shù)據(jù)庫(kù)畫(huà)表調(diào)用,它只能由查詢畫(huà)表本身調(diào)用執(zhí)行。在建立數(shù)據(jù)窗口時(shí),數(shù)據(jù)源也可以做在
查詢對(duì)象之上。
事實(shí)上,查詢對(duì)象就是寫(xiě)好了的SQL語(yǔ)句,它存在PowerBuilder的pbl文件中,在使用的時(shí)候調(diào)用
即可。
5、用數(shù)據(jù)管道在不同數(shù)據(jù)庫(kù)之間轉(zhuǎn)換數(shù)據(jù)
數(shù)據(jù)管道允許把一個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)(一個(gè)或多個(gè)表中的全部或部分行)轉(zhuǎn)入到
另一個(gè)數(shù)據(jù)庫(kù)的一個(gè)表中(這個(gè)表可以存在或不存在),從而可以使數(shù)據(jù)在不同數(shù)據(jù)庫(kù)之間相互
復(fù)制。
6、用數(shù)據(jù)窗口操作數(shù)據(jù)庫(kù)
Datawindow是PowerBuilder操作數(shù)據(jù)庫(kù)的重要的手段,通過(guò)數(shù)據(jù)窗口可以查
修改、插入和刪除數(shù)據(jù)庫(kù)的數(shù)據(jù)。PowerBuilder數(shù)據(jù)窗口操作數(shù)據(jù)庫(kù)的能力非常強(qiáng),是
PowerBuilder的精華所在。
l數(shù)據(jù)窗口的數(shù)據(jù)源可以是:
²表或視圖
²多表連接
²查詢對(duì)象
²外部數(shù)據(jù)源
²存儲(chǔ)過(guò)程
l數(shù)據(jù)窗口列數(shù)據(jù)的顯示風(fēng)格
l數(shù)據(jù)窗口列的編輯屏蔽
l數(shù)據(jù)窗口列的校驗(yàn)
7、PowerScript直接調(diào)用SQL語(yǔ)句操作數(shù)據(jù)庫(kù)
PowerBuilder對(duì)數(shù)據(jù)庫(kù)的操作即可以通過(guò)數(shù)據(jù)窗口完成(本質(zhì)上是數(shù)據(jù)窗口屏幕上對(duì)數(shù)據(jù)庫(kù)的操作
轉(zhuǎn)化成SQL語(yǔ)句),又可以在PowerScript語(yǔ)言中直接調(diào)用SQL或存儲(chǔ)過(guò)程(本質(zhì)上仍是SQL語(yǔ)句)完成
。詳細(xì)操作在第*個(gè)章節(jié)已經(jīng)介紹。
第四章局域網(wǎng)圖書(shū)資料查詢系統(tǒng)設(shè)計(jì)分析
根據(jù)數(shù)據(jù)庫(kù)系統(tǒng)生存期的設(shè)計(jì)方法,從數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)和開(kāi)發(fā)的全過(guò)程來(lái)考慮,將數(shù)據(jù)庫(kù)應(yīng)用系
統(tǒng)設(shè)計(jì)分為以下幾個(gè)階段(見(jiàn)圖4-1)
1)規(guī)劃;
2)需求分析;
3)概念設(shè)計(jì);
4)邏輯設(shè)計(jì)
5)物理設(shè)計(jì)
§4.1應(yīng)用需求分析
要設(shè)計(jì)一個(gè)良好的局域網(wǎng)圖書(shū)資料查詢系統(tǒng),就必須首先明確該應(yīng)用環(huán)境對(duì)系統(tǒng)的要求。局域網(wǎng)
圖書(shū)資料查詢系統(tǒng)的應(yīng)用背景為:一個(gè)數(shù)十人的科研或開(kāi)發(fā)小組,搜集了上千冊(cè)有用的圖書(shū)資料
,其中有一部分分布在個(gè)人手中,為了方便大家查閱,需要對(duì)每本書(shū)的狀態(tài)進(jìn)行跟蹤,另新進(jìn)和
丟失的圖書(shū)資料必須得到及時(shí)的反映。因此,該系統(tǒng)需滿足以下幾方面需求:
l用戶的管理:必須具有使用權(quán)限的用戶才能成功登錄到系統(tǒng)中來(lái)。所謂用戶權(quán)限在這里并不要
求有功能上具體的劃分,集中實(shí)行松散管理,這建立在用戶高度自覺(jué)的基礎(chǔ)上。所以,在這里只
需給每個(gè)需要使用系統(tǒng)的人一個(gè)用戶名和密碼,即可登錄系統(tǒng)進(jìn)行各種操作。新的用戶需要取得
管理員的許可將其加入系統(tǒng),加入系統(tǒng)的用戶可以對(duì)自己的用戶密碼進(jìn)行修改。
l查詢功能:系統(tǒng)需要提供幾種不同方式的查詢手段,以實(shí)現(xiàn)靈活方便地管理整個(gè)系統(tǒng)。
²圖書(shū)分類查詢:一本圖書(shū)包括書(shū)名、出版社、作者、保管人等多個(gè)信息,這就要求系統(tǒng)能按照
不同的信息類別對(duì)圖書(shū)進(jìn)行查詢。比如說(shuō),按書(shū)名查詢、按作者查詢等。選定需要的查詢信息類
別,再輸入想查詢的內(nèi)容即可查詢到相關(guān)的圖書(shū)信息。
²多條件查詢:很多時(shí)候,用戶需要了解的信息不僅僅局限于一個(gè)條件,比方說(shuō)想同時(shí)查詢書(shū)名
為“數(shù)據(jù)庫(kù)原理”但出版社僅為“經(jīng)濟(jì)科學(xué)出版社”的圖書(shū)信息時(shí),單純的分類查詢就不能滿足
用戶的需要,這時(shí)就要用到多條件查詢。也就是說(shuō),多條件查詢不僅可以實(shí)現(xiàn)單個(gè)的分類查詢,
還可以實(shí)現(xiàn)多條分類查詢的組合查詢。每個(gè)查詢條件之間用“并且”或“或者”的關(guān)系關(guān)聯(lián)起來(lái)
組成完整的查詢條件。
²模糊查詢:對(duì)于用戶來(lái)說(shuō)并不一定完全記得某本圖書(shū)準(zhǔn)確的名稱,類似,對(duì)于作者、出版社等
等信息來(lái)說(shuō),很多時(shí)候用戶只是記得一些相關(guān)的信息而不是一字不差的準(zhǔn)確信息。這個(gè)時(shí)候就要
用到模糊查詢。用戶輸入查詢內(nèi)容后,系統(tǒng)將會(huì)把包含查詢內(nèi)容的(注意:并不是精確的等于查詢
內(nèi)容)所有相關(guān)圖書(shū)信息顯示出來(lái),以使用戶得到準(zhǔn)確的、自己真正需要的信息內(nèi)容。
l更新與編輯:
²更新:系統(tǒng)允許用戶對(duì)查詢到的內(nèi)容進(jìn)行修改并且存盤。
²編輯:系統(tǒng)允許用戶對(duì)現(xiàn)庫(kù)進(jìn)行插入、刪除的操作,保證現(xiàn)庫(kù)的真實(shí)性與實(shí)時(shí)性。
l打印輸出:系統(tǒng)可以將用戶查詢到的內(nèi)容動(dòng)態(tài)地生成報(bào)表,并打印輸出。
§4.2系統(tǒng)功能模塊劃分
局域網(wǎng)圖書(shū)圖書(shū)資料查詢系統(tǒng)功能劃分模塊圖如下:
§4.3系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)
4.3.1概念設(shè)計(jì)
概念設(shè)計(jì)的目標(biāo)是產(chǎn)生反映局域網(wǎng)圖書(shū)資料查詢系統(tǒng)需求的數(shù)據(jù)庫(kù)概念結(jié)構(gòu),即概念模式。概念
模式是獨(dú)立于數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu),獨(dú)立于支持?jǐn)?shù)據(jù)庫(kù)的DBMS,不依賴于計(jì)算機(jī)系統(tǒng)的。
lER模型
ER模型是對(duì)現(xiàn)實(shí)世界的一種抽象。它的主要成分是實(shí)體、聯(lián)系和屬性。使
用這三種成分,我們可以建立許多應(yīng)用環(huán)境的ER模型。
lER模型的操作
在利用ER模型進(jìn)行數(shù)據(jù)庫(kù)概念設(shè)計(jì)的過(guò)程中,常常需要對(duì)ER圖進(jìn)行種種
變換。這些變換又稱為ER模型的操作,包括實(shí)體類型、聯(lián)系類型和屬性的分裂、合并和增刪等等
。
l利用ER方法的數(shù)據(jù)庫(kù)概念設(shè)計(jì)
利用ER方法進(jìn)行數(shù)據(jù)庫(kù)的概念設(shè)計(jì),可以分成三步進(jìn)行:首先設(shè)計(jì)局部ER
模式,然后把各局部ER模式綜合成一個(gè)全局ER模式,最后對(duì)全局ER模式進(jìn)行優(yōu)化,得到最終
的ER模式,即概念模式。
1.設(shè)計(jì)局部的ER模式
通常,一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)都是為多個(gè)不同用戶服務(wù)的。各個(gè)用戶對(duì)數(shù)據(jù)的觀點(diǎn)可能不一樣,信息處
理需求也可能不同。在設(shè)計(jì)數(shù)據(jù)庫(kù)概念結(jié)構(gòu)時(shí),為了更好地模擬現(xiàn)實(shí)世界,一個(gè)有效的策略是“
分而治之”,即先分別考慮各個(gè)用戶的信息需求,形成局部概念結(jié)構(gòu),然后再綜合成全局結(jié)構(gòu)。
在ER方法中,局部概念結(jié)構(gòu)又稱為局部ER模式,其圖形表示稱為ER圖。
實(shí)體和屬性的定義如下:
圖書(shū)(資料編號(hào),資料名稱,作者,出版社,出版日期,ISBN,資料類別,購(gòu)買日期,保管人,
備注)
用戶(編號(hào),用戶代碼,用戶姓名,登錄口令,使用權(quán)限,查詢顯示項(xiàng),用戶顯示頭像)
資料類別(資料編號(hào),資料類別)
出版社(出版社編號(hào),出版社)
2.聯(lián)系定義:
ER模型的“聯(lián)系”用于刻畫(huà)實(shí)體之間的關(guān)聯(lián)。一種完整的方式是對(duì)局部結(jié)構(gòu)中任意兩個(gè)實(shí)體類型
,依據(jù)需求分析的結(jié)果,考察局部結(jié)構(gòu)中任意兩個(gè)實(shí)體類型之間是否存在聯(lián)系。若有聯(lián)系,進(jìn)一
步確定是1:N,M:N,還是1:1等。還要考察一個(gè)實(shí)體類型內(nèi)部是否存在聯(lián)系,兩個(gè)實(shí)體類型之間是
否存在聯(lián)系,多個(gè)實(shí)體類型之間是否存在聯(lián)系,等等。聯(lián)系定義如圖4-5所示。解釋如下:
l一個(gè)用戶可以保管多本圖書(shū)資料,而一本圖書(shū)資料只能由一個(gè)用戶保管;
l一個(gè)資料類別可以對(duì)應(yīng)多本圖書(shū),而一本圖書(shū)只對(duì)應(yīng)一個(gè)資料類別;
l一本圖書(shū)由一個(gè)出版社出版,而一個(gè)出版社可以出版多種圖書(shū)。
3.設(shè)計(jì)全局ER模式
所有局部ER模式都設(shè)計(jì)好了后,接下來(lái)就是把它們綜合成單一的全局概念結(jié)構(gòu)。全局概念結(jié)構(gòu)不
僅要支持所有局部ER模式,而且必須合理地表示一個(gè)完整、一致的數(shù)據(jù)庫(kù)概念結(jié)構(gòu)。
1)確定公共實(shí)體類型
為了給多個(gè)局部ER模式的合并提供開(kāi)始合并的基礎(chǔ),首先要確定各局部結(jié)構(gòu)中的公共實(shí)體類型。
在這一步中我們僅根據(jù)實(shí)體類型名和鍵枕認(rèn)定公共實(shí)體類型。一般把同名實(shí)體類型作為公共實(shí)體
類型的一類候選,把具有相同鍵的實(shí)體類型作為公共實(shí)體類型的另一類候選。
2)局部ER模式的合并
合并的原則是:首先進(jìn)行兩兩合并;先和合并那些現(xiàn)實(shí)世界中有聯(lián)系的局部結(jié)構(gòu);合并從公共實(shí)
體類型開(kāi)始,最后再加入獨(dú)立的局部結(jié)構(gòu)。
3)消除沖突
沖突分為三類:屬性沖突、結(jié)構(gòu)沖突、命名沖突。
設(shè)計(jì)全局ER模式的目的不在于把若干局部ER模式形式上合并為一個(gè)ER模式,而在于消除沖突,使
之成為能夠被所有用戶共同理解和接受的同一的概念模型。
3)全局ER模式的優(yōu)化
在得到全局ER模式后,為了提高數(shù)據(jù)庫(kù)系統(tǒng)的效率,還應(yīng)進(jìn)一步依據(jù)處理需求對(duì)ER模式進(jìn)行優(yōu)化
。一個(gè)好的全局ER模式,除能準(zhǔn)確、全面地反映用戶功能需求外,還應(yīng)滿足下列條件:實(shí)體類型
的個(gè)數(shù)要盡可能的少;實(shí)體類型所含屬性個(gè)數(shù)盡可能少;實(shí)體類型間聯(lián)系無(wú)冗余。
4.3.2邏輯設(shè)計(jì)
由于概念設(shè)計(jì)的結(jié)果是ER圖,DBMS一般采用關(guān)系型,因此數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)過(guò)程就是把ER圖轉(zhuǎn)化
為關(guān)系模式的過(guò)程。由于關(guān)系模型古有的優(yōu)點(diǎn),邏輯設(shè)計(jì)可以充分運(yùn)用關(guān)系數(shù)據(jù)庫(kù)規(guī)范化理論,
使設(shè)計(jì)過(guò)程形式化地進(jìn)行。設(shè)計(jì)結(jié)果是一組關(guān)系模式的定義。
1)導(dǎo)出初始關(guān)系模式
圖4-5關(guān)系模式集
2)關(guān)系子模式
子模式是用戶所用到的那部分?jǐn)?shù)據(jù)的描述。除了指出用戶用到的數(shù)據(jù)外,還應(yīng)指出數(shù)據(jù)與概念模
式中相應(yīng)數(shù)據(jù)的聯(lián)系,即指出概念模式與子模式之間的對(duì)應(yīng)性。
圖書(shū)信息子模式((編號(hào)#,資料名稱,作者,出版社,出版日期,ISBN,資料類別,購(gòu)買日期
,保管人,備注)用戶信息子模式(編號(hào),用戶代碼,用戶姓名,登錄口令,使用權(quán)限,查詢顯
示項(xiàng),用戶顯示頭像)
圖4-6部分子模式
4.3.3數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
我們選用MicrosoftOffice中的Access數(shù)據(jù)庫(kù)來(lái)進(jìn)行數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)。首先創(chuàng)建四個(gè)基本數(shù)據(jù)
庫(kù)表如如4-1-4-5所示,然后建立各個(gè)表之間的聯(lián)系,如圖4-8所示。
第五章局域圖書(shū)資料查詢系統(tǒng)應(yīng)用程序設(shè)計(jì)
§5.1系統(tǒng)模塊組成
§5.2登錄模塊實(shí)現(xiàn)
圖5-2登錄模塊圖
該窗口所含的控件信息如下:
風(fēng)格控件名說(shuō)明
用戶名SinglelineeditSle_1------
口令SinglelineeditSle_1Propeties:passwd
登錄日期EditMaskEm_1masktype:datamm/dd/yyyy
表5-1登錄模塊控件信息表
控件:Sle_1事件(event):ModifiedScriptofmodified:
stringinput_code,namesetfocus()file://將光標(biāo)定位在該控件
input_code=string(this.text)file://接收用戶輸入的值,并賦值給變量selectnameinto
:namefromkeeperwhereid=:input_codeorpym=:input_code;//從用戶表里查找滿足輸入條件
的記錄ifsqlca.sqlcode=0thenthis.Text=namesetfocus(sle_2)file://查找成功,則光
標(biāo)跳轉(zhuǎn)到“口令”控件elseifsqlca.sqlcode=100thenmessagebox("提示!",&"對(duì)不起,
用戶不存在!",&StopSign!)return1file://查找不到符合條件的記錄則提示else
messagebox("錯(cuò)誤!",&"error:"+string(sqlca.sqldbcode)&+"information:"+sqlca.
sqlerrtext)file://SQL出錯(cuò)提示endifendif
控件:Sle_2事件(event):ModifiedScriptofmodified:
stringinput_passwd,passwd,droitinput_passwd=RightTrim(this.text)//去掉輸入值右邊的空
格selectpasswdinto:passwdfromkeeperwherename=:sle_1.text;passwd=RightTrim(
passwd);//從用戶表中校驗(yàn)口令的正確性ifsqlca.sqlcode=0thenifinput_passwd<>
passwdthenmessagebox(''''口令錯(cuò)誤'''',''''對(duì)不起,請(qǐng)重新輸入'''',stopsign!);sle_2.
SelectText(1,Len(sle_2.Text))this.Clear()//口令錯(cuò)誤則清除輸入內(nèi)容setfocus
(sle_2)elseifinput_passwd=passwdthenuser=righttrim(sle_1.text)selectdroit
into:droitfromkeeperwherename=:user;//口令正確將用戶操作權(quán)限賦值給變量
open(main)//打開(kāi)程序主窗口close(w_login)//關(guān)閉登錄窗口endifelseif
sqlca.sqlcode=100thenmessagebox(''''提示!'''',''''無(wú)數(shù)據(jù)'''',Stopsign!)return1else
messagebox("錯(cuò)誤!",&"error:"+string(sqlca.sqldbcode)&+"information:"+sqlca.
sqlerrtext)file://SQL出錯(cuò)提示endif
在登錄模塊中,用戶可輸入自己的編號(hào)或編碼來(lái)登錄系統(tǒng)。系統(tǒng)會(huì)根據(jù)用戶輸入的編號(hào)或編碼值
來(lái)自動(dòng)給出確實(shí)已存在庫(kù)中的用戶中文名,若查找不到庫(kù)中相匹配的記錄則提示出錯(cuò)或重輸。若
用戶存在,則提示輸入口令,口令正確則會(huì)順利進(jìn)入該系統(tǒng)主界面。
§5.3查詢模塊的實(shí)現(xiàn)
圖5-3查詢窗口
該窗口(w_main)控件列表如下:
風(fēng)格控件名說(shuō)明
顯示項(xiàng)GroupBoxgb_1------
資料名稱CheckBoxcbx_1Checked:true
作者CheckBoxcbx_2Checked:true
出版社CheckBoxcbx_3Checked:true
出版日期CheckBoxcbx_4Checked:false
類別CheckBoxcbx_5Checked:true
購(gòu)買日期CheckBoxcbx_6Checked:false
ISBNCheckBoxcbx_7Checked:false
保管人CheckBoxcbx_8Checked:true
備注CheckBoxcbx_9Checked:false
全選CheckBoxcbx_10選擇全部顯示項(xiàng)
檢索PictureBoxpb_1模糊查詢檢索
插入PictureBoxpb_2插入一條記錄
刪除PictureBoxpb_3刪除一條記錄
檢索PictureBoxpb_4組合查詢檢索
全部記錄PictureBoxpb_5檢索全部記錄
退出PictureBoxpb_6退出查詢界面
修改PictureBoxpb_7進(jìn)入編輯模式
插入PictureBoxpb_8插入一條查詢條件
刪除PictureBoxpb_9刪除一條查詢條件
存盤PictureBoxpb_10修改后的數(shù)據(jù)存盤
打印PictureBoxpb_11打印查詢結(jié)果報(bào)表
存為默認(rèn)顯示項(xiàng)PictureBoxpb_12將顯示項(xiàng)存為當(dāng)前用戶默認(rèn)
------Singlelineeditsle_1查詢內(nèi)容輸入(字符型)
------Editmaskem_1查詢內(nèi)容輸入(日期型)
------Statictextst_1顯示當(dāng)前用戶名
------PictureP_1修改按鈕裝飾
------PictureP_2Gb_1顯示裝飾
------PictureP_3顯示當(dāng)前用戶頭像
------Dropdownlistboxddlb_1查詢項(xiàng)選擇
------Dropdownlistboxddlb_2查詢操作符選擇
------Tabcontroltab_1共有三個(gè)tabpage頁(yè)tabpage1:模糊查詢tabpage2:組合查詢tabpage3:
更新打印
------Datawindowscontroldw_1對(duì)應(yīng)數(shù)據(jù)窗口d_information圖書(shū)信息檢索
------Datawindowscontroldw_2對(duì)應(yīng)數(shù)據(jù)窗口d_query_condition查詢條件檢索
CommandbuttonCb_2模糊查詢操作符英-中轉(zhuǎn)換
表5-2查詢模塊控件信息表
控件:w_main事件(event):openScriptofopen
stringmode,p,xs,headbooleanxs_item[10]integeridw_1.settransobject(sqlca)dw_1.
Retrieve()//打開(kāi)窗口顯示全部記錄sj_check=0//為檢索窗口排序變量賦初值st_1.text=user//
在查詢窗口右上角顯示當(dāng)前用戶名SELECT"keeper"."display_item","keeper"."
head_picture"INTO:xs,:headFROM"keeper"WHERE"keeper"."name"=:user;
//從用戶表中讀出當(dāng)前用戶的頭像值及顯示像值并分別賦值給變量file://有頭像的用戶則顯示
在查詢窗口右上角ifisnull(head)thenp_3.visible=falseelsep_3.picturename=
headendif////將當(dāng)前用戶查詢顯示項(xiàng)變量讀出并賦值給每個(gè)查詢顯示控件fori=1to8if
Mid(xs,i,1)=''''0''''thenxs_item[i]=falseelsexs_item[i]=trueendifendfor////給每
個(gè)對(duì)應(yīng)的CHECKBOX賦值,確實(shí)是勾還是叉cbx_2.checked=xs_item[1]cbx_3.checked=
xs_item[2]cbx_4.checked=xs_item[3]cbx_5.checked=xs_item[4]cbx_6.checked=
xs_item[5]cbx_7.checked=xs_item[6]cbx_8.checked=xs_item[7]cbx_9.checked=
xs_item[8]////對(duì)應(yīng)的數(shù)據(jù)窗口顯示情況dw_1.object.id.visible=falsedw_1.object.name
.visible=truedw_1.object.author.visible=cbx_2.checkeddw_1.object.
publishing_house.visible=cbx_3.checkeddw_1.object.publishing_date.visible=cbx_4.
checkeddw_1.object.sort.visible=cbx_5.checkeddw_1.object.buy_date.visible=cbx_6.
checkeddw_1.object.isbn.visible=cbx_7.checkeddw_1.object.keeper.visible=cbx_8.
checkeddw_1.object.memo.visible=cbx_9.checked////將查詢數(shù)據(jù)窗口設(shè)為只讀dw_1.Object
.DataWindow.ReadOnly="Yes"
控件:pb_12“存為默認(rèn)顯示選項(xiàng)”事件(event):clickedScriptofclicked
booleancheck[10]integeri,answerstringxs_item[10]string
xs_content,question_text,tempquestion_text="將當(dāng)前顯示項(xiàng)存為"+user+"用戶的默認(rèn)顯示項(xiàng)
?"answer=messagebox(''''提示!'''',question_text,question!,YesNoCancel!)choosecaseanswer
case1file://將當(dāng)前對(duì)應(yīng)的CHECEKBOX選項(xiàng)記錄下來(lái)check[1]=cbx_2.checkedcheck[2]
=cbx_3.checkedcheck[3]=cbx_4.checkedcheck[4]=cbx_5.checkedcheck[5]
=cbx_6.checkedcheck[6]=cbx_7.checkedcheck[7]=cbx_8.checkedcheck[8]
=cbx_9.checked//file://將顯示項(xiàng)轉(zhuǎn)化為01的顯示,存入數(shù)組變量xs_content=''''''''
fori=1to8ifcheck[i]=truethenxs_item[i]=''''1''''elsexs_item[i]=''''0''''
endifxs_content=xs_content+xs_item[i]endfor//file://修改用戶表中顯示項(xiàng)
的值UPDATE"keeper"SET"display_item"=:xs_contentWHERE"
keeper"."name"=:user;choosecaseSQLCA.sqlcodecase-1messagebox("
錯(cuò)誤!","error:"+&string(sqlca.sqldbcode)+&"information:"+sqlca.sqlerrtext)
messagebox(''''提示'''',''''修改成功!'''')commit;case100
messagebox(''''!'''',''''修改失敗!'''')endchoosecase2returncase3returnendchoose
5.3.1模糊(分類)查詢的實(shí)現(xiàn)
圖5-4模糊查詢窗口
控件:ddlb_1事件(selectionchanged):ScriptofSelectionchanged
file://清空歷史查詢內(nèi)容em_1.selecttext(1,len(em_1.text))em_1.clear()sle_1.selecttext
(1,len(sle_1.text))sle_1.clear()//運(yùn)算符隨查詢內(nèi)容的改變而改變ifddlb_1.text=''''出版日
期''''orddlb_1.text=''''購(gòu)買日期''''thenddlb_2.deleteitem(ddlb_2.FindItem("包含",2))
ddlb_2.deleteitem(ddlb_2.FindItem("不包含",2))ddlb_2.deleteitem(ddlb_2.FindItem("小
于等于",2))ddlb_2.deleteitem(ddlb_2.FindItem("大于等于",2))ddlb_2.insertitem(''''小于
'''',3)ddlb_2.insertitem(''''大于'''',4)ddlb_2.insertitem(''''小于等于'''',5)ddlb_2.insertitem(''''大
于等于'''',6)em_1.TextColor=RGB(255,0,0)sle_1.visible=Falseem_1.SetMask(DateMask
!,''''mm/dd/yyyy'''')elseddlb_2.deleteitem(ddlb_2.FindItem("小于",2))ddlb_2.deleteitem
(ddlb_2.FindItem("大于",2))ddlb_2.deleteitem(ddlb_2.FindItem("小于等于",2))ddlb_
2.deleteitem(ddlb_2.FindItem("大于等于",2))ddlb_2.deleteitem(ddlb_2.FindItem("包含
",2))ddlb_2.deleteitem(ddlb_2.FindItem("不包含",2))ddlb_2.insertitem(''''包含'''',3)
ddlb_2.insertitem(''''不包含'''',4)sle_1.visible=Truesle_1.TextColor=RGB(255,0,0)endif
不可見(jiàn)控件:cb_2“轉(zhuǎn)換”事件(event):ClickedScriptofClicked
file://將查詢項(xiàng)轉(zhuǎn)換為表info中字段名choosecaseddlb_1.textcase''''資料名稱''''
query_item=''''name''''case''''作者''''query_item=''''author''''case''''出版社''''query_item=
''''publishing_house''''case''''出版日期''''query_item=''''publishing_date''''case''''ISBN''''
query_item=''''ISBN''''case''''資料類別''''query_item=''''sort''''case''''購(gòu)買日期''''query_item=
''''buy_date''''case''''保管人''''query_item=''''keeper''''case''''備注''''query_item=''''memo''''end
choose//將操作符轉(zhuǎn)換為中文顯示choosecaseddlb_2.textcase''''等于''''query_operator=''''=''''
case''''包含''''query_operator=''''like''''case''''不等于''''query_operator=''''<>''''case''''不包含''''
query_operator=''''notlike''''case''''小于等于''''query_operator=''''<=''''case''''大于等于''''
query_operator=''''>=''''case''''小于''''query_operator=''''<''''case''''大于''''query_operator=
''''>''''endchoose
控件:pb_1“檢索”事件(event):ClickedScriptofClicked
stringrqdatedcb_2.TriggerEvent(clicked!)//將英文操作符轉(zhuǎn)換為中文顯示dw_1.setredraw
(true)old_sql=dw_1.getsqlselect()//得到原有數(shù)據(jù)窗口的SQL語(yǔ)句ifddlb_1.text=''''出版日
期''''orddlb_1.text=''''購(gòu)買日期''''then//查詢項(xiàng)為日期類型em_1.GetData(d)//取出輸入的日期
數(shù)據(jù)rq=String(d,"yyyy/mm/dd")//將輸入的日期數(shù)據(jù)轉(zhuǎn)換為字符型choosecase
query_operator//根據(jù)操作符的不同將新產(chǎn)生的WHERE條件與老的SQL語(yǔ)句拼接成新的SQL語(yǔ)句
case''''=''''new_sql=old_sql+"where"+query_item&+""+query_operator
+''''date''''+''''(''''+"''''"+rq+"''''"+'''')''''case''''<>''''new_sql=old_sql+"where"+
query_item&+""+query_operator+''''date''''+''''(''''+"''''"+rq+"''''"+'''')''''&
+''''or''''+query_item+''''isnull''''case''''<=''''new_sql=old_sql+"where"+
query_item&+""+query_operator+''''date''''+''''(''''+"''''"+rq+"''''"+'''')''''case
''''>=''''new_sql=old_sql+"where"+query_item&+""+query_operator+
''''date''''+''''(''''+"''''"+rq+"''''"+'''')''''endchoose////查詢項(xiàng)為字符型elsesle_1.text=
Righttrim(sle_1.text)//將當(dāng)前輸入內(nèi)容右面的空格去掉choosecasequery_operator//根
據(jù)操作符的不同將新產(chǎn)生的WHERE條件與老的SQL語(yǔ)句拼接成新的SQL語(yǔ)句case''''=''''
new_sql=old_sql+"where"+query_item&+""+query_operator+"''''"+
parent.sle_1.text+"''''"case''''<>''''new_sql=old_sql+"where"+query_item
&+""+query_operator+"''''"+parent.sle_1.text+"''''"&+''''or''''+query_item+''''
isnull''''case''''like''''new_sql=old_sql+"where"+query_item&+""+
query_operator+"''''"+''''%''''+parent.sle_1.text+''''%''''+"''''"case''''notlike''''new_sql=
old_sql+"where"+query_item&+""+query_operator+"''''"+''''%''''+parent.
sle_1.text+''''%''''+"''''"&+''''or''''+query_item+''''isnull''''endchoose//endif//對(duì)原有數(shù)據(jù)
窗口進(jìn)行新的查詢ifdw_1.setsqlselect(new_sql)=-1thenbeep(3)messagebox("
警告","檢索失敗",stopsign!)elsedw_1.settransobject(sqlca)dw_1.retrieve()
dw_1.setsqlselect(old_sql)endif
圖5-5組合(條件)查詢窗口
控件:dw_2事件(event):ItemchangedScriptofItemchanged
stringitem,status,edit,result,modify_string,cur_string,c,operator1this.accepttext()
choosecasedwo.namecase''''column_name''''item=dw_2.getitemstring(dw_2.getrow()
,''''column_name'''')//根據(jù)查詢項(xiàng)目改變操作符的顯示Ifitem=''''publishing_date''''oritem=
''''buy_date''''thendw_2.setrow(dw_2.getrow())dw_2.setitem(row,''''content'''','''''''')dw_2
.setvalue(''''operator'''',1,''''等于~t='''')dw_2.setvalue(''''operator'''',2,''''不等于~t<>'''')dw_2.
setvalue(''''operator'''',3,''''小于~t<'''')dw_2.setvalue(''''operator'''',4,''''大于~t>'''')dw_2.
SetValue(''''operator'''',5,''''小于等于~t<='''')dw_2.SetValue(''''operator'''',6,''''大于等于~t>=
'''')Status=dw_2.GetValue(''''operator'''',4)elsedw_2.setrow(dw_2.getrow())dw_2.
setitem(row,''''content'''','''''''')dw_2.setvalue(''''operator'''',1,''''等于~t='''')dw_2.setvalue(
''''operator'''',2,''''不等于~t<>'''')dw_2.SetValue(''''operator'''',3,''''包含~tlike'''')dw_2.
SetValue(''''operator'''',4,''''不包含~tnot'''')Status=dw_2.GetValue(''''operator'''',4)end
if//case''''operator''''//防止操作符的顯示改變operator1=dw_2.getitemstring(dw_2.getrow()
,''''operator'''')choosecaseoperator1case''''like''''dw_2.setitem(dw_2.getrow()
,''''operator'''',''''包含'''')case''''not''''dw_2.setitem(dw_2.getrow(),''''operator'''',''''不包含'''')end
chooseendchoose
控件:pb_2“插入”事件(event):ClickedScriptofClicked
introw,new_row,istringqueryrow=dw_2.getrow()//將當(dāng)前行的行號(hào)賦值給變量//允許插入一
行的條件if(isnull(dw_2.getitemstring(row,''''column_name''''))or&isnull(dw_2.
getitemstring(row,''''operator''''))or&isnull(dw_2.getitemstring(row,''''content''''))or&
isnull(dw_2.getitemstring(row,''''join'''')))thenquery=''''no''''elsequery=''''yes''''endif//如
果允許插入,則在當(dāng)前行后插入一條新記錄ifquery=''''yes''''thennew_row=dw_2.insertrow(0
)////將光標(biāo)定位在新的一行“資料名稱”列dw_2.scrolltorow(new_row)dw_2.setrow(new_row)
dw_2.setcolumn(1)//elsemessagebox(''''警告'''',"請(qǐng)輸入完整的查詢條件",stopsign!)endif
控件:pb_3“刪除”事件(event):ClickedScriptofClicked
introw//如果當(dāng)前行不為第一行,則允許刪除ifdw_2.getrow()<>1thenrow=dw_2.getrow
()//將當(dāng)前行行號(hào)賦值給變量dw_2.deleterow(row)//刪除當(dāng)前行elsereturnendif
控件:pb_4“檢索”事件(event):ClickedScriptofClicked
Longrow_count,rowstringnew_condition,itemstringcondition[100]
,column_name,operator,content,join,operator1inti//將當(dāng)前行行號(hào)賦值給變量row=dw_2.
getrow()//將當(dāng)前行列名賦值給變量column_name=dw_2.getitemstring(row,''''column_name'''')//將
當(dāng)前行操作符賦值給變量operator=dw_2.getitemstring(row,''''operator'''')//將當(dāng)前行查詢內(nèi)容賦
值給變量content=dw_2.getitemstring(row,''''content'''')//將當(dāng)前行連接符賦值給變量(andor)
join=dw_2.getitemstring(row,''''join'''')//將查詢條件窗口的空行刪掉ifrow<>1thenif(
isnull(column_name)or&isnull(operator)or&isnull(content))thendw_2.
deleterow(row)endifendif////將查詢條件窗口的總行數(shù)賦值給變量row_count=dw_2.
rowcount()//where后的表達(dá)式fori=1torow_countitem=dw_2.getitemstring(
i,''''column_name'''')operator1=dw_2.getitemstring(i,''''operator'''')choosecaseitem//查詢項(xiàng)
為字符型case''''name'''',''''author'''',''''publishing_house'''',''''sort'''',''''isbn'''',''''keeper'''',''''memo''''if
i<>row_countthen//查詢條件有多行時(shí)choosecaseoperator1case''''not''''//操作符為不
包含condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&dw_2.
getitemstring(i,''''operator'''')+""+"like"+&"''''"+''''%''''+dw_2.getitemstring(
i,''''content'''')+''''%''''+"''''"+dw_2.getitemstring(i,''''join'''')+""case''''like''''//操作符為包含
condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&dw_2.
getitemstring(i,''''operator'''')+""+&"''''"+''''%''''+dw_2.getitemstring(
i,''''content'''')+''''%''''+"''''"+dw_2.getitemstring(i,''''join'''')+""case''''='''',''''<>''''//操作符為等于
或不等于condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&
dw_2.getitemstring(i,''''operator'''')+""+&"''''"+dw_2.getitemstring(
i,''''content'''')+"''''"+dw_2.getitemstring(i,''''join'''')+""endchooseelse//查詢條件只有一
行choosecaseoperator1case''''not''''//操作符為不包含condition[i]=dw_2.
getitemstring(i,''''column_name'''')+""+&dw_2.getitemstring(i,''''operator'''')+"
"+"like"+&"''''"+''''%''''+dw_2.getitemstring(i,''''content'''')+''''%''''+"''''"case
''''like''''//操作符為包含condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&
dw_2.getitemstring(i,''''operator'''')+""+&"''''"+''''%''''+dw_2.
getitemstring(i,''''content'''')+''''%''''+"''''"case''''='''',''''<>''''//操作符為等于或不等于
condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&dw_2.
getitemstring(i,''''operator'''')+""+&"''''"+dw_2.getitemstring(i,''''content'''')
+"''''"endchooseendif//查詢項(xiàng)為日期類型case''''publishing_date'''',''''buy_date''''ifi<>
row_countthen//查詢條件有多行時(shí)condition[i]=item+""+dw_2.getitemstring(
i,''''operator'''')+""+&"date(''''"+dw_2.getitemstring(i,''''content'''')+"'''')"+dw_2.
getitemstring(i,''''join'''')+""else//查詢條件只有一行condition[i]=item+""+dw_2.
getitemstring(i,''''operator'''')+""+&"date(''''"+dw_2.getitemstring(
i,''''content'''')+"'''')"endifendchoosenext//最終的where后的表達(dá)式new_condition=''''''''fori=1
torow_countnew_condition=new_condition+condition[i]nextold_sql1=dw_1.getsqlselect
()new_sql1=old_sql1+"where"+new_condition//對(duì)原有數(shù)據(jù)窗口進(jìn)行新的查詢dw_1.
reset()ifdw_1.setsqlselect(new_sql1)=-1thenbeep(3)messagebox("警告","檢
索失敗",stopsign!)elsedw_1.settransobject(sqlca)dw_1.retrieve()dw_1
.setsqlselect(old_sql1)endif
5.3.3更新打印模塊實(shí)現(xiàn)
圖5-6更新打印窗口
控件:pb_7“修改”事件(event):ClickedScriptofClicked
file://取消亮條顯示一行,便于進(jìn)行編輯dw_1.selectrow(dw_1.getrow(),false)//將數(shù)據(jù)窗口
屬性設(shè)為可以修改dw_1.Object.DataWindow.ReadOnly="no"dw_1.settransobject(sqlca)//將焦
點(diǎn)設(shè)置在數(shù)據(jù)窗口控件上dw_1.setfocus()//觸發(fā)dw_1的Getfocus事件dw_1.TriggerEvent(
Getfocus!)//將插入、刪除、存盤、打印按鈕全部設(shè)為可以使用pb_8.enabled=truepb_9.
enabled=truepb_10.enabled=truepb_11.enabled=true//
控件:pb_8“插入”事件(event):ClickedScriptofClicked
stringstatuslongrow//在當(dāng)前行后插入一行dw_1.ScrollToRow(dw_1.insertrow(dw_1.
getrow()))//設(shè)置焦點(diǎn)在數(shù)據(jù)窗口dw_1.setfocus()//觸發(fā)數(shù)據(jù)窗口事件dw_1.TriggerEvent(
Getfocus!)
控件:pb_9“刪除”事件(event):ClickedScriptofClicked
intanswer//將當(dāng)前行亮條顯示dw_1.selectrow(dw_1.getrow(),true)answer=messagebox("提示
!","確實(shí)刪除此記錄?",Question!,YesNoCancel!)choosecaseanswercase1file://刪
除當(dāng)前記錄dw_1.deleterow(dw_1.getrow())file://觸發(fā)dw_1的getfocus事件dw_1.
triggerevent(getfocus!)case2,3file://取消當(dāng)前行亮條顯示dw_1.selectrow(dw_1
.getrow(),false)file://將光標(biāo)定位在dw_1dw_1.setfocus()file://觸發(fā)dw_1的
getfocus事件dw_1.TriggerEvent(Getfocus!)endchoose
控件:pb_9“刪除”事件(event):ClickedScriptofClicked
intanswerlongdel_count//將數(shù)據(jù)窗口刪除記錄標(biāo)記值賦值給變量del_count=dw_1.
deletedcount()//判斷數(shù)據(jù)窗口是否有記錄標(biāo)記為刪除或者否有列被修改if(modifiedcount(
dw_1)<>0)or(del_count<>0)then//若數(shù)據(jù)窗口中記錄被改動(dòng)詢問(wèn)是否存盤answer=
messagebox("提示!","是否存盤?",Question!,YesNoCancel!)choosecaseanswercase1if
dw_1.update()=1then//如果數(shù)據(jù)窗口具有UPDATE屬性messagebox(''''提示'''',''''存盤成功!'''')
commit;endifcase2//數(shù)據(jù)窗口不具有UPDATE屬性則回滾rollback;
dw_1.ResetUpdate()dw_1.reset()//清空數(shù)據(jù)窗口dw_1.retrieve()//刷新數(shù)據(jù)窗口
dw_1.setfocus()//設(shè)置焦點(diǎn)在dw_1dw_1.TriggerEvent(Getfocus!)//觸發(fā)dw_1的
getfocus事件case3dw_1.setfocus()dw_1.TriggerEvent(Getfocus!)end
chooseendif
控件:dw_1事件(event):GetfocusScriptofGetfocus
this.setrow(this.getrow())this.setcolumn(''''name'''')//設(shè)置當(dāng)前列為“資料名稱”this.
accepttext()
控件:dw_1事件(event):LostfocusScriptofLostfocus
file://在編輯狀態(tài),接收輸入的字符this.accepttext()
控件:dw_1事件(event):ClickedScriptofClicked
stringcur_row//將當(dāng)前行賦值給變量cur_row=string(dw_1.getclickedrow())//如果數(shù)據(jù)窗口
為只讀、或至少有一條記錄則亮條顯示當(dāng)前焦點(diǎn)所在記錄ifdw_1.object.datawindow.readonly
=''''yes''''andcur_row<>''''0''''thendw_1.selectrow(getrow(),true)endif//
控件:dw_1事件(event):RowfocuschangedScriptofrowfocuschanged
stringcur_row//將鼠標(biāo)單擊選中的行號(hào)賦值給變量cur_row=string(dw_1.getclickedrow())//
數(shù)據(jù)窗口只讀或當(dāng)前行號(hào)不為零,則亮條顯示選中記錄ifdw_1.object.datawindow.readonly=
''''yes''''andcur_row<>''''0''''thendw_1.selectrow(dw_1.getrow(),true)endif//
控件:dw_1事件(event):RowfocuschangingScriptofrowfocuschanging
file://焦點(diǎn)改變時(shí)將舊焦點(diǎn)的亮條顯示取消dw_1.selectrow(dw_1.getrow(),false)
控件:dw_1事件(event):DoubleClickedScriptofDoubleClicked
integercur_row,sjstringnew_sort,cur_column,cur_textifsj_check=0thensj=0//表示按
升序排序elsesj=1//表示按降序排序endif//取消當(dāng)前行亮條顯示dw_1.selectrow(dw_1.
getrow(),false)ifsj=0thencur_text=dwo.name//將當(dāng)前雙擊對(duì)象名賦值給變量//表示只有
雙擊列標(biāo)題才實(shí)現(xiàn)排序cur_column=left(cur_text,len(cur_text)-2)//去掉列標(biāo)題的_t//按升序
排序new_sort=string(cur_column)+''''A''''dw_1.setsort(new_sort)dw_1.sort()//
sj_check=1//再次雙擊變成降序排序elsecur_text=dwo.name//將當(dāng)前雙擊對(duì)象名賦值給變量//
表示只有雙擊列標(biāo)題才實(shí)現(xiàn)排序cur_column=left(cur_text,len(
圖5-5組合(條件)查詢窗口
控件:dw_2事件(event):ItemchangedScriptofItemchanged
stringitem,status,edit,result,modify_string,cur_string,c,operator1this.accepttext()
choosecasedwo.namecase''''column_name''''item=dw_2.getitemstring(dw_2.getrow()
,''''column_name'''')//根據(jù)查詢項(xiàng)目改變操作符的顯示Ifitem=''''publishing_date''''oritem=
''''buy_date''''thendw_2.setrow(dw_2.getrow())dw_2.setitem(row,''''content'''','''''''')dw_2
.setvalue(''''operator'''',1,''''等于~t='''')dw_2.setvalue(''''operator'''',2,''''不等于~t<>'''')dw_2.
setvalue(''''operator'''',3,''''小于~t<'''')dw_2.setvalue(''''operator'''',4,''''大于~t>'''')dw_2.
SetValue(''''operator'''',5,''''小于等于~t<='''')dw_2.SetValue(''''operator'''',6,''''大于等于~t>=
'''')Status=dw_2.GetValue(''''operator'''',4)elsedw_2.setrow(dw_2.getrow())dw_2.
setitem(row,''''content'''','''''''')dw_2.setvalue(''''operator'''',1,''''等于~t='''')dw_2.setvalue(
''''operator'''',2,''''不等于~t<>'''')dw_2.SetValue(''''operator'''',3,''''包含~tlike'''')dw_2.
SetValue(''''operator'''',4,''''不包含~tnot'''')Status=dw_2.GetValue(''''operator'''',4)end
if//case''''operator''''//防止操作符的顯示改變operator1=dw_2.getitemstring(dw_2.getrow()
,''''operator'''')choosecaseoperator1case''''like''''dw_2.setitem(dw_2.getrow()
,''''operator'''',''''包含'''')case''''not''''dw_2.setitem(dw_2.getrow(),''''operator'''',''''不包含'''')end
chooseendchoose
控件:pb_2“插入”事件(event):ClickedScriptofClicked
introw,new_row,istringqueryrow=dw_2.getrow()//將當(dāng)前行的行號(hào)賦值給變量//允許插入一
行的條件if(isnull(dw_2.getitemstring(row,''''column_name''''))or&isnull(dw_2.
getitemstring(row,''''operator''''))or&isnull(dw_2.getitemstring(row,''''content''''))or&
isnull(dw_2.getitemstring(row,''''join'''')))thenquery=''''no''''elsequery=''''yes''''endif//如
果允許插入,則在當(dāng)前行后插入一條新記錄ifquery=''''yes''''thennew_row=dw_2.insertrow(0
)////將光標(biāo)定位在新的一行“資料名稱”列dw_2.scrolltorow(new_row)dw_2.setrow(new_row)
dw_2.setcolumn(1)//elsemessagebox(''''警告'''',"請(qǐng)輸入完整的查詢條件",stopsign!)endif
控件:pb_3“刪除”事件(event):ClickedScriptofClicked
introw//如果當(dāng)前行不為第一行,則允許刪除ifdw_2.getrow()<>1thenrow=dw_2.getrow
()//將當(dāng)前行行號(hào)賦值給變量dw_2.deleterow(row)//刪除當(dāng)前行elsereturnendif
控件:pb_4“檢索”事件(event):ClickedScriptofClicked
Longrow_count,rowstringnew_condition,itemstringcondition[100]
,column_name,operator,content,join,operator1inti//將當(dāng)前行行號(hào)賦值給變量row=dw_2.
getrow()//將當(dāng)前行列名賦值給變量column_name=dw_2.getitemstring(row,''''column_name'''')//將
當(dāng)前行操作符賦值給變量operator=dw_2.getitemstring(row,''''operator'''')//將當(dāng)前行查詢內(nèi)容賦
值給變量content=dw_2.getitemstring(row,''''content'''')//將當(dāng)前行連接符賦值給變量(andor)
join=dw_2.getitemstring(row,''''join'''')//將查詢條件窗口的空行刪掉ifrow<>1thenif(
isnull(column_name)or&isnull(operator)or&isnull(content))thendw_2.
deleterow(row)endifendif////將查詢條件窗口的總行數(shù)賦值給變量row_count=dw_2.
rowcount()//where后的表達(dá)式fori=1torow_countitem=dw_2.getitemstring(
i,''''column_name'''')operator1=dw_2.getitemstring(i,''''operator'''')choosecaseitem//查詢項(xiàng)
為字符型case''''name'''',''''author'''',''''publishing_house'''',''''sort'''',''''isbn'''',''''keeper'''',''''memo''''if
i<>row_countthen//查詢條件有多行時(shí)choosecaseoperator1case''''not''''//操作符為不
包含condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&dw_2.
getitemstring(i,''''operator'''')+""+"like"+&"''''"+''''%''''+dw_2.getitemstring(
i,''''content'''')+''''%''''+"''''"+dw_2.getitemstring(i,''''join'''')+""case''''like''''//操作符為包含
condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&dw_2.
getitemstring(i,''''operator'''')+""+&"''''"+''''%''''+dw_2.getitemstring(
i,''''content'''')+''''%''''+"''''"+dw_2.getitemstring(i,''''join'''')+""case''''='''',''''<>''''//操作符為等于
或不等于condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&
dw_2.getitemstring(i,''''operator'''')+""+&"''''"+dw_2.getitemstring(
i,''''content'''')+"''''"+dw_2.getitemstring(i,''''join'''')+""endchooseelse//查詢條件只有一
行choosecaseoperator1case''''not''''//操作符為不包含condition[i]=dw_2.
getitemstring(i,''''column_name'''')+""+&dw_2.getitemstring(i,''''operator'''')+"
"+"like"+&"''''"+''''%''''+dw_2.getitemstring(i,''''content'''')+''''%''''+"''''"case
''''like''''//操作符為包含condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&
dw_2.getitemstring(i,''''operator'''')+""+&"''''"+''''%''''+dw_2.
getitemstring(i,''''content'''')+''''%''''+"''''"case''''='''',''''<>''''//操作符為等于或不等于
condition[i]=dw_2.getitemstring(i,''''column_name'''')+""+&dw_2.
getitemstring(i,''''operator'''')+""+&"''''"+dw_2.getitemstring(i,''''content'''')
+"''''"endchooseendif//查詢項(xiàng)為日期類型case''''publishing_date'''',''''buy_date''''ifi<>
row_countthen//查詢條件有多行時(shí)condition[i]=item+""+dw_2.getitemstring(
i,''''operator'''')+""+&"date(''''"+dw_2.getitemstring(i,''''content'''')+"'''')"+dw_2.
getitemstring(i,''''join'''')+""else//查詢條件只有一行condition[i]=item+""+dw_2.
getitemstring(i,''''operator'''')+""+&"date(''''"+dw_2.getitemstring(
i,''''content'''')+"'''')"endifendchoosenext//最終的where后的表達(dá)式new_condition=''''''''fori=1
torow_countnew_condition=new_condition+condition[i]nextold_sql1=dw_1.getsqlselect
()new_sql1=old_sql1+"where"+new_condition//對(duì)原有數(shù)據(jù)窗口進(jìn)行新的查詢dw_1.
reset()ifdw_1.setsqlselect(new_sql1)=-1thenbeep(3)messagebox("警告","檢
索失敗",stopsign!)elsedw_1.settransobject(sqlca)dw_1.retrieve()dw_1
.setsqlselect(old_sql1)endif