局域網圖書資料查詢論文

時間:2022-03-13 04:49:00

導語:局域網圖書資料查詢論文一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

局域網圖書資料查詢論文

摘要

本文結合日常圖書查詢系統的實際需要,通過對C/S模式、PowerBuilder6.5開發工具、數據庫以

及SQL語言的深入學習及實踐,主要完成了局域網圖書資料查詢系統的需求分析、數據庫設計、應

用程序設計的工作。

首先,在緒論部分介紹了局域網圖書資料查詢系統的應用背景、開發環境以及選用的開發工具與

數據庫的關系,闡明了局域網的概念。并對數據庫的體系結構、DBMS進行了介紹。

第二章的開始介紹了關系型數據庫的基本概念,著重說明了幾個關鍵概念的定義;然后對SQL語言

作了一個介紹說明;最后通過兩個例子介紹了PB6.5用PowerScript語言調用SQL的方式。

第三章從特點和功能入手,介紹了開發工具PowerBuilder6.5;并且介紹了C/S模式的概念、特點

以及C/S模式與開發工具PowerBuilder6.5的聯系;在這個章節的最后簡單介紹了PB6.5對數據庫的

操作。

第四章用軟件工程的方法分析了局域網圖書資料查詢系統,對整個系統進行了需求分析、功能模

塊劃分,并通過ER圖對數據庫進行概念設計、用MicrosoftAccess對數據庫進行邏輯設計。

第五章是對局域網圖書資料查詢系統的具體設計。描述了整個系統詳細的功能模塊劃分,描述了

登錄模塊、模糊(分類)查詢、多條件(組合)查詢、數據編輯更新模塊以及數據維護模塊的實

現過程,并對設計源代碼進行了注釋分析。

設計充分利用PowerBuilder6.5的PowerScript語言對SQL語言的操作特性,靈活運用數據窗口技術

、以及PB的控件技術等,提高了程序設計質量。

關鍵詞:C/S結構,局域網,數據庫,SQL語言,PowerBuilder6.5

目錄

摘要…………………………………………………………………………………I

第一章緒論………………………………………………………………………1

§1.1數據庫應用系統開發簡介…………………………………………………1

§1.2局域網圖書資料查詢系統……………………………………………………3

§1.3本文所作工作……………………………………………………………4

第二章數據庫理論基礎……………………………………………………………6

§2.1關系型數據………………………………………………………………6

§2.2SQL語言介紹………………………………………………………………9

§2.3PB6.5對數據庫的操作………………………………………………………11

第三章PB6.5及其數據庫編程………………………………………………………13

§3.1開發工具PowerBuilder6.5……………………………………………………13

§3.2PowerBuilder與Client/Server體系結構………………………………………16

§3.3PowerBuilder6.5數據庫編程………………………………………………18

第四章局域網圖書資料查詢系統設計分析…………………………………………21

§4.1應用需求分析………………………………………………………………22

§4.2系統功能模塊劃分…………………………………………………………23

§4.3系統數據庫設計……………………………………………………………24

第五章局域網圖書資料查詢系統應用程序設計…………………………………29

§5.1系統模塊組成…………………………………………………………29

§5.2登錄模塊的實現………………………………………………………30

§5.3查詢模塊的實現……………………………………………………………33

5.3.1模糊(分類)查詢的實現………………………………………………39

5.3.2組合(條件)查詢的實現………………………………………………44

5.3.3更新打印模塊的實現…………………………………………………51

§5.4數據維護模塊的實現…………………………………………………………56

第六章結束語………………………………………………………………………63

致謝…………………………………………………………………………………64

參考書目………………………………………………………………………………65

第一章緒論

§1.1數據庫技術

數據庫技術作為數據管理技術,是計算機軟件領域的一個重要分支,產生于60年代末。現已

形成相當規模的理論體系和實用技術。優秀的數據庫設計是應用成功的基石。萬萬丈高樓平地起

,數據庫設計如同高樓的基石,是開發高品質應用的前提。

1.1.1數據庫的體系結構

數據的體系結構分成三級:內部級(Internal),概念級(Conceptual)和外部級(External)。這

個三級結構有時也稱為“三級模式結構”。

l外部級:最接近用戶,是單個用戶所能看到的數據特性。單個用戶使用的數據視圖的描述稱為

“外模式”。

l概念級:涉及到所有用戶的數據定義、是全局的數據視圖。全局視圖的描述稱為“概念模式”

l內部級:最接近于物理存儲設備,涉及到實際數據存儲的結構物理存儲數據視圖的描述稱為“

內模式”。

數據庫的三級模式結構是數據的三個抽象級別。它把數據的具體組織留給DBMS

去做,用戶只要抽象地處理數據,而不必關心數據在計算機中的表示和存儲,這樣就減輕了用戶

使用系統的負擔。

1.1.2數據庫管理系統(DBMS)

數據庫管理系統(DBMS)是指數據庫系統中管理數據的軟件系統。DBMS是數據庫系統的核心組成

部分。對數據庫的一切操作,包括定義、查詢、更新及各種控制,都是通過DBMS進行的。

在不同的計算機系統中,由于缺乏統一的標準,即使同種數據模型的DBMS,它們在用戶接口、系

統功能方面也常常是不相同的。

用戶對數據庫進行操作,是由DBMS把操作從應用程序帶到外部級、概念級、再導向內部級,進而

操作存儲器中的數據。DBMS的主要目標,是使數據作為一種可管理的資源處理。

DBMS的主要功能為:

l數據庫定義功能:DBMS提供數據定義語言(DDL)定義數據庫的三級結構,包括外模式、概念模

式、內模式及基相互之間的映象,定義數據的完整性、安全控制等約束。因此,在DBMS中應包括

DDL的編譯程序。

l數據庫的操縱功能:DBMS提供數據操縱語言(DML)實現對數據庫中數據的操作。基本的數據操

作分成兩類四種:

²檢索(查詢)

²更新(插入、刪除、修改)

l數據庫的保護功能:數據庫中的數據是信息社會的戰略資源,對數據的保護是至關重要的大事

。DBMS對數據庫的保護主要通過四個方面實現:

²數據庫的恢復:在數據庫被破壞或數據不正確時,系統有能力把數據庫恢復到正確的狀態。

²數據庫的并發控制:DBMS的并發控制子系統能防止錯誤發生,正確處理好多用戶、多任務環境

下的并發操作。

²數據庫的完整性控制:保證數據庫中數據及語義的正確性和有效性,防止任何對數據造成錯誤

的操作。

²數據庫的安全性控制:防止未經授權的用戶蓄謀或無意地存取數據庫中的數據,以免數據的泄

露、更改或破壞。

²數據庫的存儲管理:把各種DML語句轉換成低層的文件系統命令,起到數據的存儲、檢索和更新

的作用。

²數據庫的維護功能:它有許多實用程序提供給數據庫管理員:

Ø數據裝載程序

Ø備份程序

Ø文件重組織程序

Ø性能監控程序

²數據字典:數據庫系統中存放三級結構定義的數據庫稱為數據字典(DD)。對數據庫的操作都

要通過訪問DD才能實現,通常DD中還存放數據庫運行時的統計信息。

1.1.3PowerBuilder與數據庫

nPowerBuilder與數據庫是“配合”與“協調”的關系

PowerBuilder是客戶/服務器體系結構下客戶端的開發工具,用于開發客戶應用程序。這個程序首

先建立一個與數據庫的通信渠道,然后將用戶的需求以某種方式傳送給數據庫服務器。在應用程

序接收到數據庫服務器返回的數據后,它分析返回的數據并呈現給用戶。因此我們說,客戶應用

程序只完成請求和表現數據的工作,是用戶操作計算機的人機界面,大多數數據處理是由服務器

完成的。

