局域網(wǎng)圖書(shū)資料查詢論文

時(shí)間:2022-03-13 04:49:00

導(dǎo)語(yǔ):局域網(wǎng)圖書(shū)資料查詢論文一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

局域網(wǎng)圖書(shū)資料查詢論文

摘要

本文結(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