數據庫數據器是一個存取數據和管理數據的軟件,它針對客戶的請求為客戶提供數據服務。這些

服務包括數據插入、修改和查詢等。客戶對數據庫服務器提出請求用的語言是SQL(Strucrured

QueryLanguage)。SQL是大多數數據庫服務器使用的查詢語言。

因此我們說,PowerBuilder與數據庫的關系是“配合”與“協調”的關系。PowerBuilder完成數

據請求、數據表現、菜單、界面等表象方面的工作,而數據庫服務器完成數據庫的存儲管理、并

發控制、事務管理、完整性維護、查詢優化等工作。

§1.2局域網圖書資料查詢系統

1.2.1局域網(LAN)

計算機網絡是指將多臺具有獨立功能的計算機,通過通信線路和通信設備連接起來,在網絡軟件

的支持下實現數據通信和資源共享的計算機系統。

計算機網絡的規模有大有小,大的可以覆蓋全球,小的僅局限于一個辦公室。現在一般按照網絡

覆蓋的地理范圍將計算機網絡分為三類:局域網(LAN)、城域網(MAN)、廣域網(WAN)。

局域網是覆蓋范圍在10公里以內的計算機網絡。局域網傳輸速度快,一般局限在一個單位內部,

例如一所學校或一家企業。

1.2.2應用程序開發背景

一個數十人的科研或開發小組,搜集了上千冊有用的圖書資料,其中有一部分分布在個人手中,

為了方便大家查閱,需要對每本書的狀態進行跟蹤,另新進和丟失的圖書資料必須得到及時的反

映。

1.2.3系統功能

l圖書分類查詢,多條件查詢,模糊查詢

l用戶必須登錄方能執行各種操作,允許用戶在客戶機或瀏覽器修改,添加

刪除圖書資料,實行松散管理,這建立在用戶高度自覺的基礎之上,當然也可由管理員在服務器

上直接對數據庫操作。

l能將查詢結果生成報表,并打印輸出。

1.2.4系統運行環境

該系統采用Client/Server模式進行設計:局域網中有一臺服務器,其上運行服務器程序,操作系

統為windows2000server,客戶機操作為Windows98,其上運行客戶端程序。

1.2.5系統開發工具

該系統采用PowerBuilder6.5進行開發,數據庫服務器端為SQLAnywhere5.0Server;客戶端則

為SQLAnywhereclient,整個系統在SQLAnywhereLocal端調試完成。

§1.3本文所作工作

首先,在緒論部分介紹了局域網圖書資料查詢系統的應用背景、開發環境以及選用的開發工具與

數據庫的關系,闡明了局域網的概念。并對數據庫的體系結構、DBMS進行了介紹。

第二章的開始介紹了關系型數據庫的基本概念,著重說明了幾個關鍵概念的定義;然后對SQL語言

作了一個介紹說明;最后通過兩個例子介紹了PB6.5用PowerScript語言調用SQL的方式。

第三章從特點和功能入手,介紹了開發工具PowerBuilder6.5;并且介紹了C/S模式的概念、特點

以及C/S模式與開發工具PowerBuilder6.5的聯系;在這個章節的最后簡單介紹了PB6.5對數據庫的

操作。

第四章用軟件工程的方法分析了局域網圖書資料查詢系統,對整個系統進行了需求分析、功能模

塊劃分,并通過ER圖對數據庫進行概念設計、用MicrosoftAccess對數據庫進行邏輯設計。

第五章是對局域網圖書資料查詢系統的具體設計。描述了整個系統詳細的功能模塊劃分,描述了

登錄模塊、模糊(分類)查詢、多條件(組合)查詢、數據編輯更新模塊以及數據維護模塊的實

現過程,并對設計源代碼進行了注釋分析。

最后,在結束語的總結部分指出了系統的亮點以及不足之處。簡單介紹了自己開發過程中的體會

與心得:在摸索中實踐,在實踐中摸索。

第二章數據庫理論基礎

§2.1關系型數據庫

2.1.1關系模型的基本概念

用二維表格結構表示實體集,外鍵表示實體間聯系的數據模型稱為關系模型。

1.二維表格

表2-1是一張職工登記表,這是二維表格

工號姓名年齡性別工資

0001Zhang26男1000

0002Li25女1500

0003Liu29男1000

0004Wang22女1500

表2-1二維表格實例

為簡單起見,對表格數學化,用字母表示表格的內容。表2-1可用圖2-1表示:

ABCDE

A1A2A3A4B1B2B3B4C1C2C3C4D1D2D3D4E1E2E3E4

2.鍵(KEY)

鍵由一個或幾個屬性組成,在實際使用中,有下列幾種鍵:

1)超鍵(SuperKey):在關系中能惟一標識元組的屬性集稱為關系模式的超鍵。

2)候選鍵(CandidateKey):不含有多余屬性的超鍵稱為候選鍵。也就是在候選鍵中,若要再刪

除屬性,就不是鍵了。

3)主鍵:(PrimaryKey):用戶選作元組標識的一個侯選鍵稱為主鍵。一般,如不加說明,則鍵

是指主鍵。

3.關系的定義和性質

我們可以用集合的觀點定義關系。關系是一個元數為K(K>=1)的元組的集合。

把關系看成是一個集合,集合中的元素是元組,每個元組的屬性個數應相同。在關系模型中,對

關系作了下列規范性限制:

1)關系中每一個屬性值都是不可分解的。

2)關系中允許出現相同的元組(沒有重復元組)

3)由于關系是一個集合,因此不考慮元組間的順序,即沒有行序。

4)元組中,屬性在理論上也是無序的,但在使用時按習慣考慮列的順序。

2.1.2數據庫的設計理論

關系數據庫的設計理論主要包括三個方面的內容:數據依賴、范式,模式設計方法。其中數據依

賴起著核心的作用。

1.函數依賴(Functionaldependency,FD)的定義

設R(U)是一個關系模式,U是R的屬性集合,X和Y是U的子集。對于R(U)的任何一個可能的關系r,

如果r中不存在兩個元組,它們在X上的屬性值相同,而在Y上的屬性值不同,則稱“Y函數依賴于X

”,記作X→Y。如果X→Y,并且對于X的任一真子集X’,都有Y不函數依賴于X’,則稱“Y完

全函數依賴于X”,記作XfY。若X→Y,但Y不完全函數依賴于X,則稱“Y部分函數依賴于X”

,記作XPY。如果X→Y,Y→Z,且Y≮X,X不函數依賴于Y,則稱“Z傳遞函數依賴于X”。

2.范式

在對表的形式進行了規范化定義后,數據結構還有五種規范化定義,定名為規范化模式,稱為范

式。在這五種范式中,一般只用前三種,對于常用系統就足夠了。而且這五種范式是“向上兼容

”的,即滿足第五范式的數據結構自動滿足一、二、三、四范式,滿足第四范式的數據結構自動

滿足第一、二、三范式,……,依此類推。

第一范式(firstnormalform,簡稱1stNF)就是指在同一表中沒有重復項出現,如果有則應將重

復項去掉。這個去掉重復項的過程就稱之為規范化處理。在本文所討論的開發方法里,1stNF實

際上是沒有什么意義的。因為我們按規范化建立的指標體系和表的過程都自動保證了所有表都滿

足1stNF。

第二范式(secondnormalform,簡稱2ndNF)是指每個表必須有一個(而且僅一個)數據元素為主

關鍵字(primarykey),其它數據元素與主關鍵字一一對應。例如,在圖l9.7中如果我們將合同號

定義為主關鍵字(其它數據元素中的記錄數據都有可能重名,故不能作為主關鍵字),故只要知道

了一個合同記錄的合同號,就可以唯一地在同一行中找到該合同的任何一項具體信息。通常我們

稱這種關系為函數依賴(functionaldepEndence)關系。即表中其它數據元素都依賴于主關鍵字,

或稱該數據元素唯一地被主關鍵字所標識。

第三范式(thirdnormalform,簡稱3rdNF)就是指表中的所有數據元素不但要能夠唯一地被主

關鍵字所標識,而且它們之間還必須相互獨立,不存在其它的函數關系。也就是說對于一個滿足

了2ndNF的數據結構來說,表中有可能存在某些數據元素依賴于其它非關鍵宇數據元素的現象,

必須加以消除。

為防止數據庫出現更新異常、插入異常、刪除異常、數據冗余太大等現象,關系型數據庫要盡量

按關系規范化要求進行數據庫設計。下面以教務管理信息系統為例來進行分析。

3.模式設計方法

一個好的模式設計方法應符合下列三條原則:

l表達性:涉及到兩個數據庫模式的等價性問題,即數據等價和依賴等價,分別用無損聯接和保

持函數依賴來衡量。

l分離性:是指屬性間的“獨立關系”應該用不同的關系模式表達。獨立聯系是我們所考慮的“

基本信息單位”。實際上分離就是清除存儲異常和數據冗余現象。如果能達到這個目的,就分離

。分離的基準就是一系列范式,分離與依賴等價有時是不可兼容的。

l最小冗余性:要求在分解后的數據庫能表達原來數據庫的所有信息這個前提下實現。目的就是

節省存儲空間,提高對關系的操作效率,清除不必要的冗余。但要注意,在實際使用中,并不一

定要達到最小宙余。因為有時帶點冗余對于查詢處理是有好處的。

關系模式的方法基本上可以分為分解與合成兩大類。分解型算法要求輸入一個

初始模式集和依賴集,而結果滿足數據等價要求。對于合成型算法只要求輸入初始依賴集,結果

滿足依賴等要求。但它們依據的基本思想是共同的,即獨立的聯系獨立表示。

§2.2SQL語言介紹

SQL(StructuredQueryLanguage)即“結構式查詢語言”。SQL雖然名為查詢語

言,但實際上具有定義、查詢、更新和控制等多種功能。由于它使用方便、功能豐富、語言簡單

易學,很快得到應用和推廣。從20世紀70年代末起,在推出的關系數據庫系統產品ORACLE、SQL/

DS、DB2、SYBASE上實現了SQL語言。很快,SQL語言被整個計算機界認可。1987年6月,國際標準

化組織(ISO)采納為國際標準。隨后,ISO對標準進行了大量的修改和擴充。在1992年推出了新

的標準-SQL2。SQL的標準化工作還在繼續,新的標準已被命名為SQL3,將包括許多新的數據庫概

念,正在不征求意見和進行修改

這里將簡單介紹基于SQL89和SQL2的語言使用概貌:

2.2.1SQL的組成

SQL主要分成四個部分:

1)數據定義:這一部分也稱為“SQLDDL”,用于定義SQL模式、基本表、視圖和索引。

2)數據操縱:這一部分也稱為“SQLDML”。它分為數據查詢和數據更新兩類。其中數據更新又

分成插入、刪除、和修改三種操作。

3)數據控制:這一部分包括對基本表和視圖的授權,完整性規則的描述,事務控制等內容。

4)嵌入式SQL的使用規定:這一部分內容涉及到SQL語句嵌入在宿主語言程序中使用的規則。

2.2.2SQL的數據查詢

nSELECT語句的語法

SELECT目標表的列名或列表達式序列

FROM基本表和(或)視圖序列

[WHERE行條件表達式]

[GROUPBY列名序列

[HAVING組條件表達式]]

[ORDERBY列名[ASC|DESC]…]

句法中[]表示該成分可有,也可無。

整個語句的執行過程如下:

a)讀取FROM子句中基本表、視圖的數據,執行笛卡爾積操作。

b)讀取滿足WHERE子句中給出的條件表達式的元組。

c)按GROUP子句中指定列的值分組,同時提取滿足HAVING子句中組條件表達式的那些組。

d)按SELECT子句中給出的列名或列表達式求值輸出。

e)ORDER子句對輸出的目標表進行排序,按附加說明ASC升序排列,或按DESC降序排列。

SELECT語句中,WHERE子句稱為“行條件子句”,GROUP子句稱為“分組

子句”,HAVING子句稱為“組條件子句”,ORDER子句稱為“排序子句”。

2.2.3SQL的數據更新

SQL的數據更新包括數據插入、刪除和修改等三種操作

1)數據插入

a)元組值的插入

INSERTINTO基本表名(列名表)

VALUES(元組值)

或者INSERTINTO基本表名(列名表)

(TABLE(元組值),

(元組值),

……)

前一種格式只能插入一個元組,后一種格式可以插入多個元組。

2)數據刪除

SQL的刪除操作是指從基本表刪除元組,其語法如下:

DELETEFROM基本表名

[WHERE條件表達式]

其語義是從基本表中刪除滿足條件表達式的元組。

3)數據修改

當需要修改基本表中元組的某些列值時,可以用UPDATE語句實現,其句法如下:

UPDATE基本表名

SET列名=值表達式[,列名=值表達式…]

[WHERE條件表達式]

其語義是:修改基本表中滿足條件表達式的那些元組中的列值,需修改的列值在SET子句中指出。

§2.3PB6.5對數據庫的操作

PowerBuilder對數據庫的操作即可以通過數據窗口完成(本質上是數據窗口把在屏幕上對數據

庫的操作轉化成SQL語句),又可以在PowerScript語言中直接調用SQL或存儲過程(本質上仍是SQL

語句)完成。下面通過列舉兩個簡單實例來描述在PowerScript程序調用SQL的方式:

1、SELECT語句查詢返回一行

如果SQLSELECT語句返回的結果只有一行,可以在PowerScript中書寫以下的SQL語句:

SELECT列名1,列名2,列名3,…

INTO:變量1,:變量2,:變量3…

FROM表名1,表名2,表名3,…

WHERE…

其中,“變量1”,“變量2”和“變量3”等都是PowerScript語言的變量。該語句的作用是把數

據庫表的“列名1”,“列名2”和“列名3”等列的值從數據庫中取出,然后放入對應的“變量1

”,“變量2”和“變量3”等變量中。例如:

Stringname,extrace

SELECTname,extractINTO:name,:extracefromauths

Whereauthor_code=’A00001’;

該語句僅僅適合于查詢到一條記錄的情況。如果查詢到的記錄是多條,則要用下面的方法。

2、查詢多行

SELECT是描述型語言,它面向的是集合,是一組記錄。而PowerScript語言卻是面向過程的,它要

一條條地接收并處理記錄。PowerScript通過描述型光標(CURSOR)在這組記錄上游動的方法,給

Script語句逐個地傳送記錄,建立了集合與記錄間的內在聯系。請看下例:

Stringname

StringV1=’A%’

DECLARECURSORFORfile://定義光標,光標名為C1

SELECTnameFROMauthsfile://光標對應的SELECT語句

WHEREauthor_codelike:V1;file://SELECT語句中用到了變量V1

OPENC1;//打開光標,此時執行此光標對應的SQLSELECT語句。

Lab1:

FETCHC1INTO:name;file://取記錄,光標下移一條

IfSQLCA.SQLCode=0thenfile://取記錄成功

Gotolab1file://如果成功取出記錄,則取下一條

Endif

打開光標的時候,變量V1被其值“A%”替換,因此最后執行的SQLSELECT語句為:

SELECTnameFROMauths

WHEREauthor_codelike‘A%’

執行完這條語句后,把光標C1定位到了查詢出的第一條記錄上。每執行一次語句:

FECTCHC1INTO:name;

則取出一條記錄送給變量name,然后光標移到下一條記錄。如果想控制查詢結果的次序,必須在

SELECT語句中用ORDERBY子句,否則,沒有其它的辦法。我們不可能一下子把光標定位在某條記

錄上,只能從第一條開始,一個個地移。

第三章PB6.5及其數據庫編程

§3.1開發工具PowerBuilder6.5

3.1.1PowerBuilder6.5特點及功能

要適應企業環境不斷變化的需求,成功地開發出高質量的應用系統,必須采用先進的應用開發工

具。這對于減輕應用開發人員的開發負擔,提高開發速度和質量都有十分重要的意義。Sybase公

司推出的PowerBUilder6.0/6.5是用于Client/Server、Web及組件開發的企業級應用開發工具。它

占全球開發工具市場近50%,是當前最優秀的開發工具之一。它具有以下優異的功能和特點:

1、內置的關系數據庫

PowerBuilder本身帶有一套數據庫系統SybaseSQLAnywhere。這樣做的好處是,PowerBuilder

可以脫離網絡數據庫服務器獨立運行,從而在開發階段脫離網絡服務器上的數據庫。當然,利用

這一功能也可以開發和調試單用戶的獨立的數據庫應用。下圖顯示了內置數據庫的工作原理:

如果沒有內置的數據庫SybaseSQLAnywhere,開發時則不能脫離網絡服務器上的數據庫(如圖3

-2所示):

2、數據窗口(Datawindow)對象

PowerBuilder擁有數據窗口這個具有專利技術的智能對象,利用該對象可以操作關系數據庫的數

據而無需編寫SQL語句。用戶可以查詢、修改、插入、刪除、瀏覽、打印、以多種文件格式打開和

存儲數據,或在數據窗口中直接定義功能按鈕實現預定義的系統功能,如插入、刪除數據的操作

。它還支持數據庫事務管理和并發控制等機制。其工作機理如下圖所示:

3、豐富的數據窗口數據源和多種樣式的數據顯示格式

數據窗口可以用來維護數據和顯示數據,可定義多種顯示風格和數據顯示格式;并且還可以與

TreeView控制、ListView控制配合使用,創建出更豐富的數據顯示格式

4、支持多種商業圖形,包括多種類型的二維和三維的圖形

5、支持組件的開發和調用

用PowerBuilder開發的組件,可以在其它應用中調用,可以由多種事務管理服務器管理。

6、具有面向對象的特征

PowerBuilder采用了面向對象的開方式,這可以使系統開發人員在無需精通專用語言的情況下就

可以迅速轉向面向對象的開發。PowerBuilder應用是由一系列對象組成的,包括窗口、菜單、函

數、數據窗口和各種控制等對象,它支持對象的繼承、封裝和多態性。

7、有機結合的集成開發環境

8、完全支持Windows的窗口信息和控制

9、強有力的PowerScript編程語言

它能使開發人員很容易地將簡單或復雜的事務邏輯與應用相配合。該語言還有幾百個函數用于操

縱對象、處理數字、文本、字符串、日期和應用分布,進行文件處理、報表打印,用DDE和OLE2

.0進行程序之間的通信,直接調用SQL語句操縱數據庫等等。

10、PowerBuilder提供了多種流行軟件的接口庫

NetwareLibrary

PenComputingLibrary

LotusNotesLibrary

MicrosoftMAPI

11、PowerBuilder支持多種平臺

目前,PowerBuilder能夠在MicrosoftWindows3.X、Windows95WindowsNTAlpha/IntelApple

MacSunSalorisIBMAIXHPUnix等多種平臺上開發和運行應用程序,并能夠不加改動地應用于

其它平臺上。

12、支持Internet/Intranet下的Web應用開發

13、支持團體開發

14、對多種數據庫的支持

PowerBuilder幾乎支持所有的數據庫,它提供了到多種數據庫的專用接口和ODBC接口。

§3.2PowerBuilder與Client/Server體系結構

3.2.1Client/Server模式

在C/S結構中,存在著幾個非常重要的基本概念,它們是:主機、終端、客戶機、工作站和服務器

。在分析C/S網絡結構之前,必須搞清楚它們之間的區別。

最早的計算機網絡是伴隨著主機(Host)和終端(Terminal)這兩個概念的出現而產生的。當時的

主機通常是指具有中央處理單元(CPU)的大型機或功能較強的小型機,而終端則是指計算機的輸

入輸出設備。終端沒有自己的CPU,當然也沒有自己的內存,其主要功能是將鍵盤輸入的請求數據

發往主機并將主機的運算結果顯示出來。主機和終端共同構成了集中式系統結構。在這種應用系

統中,幾乎所有的工作都是由主機來完成,終端僅僅作為一種輸入輸出設備,因此系統負荷重、

效率低、擴充性差。

之后隨著計算機網絡結構的細化,不同的計算機開始在網絡中擔負不同的任務,于是出現了文件

服務器/網絡工作站(F/W)式結構的模型。其中,工作站(Workstation)和服務器(Server)都

是獨立的計算機。當一臺連入網絡的計算機向其它計算機(工作站)提供各種網絡服務(如數據

、文件的共享)時,它就被叫做服務器。而那些用于訪問服務器資料的計算機則被叫做工作站。

在F/W結構中,所有實際的數據處理工作仍在運行數據庫應用程序的PC工作站上完成,因此不論文

件服務器的性能有多高,其整體網絡性能都將受到PC機能力的限制。

客戶機(Client)是伴隨C/S數據訪問的興起而被提出來的,在一般人的理解中它和F/W概念沒有

本質的區別。但是,嚴格說來,C/S模型并不是從物理分布的角度來定義的。它既包括具體的網絡

結構設計,又包括軟件的運行和組織,所體現的是一種網絡數據的訪問方式。這里的客戶機和服

務器不僅指承擔不同任務的計算機本身,而且包括主機上運行的客戶端和服務器端的軟件環境。

它們的區別,是相對于各自在網絡數據庫訪問中所處的地位或實現的功能而言的。

理解了以上的基本概念,才可以更好地理解C/S結構的實質和運行方式:所謂C/S結構,是將數據

存取與應用程序分離開來,把一個軟件系統或應用系統按功能分成若干個部分,再將這些軟件的

組成部分按其不同的角色分成Client軟件和Server軟件,分別放置在客戶機和服務器上。客戶機

程序負責用戶交互界面、數據表示及應用處理邏輯等應用部分,而服務器端則負責數據存取管理

、完整性控制及并發控制等數據庫管理部分。客戶機程序應用通過SQL語句訪問數據庫,相應的

SQL語句經網絡傳輸到服務器端,由服務器端的數據庫服務器解釋執行這些SQL語句,執行后的結

果數據送回客戶機。

3.2.2Client/Server體系結構的優缺點

我們看到,客戶/服務器體系結構有以下優點:

l應用邏輯與數據實現分離,實現了在網絡上的負載均衡;

l充分利用了網絡服務器的處理能力。客戶中需將請求送數據庫服務器,數據查詢工作由服務器

來承擔,服務器的能力可以得到充分的發揮。

但是它也有以下一些缺點:

l由于計算機技術的快速進步和企業需求變化的加快,企業面臨的硬件、網絡操作系統、數據庫

系統、開發工具、應用系統的升級周期越來越短,因此“維護”客戶服務器的費用就變得越來越

高昂。

l快速升級的硬件、網絡操作系統、數據庫系統、開發工具使企業的技術人員失去了方向:不斷

地消化新技術,卻無瑕顧及企業要解決的問題

l在客戶端,必須安裝操作系統(一般為Windows95/NT)、網絡軟件、特定的中間件(Sybasse

Net-Library)以及應用軟件系統才能工作,因此應用系統的安裝、升級和維護通常需要專業人員

才能用勝任,且必須各站點逐個安裝,從而使客戶端的維護費用變得也很高昂。對主機系統來說

,這一點要優越的多,只需要在主機上安裝一次即可。

3.2.3PowerBuilder是客戶/服務器體系結構下客戶端的開發工具

前面已提到,PowerBuilder是客戶/服務器體系結構下開發客戶程序用的開發工具,用

PowerBuilder開發出的程序可以存取數據庫中的數據。下圖表示了PowerBuilder與數據庫配合工

作的方式。

我們看到,PowerBuilder作為客戶端的應用開發工具,主要完成的是表示邏輯方面的工作,例如

,菜單、錄入界面。而數據庫服務器管理的是事務邏輯和數據存取方面的工作。因此,

PowerBuilder開發工作應分為兩部分,一部分是前臺表示邏輯方面的工作,另一部分是數據庫后

臺方面的設計工作(如數據庫觸發器、存儲過程和視圖等的設計)。一個好的應用系統,前臺開

發與后設計應是有機結合、合理分布的;良好的后臺設計可以降低前臺的開工作量,提高系統的

運行效率。

§3.3PowerBuilder6.5數據庫編程

PowerBuilder與數據庫的關系是“配合”與“協調”的關系。PowerBuilder完成數據請求、數據

表現、菜單、界面等表象方面的工作,而數據庫服務器完成數據庫數據的存儲管理、安全管理、

并發控制、事務管理、完整性維護、查詢優化等工作。

PowerBuilder在操作數據庫時與以下幾方面有關:

1、在數據庫畫筆中定義數據庫表和視圖

l定義表的結構

l表中列的擴展屬性

²定義表中列的顯示風格

²定義表中列的編輯屏蔽

²定義表中列的校驗

l定義表的主鍵

l定義表的外部鍵

l定義表的索引

PowerBuilder有五個系統表,這五個系統表是PowerBuilder初次連接到數據庫時系統自動建立的

。下表給出了這個系統表的表名和它們的作用

PowerBuilder系統表用途

PBCATTBL存放表或視圖,表或視圖中列的缺省字體。

PBCATCOL存放列用到的顯示風格名、校驗規則名和編輯風格名;列的標題、列的標簽、字體的大

小寫,字體的對齊方式。

PBCATFMT列的顯示風格定義。

PBCATVLD列的校驗規則定義。

PBCATEDT列的編輯風格定義。

表3-1PowerBuilder系統表

2、在數據庫畫筆中在圖形方式下操作數據庫

這些操作包括:

l插入記錄

l修改記錄

l刪除記錄

l查詢記錄

l把查詢出的記錄存入文件

l把表或視圖的定義轉變成建表的SQL語名

這些功能是給開發人員和管理人員提供的。

3、在數據庫畫筆中用SQL語句執行平臺管理操作數據庫

l生成數據庫

l管理數據庫

l維護數據

在這里創建的表和規則不會記錄在PowerBuilder系統表中

4、在查詢畫筆中定義查詢對象

如果一個查詢動作要多次使用,還可以用PowerBuilder的查詢畫表生成查詢對象這個查詢對象不

能由數據庫畫表調用,它只能由查詢畫表本身調用執行。在建立數據窗口時,數據源也可以做在

查詢對象之上。

事實上,查詢對象就是寫好了的SQL語句,它存在PowerBuilder的pbl文件中,在使用的時候調用

即可。

5、用數據管道在不同數據庫之間轉換數據

數據管道允許把一個數據庫的數據(一個或多個表中的全部或部分行)轉入到

另一個數據庫的一個表中(這個表可以存在或不存在),從而可以使數據在不同數據庫之間相互

復制。

6、用數據窗口操作數據庫

Datawindow是PowerBuilder操作數據庫的重要的手段,通過數據窗口可以查

修改、插入和刪除數據庫的數據。PowerBuilder數據窗口操作數據庫的能力非常強,是

PowerBuilder的精華所在。

l數據窗口的數據源可以是:

²表或視圖

²多表連接

²查詢對象

²外部數據源

²存儲過程

l數據窗口列數據的顯示風格

l數據窗口列的編輯屏蔽

l數據窗口列的校驗

7、PowerScript直接調用SQL語句操作數據庫

PowerBuilder對數據庫的操作即可以通過數據窗口完成(本質上是數據窗口屏幕上對數據庫的操作

轉化成SQL語句),又可以在PowerScript語言中直接調用SQL或存儲過程(本質上仍是SQL語句)完成

。詳細操作在第*個章節已經介紹。

第四章局域網圖書資料查詢系統設計分析

根據數據庫系統生存期的設計方法,從數據庫應用系統和開發的全過程來考慮,將數據庫應用系

統設計分為以下幾個階段(見圖4-1)

1)規劃;

2)需求分析;

3)概念設計;

4)邏輯設計

5)物理設計

§4.1應用需求分析

要設計一個良好的局域網圖書資料查詢系統,就必須首先明確該應用環境對系統的要求。局域網

圖書資料查詢系統的應用背景為:一個數十人的科研或開發小組,搜集了上千冊有用的圖書資料

,其中有一部分分布在個人手中,為了方便大家查閱,需要對每本書的狀態進行跟蹤,另新進和

丟失的圖書資料必須得到及時的反映。因此,該系統需滿足以下幾方面需求:

l用戶的管理:必須具有使用權限的用戶才能成功登錄到系統中來。所謂用戶權限在這里并不要

求有功能上具體的劃分,集中實行松散管理,這建立在用戶高度自覺的基礎上。所以,在這里只

需給每個需要使用系統的人一個用戶名和密碼,即可登錄系統進行各種操作。新的用戶需要取得

管理員的許可將其加入系統,加入系統的用戶可以對自己的用戶密碼進行修改。

l查詢功能:系統需要提供幾種不同方式的查詢手段,以實現靈活方便地管理整個系統。

²圖書分類查詢:一本圖書包括書名、出版社、作者、保管人等多個信息,這就要求系統能按照

不同的信息類別對圖書進行查詢。比如說,按書名查詢、按作者查詢等。選定需要的查詢信息類

別,再輸入想查詢的內容即可查詢到相關的圖書信息。

²多條件查詢:很多時候,用戶需要了解的信息不僅僅局限于一個條件,比方說想同時查詢書名

為“數據庫原理”但出版社僅為“經濟科學出版社”的圖書信息時,單純的分類查詢就不能滿足

用戶的需要,這時就要用到多條件查詢。也就是說,多條件查詢不僅可以實現單個的分類查詢,

還可以實現多條分類查詢的組合查詢。每個查詢條件之間用“并且”或“或者”的關系關聯起來

組成完整的查詢條件。

²模糊查詢:對于用戶來說并不一定完全記得某本圖書準確的名稱,類似,對于作者、出版社等

等信息來說,很多時候用戶只是記得一些相關的信息而不是一字不差的準確信息。這個時候就要

用到模糊查詢。用戶輸入查詢內容后,系統將會把包含查詢內容的(注意:并不是精確的等于查詢

內容)所有相關圖書信息顯示出來,以使用戶得到準確的、自己真正需要的信息內容。

l更新與編輯:

²更新:系統允許用戶對查詢到的內容進行修改并且存盤。

²編輯:系統允許用戶對現庫進行插入、刪除的操作,保證現庫的真實性與實時性。

l打印輸出:系統可以將用戶查詢到的內容動態地生成報表,并打印輸出。

§4.2系統功能模塊劃分

局域網圖書圖書資料查詢系統功能劃分模塊圖如下:

§4.3系統數據庫設計

4.3.1概念設計

概念設計的目標是產生反映局域網圖書資料查詢系統需求的數據庫概念結構,即概念模式。概念

模式是獨立于數據庫邏輯結構,獨立于支持數據庫的DBMS,不依賴于計算機系統的。

lER模型

ER模型是對現實世界的一種抽象。它的主要成分是實體、聯系和屬性。使

用這三種成分,我們可以建立許多應用環境的ER模型。

lER模型的操作

在利用ER模型進行數據庫概念設計的過程中,常常需要對ER圖進行種種

變換。這些變換又稱為ER模型的操作,包括實體類型、聯系類型和屬性的分裂、合并和增刪等等

l利用ER方法的數據庫概念設計

利用ER方法進行數據庫的概念設計,可以分成三步進行:首先設計局部ER

模式,然后把各局部ER模式綜合成一個全局ER模式,最后對全局ER模式進行優化,得到最終

的ER模式,即概念模式。

1.設計局部的ER模式

通常,一個數據庫系統都是為多個不同用戶服務的。各個用戶對數據的觀點可能不一樣,信息處

理需求也可能不同。在設計數據庫概念結構時,為了更好地模擬現實世界,一個有效的策略是“

分而治之”,即先分別考慮各個用戶的信息需求,形成局部概念結構,然后再綜合成全局結構。

在ER方法中,局部概念結構又稱為局部ER模式,其圖形表示稱為ER圖。

實體和屬性的定義如下:

圖書(資料編號,資料名稱,作者,出版社,出版日期,ISBN,資料類別,購買日期,保管人,

備注)

用戶(編號,用戶代碼,用戶姓名,登錄口令,使用權限,查詢顯示項,用戶顯示頭像)

資料類別(資料編號,資料類別)

出版社(出版社編號,出版社)

2.聯系定義:

ER模型的“聯系”用于刻畫實體之間的關聯。一種完整的方式是對局部結構中任意兩個實體類型

,依據需求分析的結果,考察局部結構中任意兩個實體類型之間是否存在聯系。若有聯系,進一

步確定是1:N,M:N,還是1:1等。還要考察一個實體類型內部是否存在聯系,兩個實體類型之間是

否存在聯系,多個實體類型之間是否存在聯系,等等。聯系定義如圖4-5所示。解釋如下:

l一個用戶可以保管多本圖書資料,而一本圖書資料只能由一個用戶保管;

l一個資料類別可以對應多本圖書,而一本圖書只對應一個資料類別;

l一本圖書由一個出版社出版,而一個出版社可以出版多種圖書。

3.設計全局ER模式

所有局部ER模式都設計好了后,接下來就是把它們綜合成單一的全局概念結構。全局概念結構不

僅要支持所有局部ER模式,而且必須合理地表示一個完整、一致的數據庫概念結構。

1)確定公共實體類型

為了給多個局部ER模式的合并提供開始合并的基礎,首先要確定各局部結構中的公共實體類型。

在這一步中我們僅根據實體類型名和鍵枕認定公共實體類型。一般把同名實體類型作為公共實體

類型的一類候選,把具有相同鍵的實體類型作為公共實體類型的另一類候選。

2)局部ER模式的合并

合并的原則是:首先進行兩兩合并;先和合并那些現實世界中有聯系的局部結構;合并從公共實

體類型開始,最后再加入獨立的局部結構。

3)消除沖突

沖突分為三類:屬性沖突、結構沖突、命名沖突。

設計全局ER模式的目的不在于把若干局部ER模式形式上合并為一個ER模式,而在于消除沖突,使

之成為能夠被所有用戶共同理解和接受的同一的概念模型。

3)全局ER模式的優化

在得到全局ER模式后,為了提高數據庫系統的效率,還應進一步依據處理需求對ER模式進行優化

。一個好的全局ER模式,除能準確、全面地反映用戶功能需求外,還應滿足下列條件:實體類型

的個數要盡可能的少;實體類型所含屬性個數盡可能少;實體類型間聯系無冗余。

4.3.2邏輯設計

由于概念設計的結果是ER圖,DBMS一般采用關系型,因此數據庫的邏輯設計過程就是把ER圖轉化

為關系模式的過程。由于關系模型古有的優點,邏輯設計可以充分運用關系數據庫規范化理論,

使設計過程形式化地進行。設計結果是一組關系模式的定義。

1)導出初始關系模式

圖4-5關系模式集

2)關系子模式

子模式是用戶所用到的那部分數據的描述。除了指出用戶用到的數據外,還應指出數據與概念模

式中相應數據的聯系,即指出概念模式與子模式之間的對應性。

圖書信息子模式((編號#,資料名稱,作者,出版社,出版日期,ISBN,資料類別,購買日期

,保管人,備注)用戶信息子模式(編號,用戶代碼,用戶姓名,登錄口令,使用權限,查詢顯

示項,用戶顯示頭像)

圖4-6部分子模式

4.3.3數據庫的實現

我們選用MicrosoftOffice中的Access數據庫來進行數據庫的邏輯設計。首先創建四個基本數據

庫表如如4-1-4-5所示,然后建立各個表之間的聯系,如圖4-8所示。

第五章局域圖書資料查詢系統應用程序設計

§5.1系統模塊組成

§5.2登錄模塊實現

圖5-2登錄模塊圖

該窗口所含的控件信息如下:

風格控件名說明

用戶名SinglelineeditSle_1------

口令SinglelineeditSle_1Propeties:passwd

登錄日期EditMaskEm_1masktype:datamm/dd/yyyy

表5-1登錄模塊控件信息表

控件:Sle_1事件(event):ModifiedScriptofmodified:

stringinput_code,namesetfocus()file://將光標定位在該控件

input_code=string(this.text)file://接收用戶輸入的值,并賦值給變量selectnameinto

:namefromkeeperwhereid=:input_codeorpym=:input_code;//從用戶表里查找滿足輸入條件

的記錄ifsqlca.sqlcode=0thenthis.Text=namesetfocus(sle_2)file://查找成功,則光

標跳轉到“口令”控件elseifsqlca.sqlcode=100thenmessagebox("提示!",&"對不起,

用戶不存在!",&StopSign!)return1file://查找不到符合條件的記錄則提示else

messagebox("錯誤!",&"error:"+string(sqlca.sqldbcode)&+"information:"+sqlca.

sqlerrtext)file://SQL出錯提示endifendif

控件:Sle_2事件(event):ModifiedScriptofmodified:

stringinput_passwd,passwd,droitinput_passwd=RightTrim(this.text)//去掉輸入值右邊的空

格selectpasswdinto:passwdfromkeeperwherename=:sle_1.text;passwd=RightTrim(

passwd);//從用戶表中校驗口令的正確性ifsqlca.sqlcode=0thenifinput_passwd<>

passwdthenmessagebox(''''口令錯誤'''',''''對不起,請重新輸入'''',stopsign!);sle_2.

SelectText(1,Len(sle_2.Text))this.Clear()//口令錯誤則清除輸入內容setfocus

(sle_2)elseifinput_passwd=passwdthenuser=righttrim(sle_1.text)selectdroit

into:droitfromkeeperwherename=:user;//口令正確將用戶操作權限賦值給變量

open(main)//打開程序主窗口close(w_login)//關閉登錄窗口endifelseif

sqlca.sqlcode=100thenmessagebox(''''提示!'''',''''無數據'''',Stopsign!)return1else

messagebox("錯誤!",&"error:"+string(sqlca.sqldbcode)&+"information:"+sqlca.

sqlerrtext)file://SQL出錯提示endif

在登錄模塊中,用戶可輸入自己的編號或編碼來登錄系統。系統會根據用戶輸入的編號或編碼值

來自動給出確實已存在庫中的用戶中文名,若查找不到庫中相匹配的記錄則提示出錯或重輸。若

用戶存在,則提示輸入口令,口令正確則會順利進入該系統主界面。

§5.3查詢模塊的實現

圖5-3查詢窗口

該窗口(w_main)控件列表如下:

風格控件名說明

顯示項GroupBoxgb_1------

資料名稱CheckBoxcbx_1Checked:true

作者CheckBoxcbx_2Checked:true

出版社CheckBoxcbx_3Checked:true

出版日期CheckBoxcbx_4Checked:false

類別CheckBoxcbx_5Checked:true

購買日期CheckBoxcbx_6Checked:false

ISBNCheckBoxcbx_7Checked:false

保管人CheckBoxcbx_8Checked:true

備注CheckBoxcbx_9Checked:false

全選CheckBoxcbx_10選擇全部顯示項

檢索PictureBoxpb_1模糊查詢檢索

插入PictureBoxpb_2插入一條記錄

刪除PictureBoxpb_3刪除一條記錄

檢索PictureBoxpb_4組合查詢檢索

全部記錄PictureBoxpb_5檢索全部記錄

退出PictureBoxpb_6退出查詢界面

修改PictureBoxpb_7進入編輯模式

插入PictureBoxpb_8插入一條查詢條件

刪除PictureBoxpb_9刪除一條查詢條件

存盤PictureBoxpb_10修改后的數據存盤

打印PictureBoxpb_11打印查詢結果報表

存為默認顯示項PictureBoxpb_12將顯示項存為當前用戶默認

------Singlelineeditsle_1查詢內容輸入(字符型)

------Editmaskem_1查詢內容輸入(日期型)

------Statictextst_1顯示當前用戶名

------PictureP_1修改按鈕裝飾

------PictureP_2Gb_1顯示裝飾

------PictureP_3顯示當前用戶頭像

------Dropdownlistboxddlb_1查詢項選擇

------Dropdownlistboxddlb_2查詢操作符選擇

------Tabcontroltab_1共有三個tabpage頁tabpage1:模糊查詢tabpage2:組合查詢tabpage3:

更新打印

------Datawindowscontroldw_1對應數據窗口d_information圖書信息檢索

------Datawindowscontroldw_2對應數據窗口d_query_condition查詢條件檢索

CommandbuttonCb_2模糊查詢操作符英-中轉換

表5-2查詢模塊控件信息表

控件:w_main事件(event):openScriptofopen

stringmode,p,xs,headbooleanxs_item[10]integeridw_1.settransobject(sqlca)dw_1.

Retrieve()//打開窗口顯示全部記錄sj_check=0//為檢索窗口排序變量賦初值st_1.text=user//

在查詢窗口右上角顯示當前用戶名SELECT"keeper"."display_item","keeper"."

head_picture"INTO:xs,:headFROM"keeper"WHERE"keeper"."name"=:user;

//從用戶表中讀出當前用戶的頭像值及顯示像值并分別賦值給變量file://有頭像的用戶則顯示

在查詢窗口右上角ifisnull(head)thenp_3.visible=falseelsep_3.picturename=

headendif////將當前用戶查詢顯示項變量讀出并賦值給每個查詢顯示控件fori=1to8if

Mid(xs,i,1)=''''0''''thenxs_item[i]=falseelsexs_item[i]=trueendifendfor////給每

個對應的CHECKBOX賦值,確實是勾還是叉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]////對應的數據窗口顯示情況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////將查詢數據窗口設為只讀dw_1.Object

.DataWindow.ReadOnly="Yes"

控件:pb_12“存為默認顯示選項”事件(event):clickedScriptofclicked

booleancheck[10]integeri,answerstringxs_item[10]string

xs_content,question_text,tempquestion_text="將當前顯示項存為"+user+"用戶的默認顯示項

?"answer=messagebox(''''提示!'''',question_text,question!,YesNoCancel!)choosecaseanswer

case1file://將當前對應的CHECEKBOX選項記錄下來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://將顯示項轉化為01的顯示,存入數組變量xs_content=''''''''

fori=1to8ifcheck[i]=truethenxs_item[i]=''''1''''elsexs_item[i]=''''0''''

endifxs_content=xs_content+xs_item[i]endfor//file://修改用戶表中顯示項

的值UPDATE"keeper"SET"display_item"=:xs_contentWHERE"

keeper"."name"=:user;choosecaseSQLCA.sqlcodecase-1messagebox("

錯誤!","error:"+&string(sqlca.sqldbcode)+&"information:"+sqlca.sqlerrtext)

messagebox(''''提示'''',''''修改成功!'''')commit;case100

messagebox(''''!'''',''''修改失敗!'''')endchoosecase2returncase3returnendchoose

5.3.1模糊(分類)查詢的實現

圖5-4模糊查詢窗口

控件:ddlb_1事件(selectionchanged):ScriptofSelectionchanged

file://清空歷史查詢內容em_1.selecttext(1,len(em_1.text))em_1.clear()sle_1.selecttext

(1,len(sle_1.text))sle_1.clear()//運算符隨查詢內容的改變而改變ifddlb_1.text=''''出版日

期''''orddlb_1.text=''''購買日期''''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

不可見控件:cb_2“轉換”事件(event):ClickedScriptofClicked

file://將查詢項轉換為表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''''購買日期''''query_item=

''''buy_date''''case''''保管人''''query_item=''''keeper''''case''''備注''''query_item=''''memo''''end

choose//將操作符轉換為中文顯示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!)//將英文操作符轉換為中文顯示dw_1.setredraw

(true)old_sql=dw_1.getsqlselect()//得到原有數據窗口的SQL語句ifddlb_1.text=''''出版日

期''''orddlb_1.text=''''購買日期''''then//查詢項為日期類型em_1.GetData(d)//取出輸入的日期

數據rq=String(d,"yyyy/mm/dd")//將輸入的日期數據轉換為字符型choosecase

query_operator//根據操作符的不同將新產生的WHERE條件與老的SQL語句拼接成新的SQL語句

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////查詢項為字符型elsesle_1.text=

Righttrim(sle_1.text)//將當前輸入內容右面的空格去掉choosecasequery_operator//根

據操作符的不同將新產生的WHERE條件與老的SQL語句拼接成新的SQL語句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//對原有數據

窗口進行新的查詢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'''')//根據查詢項目改變操作符的顯示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()//將當前行的行號賦值給變量//允許插入一

行的條件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//如

果允許插入,則在當前行后插入一條新記錄ifquery=''''yes''''thennew_row=dw_2.insertrow(0

)////將光標定位在新的一行“資料名稱”列dw_2.scrolltorow(new_row)dw_2.setrow(new_row)

dw_2.setcolumn(1)//elsemessagebox(''''警告'''',"請輸入完整的查詢條件",stopsign!)endif

控件:pb_3“刪除”事件(event):ClickedScriptofClicked

introw//如果當前行不為第一行,則允許刪除ifdw_2.getrow()<>1thenrow=dw_2.getrow

()//將當前行行號賦值給變量dw_2.deleterow(row)//刪除當前行elsereturnendif

控件:pb_4“檢索”事件(event):ClickedScriptofClicked

Longrow_count,rowstringnew_condition,itemstringcondition[100]

,column_name,operator,content,join,operator1inti//將當前行行號賦值給變量row=dw_2.

getrow()//將當前行列名賦值給變量column_name=dw_2.getitemstring(row,''''column_name'''')//將

當前行操作符賦值給變量operator=dw_2.getitemstring(row,''''operator'''')//將當前行查詢內容賦

值給變量content=dw_2.getitemstring(row,''''content'''')//將當前行連接符賦值給變量(andor)

join=dw_2.getitemstring(row,''''join'''')//將查詢條件窗口的空行刪掉ifrow<>1thenif(

isnull(column_name)or&isnull(operator)or&isnull(content))thendw_2.

deleterow(row)endifendif////將查詢條件窗口的總行數賦值給變量row_count=dw_2.

rowcount()//where后的表達式fori=1torow_countitem=dw_2.getitemstring(

i,''''column_name'''')operator1=dw_2.getitemstring(i,''''operator'''')choosecaseitem//查詢項

為字符型case''''name'''',''''author'''',''''publishing_house'''',''''sort'''',''''isbn'''',''''keeper'''',''''memo''''if

i<>row_countthen//查詢條件有多行時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//查詢項為日期類型case''''publishing_date'''',''''buy_date''''ifi<>

row_countthen//查詢條件有多行時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后的表達式new_condition=''''''''fori=1

torow_countnew_condition=new_condition+condition[i]nextold_sql1=dw_1.getsqlselect

()new_sql1=old_sql1+"where"+new_condition//對原有數據窗口進行新的查詢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更新打印模塊實現

圖5-6更新打印窗口

控件:pb_7“修改”事件(event):ClickedScriptofClicked

file://取消亮條顯示一行,便于進行編輯dw_1.selectrow(dw_1.getrow(),false)//將數據窗口

屬性設為可以修改dw_1.Object.DataWindow.ReadOnly="no"dw_1.settransobject(sqlca)//將焦

點設置在數據窗口控件上dw_1.setfocus()//觸發dw_1的Getfocus事件dw_1.TriggerEvent(

Getfocus!)//將插入、刪除、存盤、打印按鈕全部設為可以使用pb_8.enabled=truepb_9.

enabled=truepb_10.enabled=truepb_11.enabled=true//

控件:pb_8“插入”事件(event):ClickedScriptofClicked

stringstatuslongrow//在當前行后插入一行dw_1.ScrollToRow(dw_1.insertrow(dw_1.

getrow()))//設置焦點在數據窗口dw_1.setfocus()//觸發數據窗口事件dw_1.TriggerEvent(

Getfocus!)

控件:pb_9“刪除”事件(event):ClickedScriptofClicked

intanswer//將當前行亮條顯示dw_1.selectrow(dw_1.getrow(),true)answer=messagebox("提示

!","確實刪除此記錄?",Question!,YesNoCancel!)choosecaseanswercase1file://刪

除當前記錄dw_1.deleterow(dw_1.getrow())file://觸發dw_1的getfocus事件dw_1.

triggerevent(getfocus!)case2,3file://取消當前行亮條顯示dw_1.selectrow(dw_1

.getrow(),false)file://將光標定位在dw_1dw_1.setfocus()file://觸發dw_1的

getfocus事件dw_1.TriggerEvent(Getfocus!)endchoose

控件:pb_9“刪除”事件(event):ClickedScriptofClicked

intanswerlongdel_count//將數據窗口刪除記錄標記值賦值給變量del_count=dw_1.

deletedcount()//判斷數據窗口是否有記錄標記為刪除或者否有列被修改if(modifiedcount(

dw_1)<>0)or(del_count<>0)then//若數據窗口中記錄被改動詢問是否存盤answer=

messagebox("提示!","是否存盤?",Question!,YesNoCancel!)choosecaseanswercase1if

dw_1.update()=1then//如果數據窗口具有UPDATE屬性messagebox(''''提示'''',''''存盤成功!'''')

commit;endifcase2//數據窗口不具有UPDATE屬性則回滾rollback;

dw_1.ResetUpdate()dw_1.reset()//清空數據窗口dw_1.retrieve()//刷新數據窗口

dw_1.setfocus()//設置焦點在dw_1dw_1.TriggerEvent(Getfocus!)//觸發dw_1的

getfocus事件case3dw_1.setfocus()dw_1.TriggerEvent(Getfocus!)end

chooseendif

控件:dw_1事件(event):GetfocusScriptofGetfocus

this.setrow(this.getrow())this.setcolumn(''''name'''')//設置當前列為“資料名稱”this.

accepttext()

控件:dw_1事件(event):LostfocusScriptofLostfocus

file://在編輯狀態,接收輸入的字符this.accepttext()

控件:dw_1事件(event):ClickedScriptofClicked

stringcur_row//將當前行賦值給變量cur_row=string(dw_1.getclickedrow())//如果數據窗口

為只讀、或至少有一條記錄則亮條顯示當前焦點所在記錄ifdw_1.object.datawindow.readonly

=''''yes''''andcur_row<>''''0''''thendw_1.selectrow(getrow(),true)endif//

控件:dw_1事件(event):RowfocuschangedScriptofrowfocuschanged

stringcur_row//將鼠標單擊選中的行號賦值給變量cur_row=string(dw_1.getclickedrow())//

數據窗口只讀或當前行號不為零,則亮條顯示選中記錄ifdw_1.object.datawindow.readonly=

''''yes''''andcur_row<>''''0''''thendw_1.selectrow(dw_1.getrow(),true)endif//

控件:dw_1事件(event):RowfocuschangingScriptofrowfocuschanging

file://焦點改變時將舊焦點的亮條顯示取消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//取消當前行亮條顯示dw_1.selectrow(dw_1.

getrow(),false)ifsj=0thencur_text=dwo.name//將當前雙擊對象名賦值給變量//表示只有

雙擊列標題才實現排序cur_column=left(cur_text,len(cur_text)-2)//去掉列標題的_t//按升序

排序new_sort=string(cur_column)+''''A''''dw_1.setsort(new_sort)dw_1.sort()//

sj_check=1//再次雙擊變成降序排序elsecur_text=dwo.name//將當前雙擊對象名賦值給變量//

表示只有雙擊列標題才實現排序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'''')//根據查詢項目改變操作符的顯示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()//將當前行的行號賦值給變量//允許插入一

行的條件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//如

果允許插入,則在當前行后插入一條新記錄ifquery=''''yes''''thennew_row=dw_2.insertrow(0

)////將光標定位在新的一行“資料名稱”列dw_2.scrolltorow(new_row)dw_2.setrow(new_row)

dw_2.setcolumn(1)//elsemessagebox(''''警告'''',"請輸入完整的查詢條件",stopsign!)endif

控件:pb_3“刪除”事件(event):ClickedScriptofClicked

introw//如果當前行不為第一行,則允許刪除ifdw_2.getrow()<>1thenrow=dw_2.getrow

()//將當前行行號賦值給變量dw_2.deleterow(row)//刪除當前行elsereturnendif

控件:pb_4“檢索”事件(event):ClickedScriptofClicked

Longrow_count,rowstringnew_condition,itemstringcondition[100]

,column_name,operator,content,join,operator1inti//將當前行行號賦值給變量row=dw_2.

getrow()//將當前行列名賦值給變量column_name=dw_2.getitemstring(row,''''column_name'''')//將

當前行操作符賦值給變量operator=dw_2.getitemstring(row,''''operator'''')//將當前行查詢內容賦

值給變量content=dw_2.getitemstring(row,''''content'''')//將當前行連接符賦值給變量(andor)

join=dw_2.getitemstring(row,''''join'''')//將查詢條件窗口的空行刪掉ifrow<>1thenif(

isnull(column_name)or&isnull(operator)or&isnull(content))thendw_2.

deleterow(row)endifendif////將查詢條件窗口的總行數賦值給變量row_count=dw_2.

rowcount()//where后的表達式fori=1torow_countitem=dw_2.getitemstring(

i,''''column_name'''')operator1=dw_2.getitemstring(i,''''operator'''')choosecaseitem//查詢項

為字符型case''''name'''',''''author'''',''''publishing_house'''',''''sort'''',''''isbn'''',''''keeper'''',''''memo''''if

i<>row_countthen//查詢條件有多行時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//查詢項為日期類型case''''publishing_date'''',''''buy_date''''ifi<>

row_countthen//查詢條件有多行時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后的表達式new_condition=''''''''fori=1

torow_countnew_condition=new_condition+condition[i]nextold_sql1=dw_1.getsqlselect

()new_sql1=old_sql1+"where"+new_condition//對原有數據窗口進行新的查詢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