版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
局域網(wǎng)圖書資料查詢系統(tǒng)
除屬性,就不是鍵了。3)主鍵:(PrimaryKey):用戶選作元組標識的一個侯選鍵稱為主鍵。一般,如不加說明,則鍵是指主鍵。3.關系的定義和性質我們可以用集合的觀點定義關系。關系是一個元數(shù)為K(K>=1)的元組的集合。把關系看成是一個集合,集合中的元素是元組,每個元組的屬性個數(shù)應相同。在關系模型中,對關系作了下列規(guī)范性限制:1)關系中每一個屬性值都是不可分解的。2)關系中允許出現(xiàn)相同的元組(沒有重復元組)3)由于關系是一個集合,因此不考慮元組間的順序,即沒有行序。4)元組中,屬性在理論上也是無序的,但在使用時按習慣考慮列的順序。2.1.2數(shù)據(jù)庫的設計理論關系數(shù)據(jù)庫的設計理論主要包括三個方面的內容:數(shù)據(jù)依賴、范式,模式設計方法。其中數(shù)據(jù)依賴起著核心的作用。1.函數(shù)依賴(Functionaldependency,F(xiàn)D)的定義設R(U)是一個關系模式,U是R的屬性集合,X和Y是U的子集。對于R(U)的任何一個可能的關系r,如果r中不存在兩個元組,它們在X上的屬性值相同,而在Y上的屬性值不同,則稱“Y函數(shù)依賴于X”,記作X→Y。如果X→Y,并且對于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.范式在對表的形式進行了規(guī)范化定義后,數(shù)據(jù)結構還有五種規(guī)范化定義,定名為規(guī)范化模式,稱為范式。在這五種范式中,一般只用前三種,對于常用系統(tǒng)就足夠了。而且這五種范式是“向上兼容”的,即滿足第五范式的數(shù)據(jù)結構自動滿足一、二、三、四范式,滿足第四范式的數(shù)據(jù)結構自動滿足第一、二、三范式,……,依此類推。第一范式(firstnormalform,簡稱1stNF)就是指在同一表中沒有重復項出現(xiàn),如果有則應將重復項去掉。這個去掉重復項的過程就稱之為規(guī)范化處理。在本文所討論的開發(fā)方法里,1stNF實際上是沒有什么意義的。因為我們按規(guī)范化建立的指標體系和表的過程都自動保證了所有表都滿足1stNF。第二范式(secondnormalform,簡稱2ndNF)是指每個表必須有一個(而且僅一個)數(shù)據(jù)元素為主關鍵字(primarykey),其它數(shù)據(jù)元素與主關鍵字一一對應。例如,在圖l9.7中如果我們將合同號定義為主關鍵字(其它數(shù)據(jù)元素中的記錄數(shù)據(jù)都有可能重名,故不能作為主關鍵字),故只要知道了一個合同記錄的合同號,就可以唯一地在同一行中找到該合同的任何一項具體信息。通常我們稱這種關系為函數(shù)依賴(functionaldepEndence)關系。即表中其它數(shù)據(jù)元素都依賴于主關鍵字,或稱該數(shù)據(jù)元素唯一地被主關鍵字所標識。第三范式(thirdnormalform,簡稱3rdNF)就是指表中的所有數(shù)據(jù)元素不但要能夠唯一地被主關鍵字所標識,而且它們之間還必須相互獨立,不存在其它的函數(shù)關系。也就是說對于一個滿足了2ndNF的數(shù)據(jù)結構來說,表中有可能存在某些數(shù)據(jù)元素依賴于其它非關鍵宇數(shù)據(jù)元素的現(xiàn)象,必須加以消除。為防止數(shù)據(jù)庫出現(xiàn)更新異常、插入異常、刪除異常、數(shù)據(jù)冗余太大等現(xiàn)象,關系型數(shù)據(jù)庫要盡量按關系規(guī)范化要求進行數(shù)據(jù)庫設計。下面以教務管理信息系統(tǒng)為例來進行分析。3.模式設計方法一個好的模式設計方法應符合下列三條原則:l表達性:涉及到兩個數(shù)據(jù)庫模式的等價性問題,即數(shù)據(jù)等價和依賴等價,分別用無損聯(lián)接和保持函數(shù)依賴來衡量。l分離性:是指屬性間的“獨立關系”應該用不同的關系模式表達。獨立聯(lián)系是我們所考慮的“基本信息單位”。實際上分離就是清除存儲異常和數(shù)據(jù)冗余現(xiàn)象。如果能達到這個目的,就分離。分離的基準就是一系列范式,分離與依賴等價有時是不可兼容的。l最小冗余性:要求在分解后的數(shù)據(jù)庫能表達原來數(shù)據(jù)庫的所有信息這個前提下實現(xiàn)。目的就是節(jié)省存儲空間,提高對關系的操作效率,清除不必要的冗余。但要注意,在實際使用中,并不一定要達到最小宙余。因為有時帶點冗余對于查詢處理是有好處的。關系模式的方法基本上可以分為分解與合成兩大類。分解型算法要求輸入一個初始模式集和依賴集,而結果滿足數(shù)據(jù)等價要求。對于合成型算法只要求輸入初始依賴集,結果滿足依賴等要求。但它們依據(jù)的基本思想是共同的,即獨立的聯(lián)系獨立表示?!?.2SQL語言介紹SQL(StructuredQueryLanguage)即“結構式查詢語言”。SQL雖然名為查詢語言,但實際上具有定義、查詢、更新和控制等多種功能。由于它使用方便、功能豐富、語言簡單易學,很快得到應用和推廣。從20世紀70年代末起,在推出的關系數(shù)據(jù)庫系統(tǒng)產品ORACLE、SQL/DS、DB2、SYBASE上實現(xiàn)了SQL語言。很快,SQL語言被整個計算機界認可。1987年6月,國際標準化組織(ISO)采納為國際標準。隨后,ISO對標準進行了大量的修改和擴充。在1992年推出了新的標準-SQL2。SQL的標準化工作還在繼續(xù),新的標準已被命名為SQL3,將包括許多新的數(shù)據(jù)庫概念,正在不征求意見和進行修改這里將簡單介紹基于SQL89和SQL2的語言使用概貌:2.2.1SQL的組成SQL主要分成四個部分:1)數(shù)據(jù)定義:這一部分也稱為“SQLDDL”,用于定義SQL模式、基本表、視圖和索引。2)數(shù)據(jù)操縱:這一部分也稱為“SQLDML”。它分為數(shù)據(jù)查詢和數(shù)據(jù)更新兩類。其中數(shù)據(jù)更新又分成插入、刪除、和修改三種操作。3)數(shù)據(jù)控制:這一部分包括對基本表和視圖的授權,完整性規(guī)則的描述,事務控制等內容。4)嵌入式SQL的使用規(guī)定:這一部分內容涉及到SQL語句嵌入在宿主語言程序中使用的規(guī)則。2.2.2SQL的數(shù)據(jù)查詢nSELECT語句的語法SELECT目標表的列名或列表達式序列FROM基本表和(或)視圖序列[WHERE行條件表達式][GROUPBY列名序列[HAVING組條件表達式]][ORDERBY列名[ASC|DESC]…]句法中[]表示該成分可有,也可無。整個語句的執(zhí)行過程如下:a)讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。b)讀取滿足WHERE子句中給出的條件表達式的元組。c)按GROUP子句中指定列的值分組,同時提取滿足HAVING子句中組條件表達式的那些組。d)按SELECT子句中給出的列名或列表達式求值輸出。e)ORDER子句對輸出的目標表進行排序,按附加說明ASC升序排列,或按DESC降序排列。SELECT語句中,WHERE子句稱為“行條件子句”,GROUP子句稱為“分組子句”,HAVING子句稱為“組條件子句”,ORDER子句稱為“排序子句”。2.2.3SQL的數(shù)據(jù)更新SQL的數(shù)據(jù)更新包括數(shù)據(jù)插入、刪除和修改等三種操作1)數(shù)據(jù)插入a)元組值的插入INSERTINTO基本表名(列名表)VALUES(元組值)或者INSERTINTO基本表名(列名表)(TABLE(元組值),(元組值),……)前一種格式只能插入一個元組,后一種格式可以插入多個元組。2)數(shù)據(jù)刪除SQL的刪除操作是指從基本表刪除元組,其語法如下:DELETEFROM基本表名[WHERE條件表達式]其語義是從基本表中刪除滿足條件表達式的元組。3)數(shù)據(jù)修改當需要修改基本表中元組的某些列值時,可以用UPDATE語句實現(xiàn),其句法如下:UPDATE基本表名SET列名=值表達式[,列名=值表達式…][WHERE條件表達式]其語義是:修改基本表中滿足條件表達式的那些元組中的列值,需修改的列值在SET子句中指出。§2.3PB6.5對數(shù)據(jù)庫的操作PowerBuilder對數(shù)據(jù)庫的操作即可以通過數(shù)據(jù)窗口完成(本質上是數(shù)據(jù)窗口把在屏幕上對數(shù)據(jù)庫的操作轉化成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語言的變量。該語句的作用是把數(shù)據(jù)庫表的“列名1”,“列名2”和“列名3”等列的值從數(shù)據(jù)庫中取出,然后放入對應的“變量1”,“變量2”和“變量3”等變量中。例如:Stringname,extraceSELECTname,extractINTO:name,:extracefromauths
Whereauthor_code=’A00001’;該語句僅僅適合于查詢到一條記錄的情況。如果查詢到的記錄是多條,則要用下面的方法。2、查詢多行SELECT是描述型語言,它面向的是集合,是一組記錄。而PowerScript語言卻是面向過程的,它要一條條地接收并處理記錄。PowerScript通過描述型光標(CURSOR)在這組記錄上游動的方法,給Script語句逐個地傳送記錄,建立了集合與記錄間的內在聯(lián)系。請看下例:StringnameStringV1=’A%’
DECLARECURSORFORfile://定義光標,光標名為C1SELECTnameFROMauths
file://光標對應的SELECT語句WHEREauthor_codelike:V1;file://SELECT語句中用到了變量V1
OPENC1;//打開光標,此時執(zhí)行此光標對應的SQLSELECT語句。
Lab1:
FETCHC1INTO:name;
file://取記錄,光標下移一條
IfSQLCA.SQLCode=0thenfile://取記錄成功
Gotolab1file://如果成功取出記錄,則取下一條
Endif打開光標的時候,變量V1被其值“A%”替換,因此最后執(zhí)行的SQLSELECT語句為:SELECTnameFROMauthsWHEREauthor_codelike‘A%’執(zhí)行完這條語句后,把光標C1定位到了查詢出的第一條記錄上。每執(zhí)行一次語句:FECTCHC1INTO:name;則取出一條記錄送給變量name,然后光標移到下一條記錄。如果想控制查詢結果的次序,必須在SELECT語句中用ORDERBY子句,否則,沒有其它的辦法。我們不可能一下子把光標定位在某條記錄上,只能從第一條開始,一個個地移。第三章PB6.5及其數(shù)據(jù)庫編程§3.1開發(fā)工具PowerBuilderPowerBuilder6.5特點及功能要適應企業(yè)環(huán)境不斷變化的需求,成功地開發(fā)出高質量的應用系統(tǒng),必須采用先進的應用開發(fā)工具。這對于減輕應用開發(fā)人員的開發(fā)負擔,提高開發(fā)速度和質量都有十分重要的意義。Sybase公司推出的PowerBUilder6.0/6.5是用于Client/Server、Web及組件開發(fā)的企業(yè)級應用開發(fā)工具。它占全球開發(fā)工具市場近50%,是當前最優(yōu)秀的開發(fā)工具之一。它具有以下優(yōu)異的功能和特點:1、內置的關系數(shù)據(jù)庫PowerBuilder本身帶有一套數(shù)據(jù)庫系統(tǒng)SybaseSQLAnywhere。這樣做的好處是,PowerBuilder可以脫離網(wǎng)絡數(shù)據(jù)庫服務器獨立運行,從而在開發(fā)階段脫離網(wǎng)絡服務器上的數(shù)據(jù)庫。當然,利用這一功能也可以開發(fā)和調試單用戶的獨立的數(shù)據(jù)庫應用。下圖顯示了內置數(shù)據(jù)庫的工作原理:如果沒有內置的數(shù)據(jù)庫SybaseSQLAnywhere,開發(fā)時則不能脫離網(wǎng)絡服務器上的數(shù)據(jù)庫(如圖3-2所示):2、數(shù)據(jù)窗口(Datawindow)對象PowerBuilder擁有數(shù)據(jù)窗口這個具有專利技術的智能對象,利用該對象可以操作關系數(shù)據(jù)庫的數(shù)據(jù)而無需編寫SQL語句。用戶可以查詢、修改、插入、刪除、瀏覽、打印、以多種文件格式打開和存儲數(shù)據(jù),或在數(shù)據(jù)窗口中直接定義功能按鈕實現(xiàn)預定義的系統(tǒng)功能,如插入、刪除數(shù)據(jù)的操作。它還支持數(shù)據(jù)庫事務管理和并發(fā)控制等機制。其工作機理如下圖所示:3、豐富的數(shù)據(jù)窗口數(shù)據(jù)源和多種樣式的數(shù)據(jù)顯示格式數(shù)據(jù)窗口可以用來維護數(shù)據(jù)和顯示數(shù)據(jù),可定義多種顯示風格和數(shù)據(jù)顯示格式;并且還可以與TreeView控制、ListView控制配合使用,創(chuàng)建出更豐富的數(shù)據(jù)顯示格式4、支持多種商業(yè)圖形,包括多種類型的二維和三維的圖形5、支持組件的開發(fā)和調用用PowerBuilder開發(fā)的組件,可以在其它應用中調用,可以由多種事務管理服務器管理。6、具有面向對象的特征PowerBuilder采用了面向對象的開方式,這可以使系統(tǒng)開發(fā)人員在無需精通專用語言的情況下就可以迅速轉向面向對象的開發(fā)。PowerBuilder應用是由一系列對象組成的,包括窗口、菜單、函數(shù)、數(shù)據(jù)窗口和各種控制等對象,它支持對象的繼承、封裝和多態(tài)性。7、有機結合的集成開發(fā)環(huán)境8、完全支持Windows的窗口信息和控制9、強有力的PowerScript編程語言它能使開發(fā)人員很容易地將簡單或復雜的事務邏輯與應用相配合。該語言還有幾百個函數(shù)用于操縱對象、處理數(shù)字、文本、字符串、日期和應用分布,進行文件處理、報表打印,用DDE和OLE2.0進行程序之間的通信,直接調用SQL語句操縱數(shù)據(jù)庫等等。10、PowerBuilder提供了多種流行軟件的接口庫NetwareLibraryPenComputingLibraryLotusNotesLibraryMicrosoftMAPI11、PowerBuilder支持多種平臺目前,PowerBuilder能夠在MicrosoftWindows3.X、Windows95WindowsNTAlpha/IntelAppleMacSunSalorisIBMAIXHPUnix等多種平臺上開發(fā)和運行應用程序,并能夠不加改動地應用于其它平臺上。12、支持Internet/Intranet下的Web應用開發(fā)13、支持團體開發(fā)14、對多種數(shù)據(jù)庫的支持PowerBuilder幾乎支持所有的數(shù)據(jù)庫,它提供了到多種數(shù)據(jù)庫的專用接口和ODBC接口?!?.2PowerBuilder與Client/Server體系結構3.2.1Client/Server模式在C/S結構中,存在著幾個非常重要的基本概念,它們是:主機、終端、客戶機、工作站和服務器。在分析C/S網(wǎng)絡結構之前,必須搞清楚它們之間的區(qū)別。最早的計算機網(wǎng)絡是伴隨著主機(Host)和終端(Terminal)這兩個概念的出現(xiàn)而產生的。當時的主機通常是指具有中央處理單元(CPU)的大型機或功能較強的小型機,而終端則是指計算機的輸入輸出設備。終端沒有自己的CPU,當然也沒有自己的內存,其主要功能是將鍵盤輸入的請求數(shù)據(jù)發(fā)往主機并將主機的運算結果顯示出來。主機和終端共同構成了集中式系統(tǒng)結構。在這種應用系統(tǒng)中,幾乎所有的工作都是由主機來完成,終端僅僅作為一種輸入輸出設備,因此系統(tǒng)負荷重、效率低、擴充性差。之后隨著計算機網(wǎng)絡結構的細化,不同的計算機開始在網(wǎng)絡中擔負不同的任務,于是出現(xiàn)了文件服務器/網(wǎng)絡工作站(F/W)式結構的模型。其中,工作站(Workstation)和服務器(Server)都是獨立的計算機。當一臺連入網(wǎng)絡的計算機向其它計算機(工作站)提供各種網(wǎng)絡服務(如數(shù)據(jù)、文件的共享)時,它就被叫做服務器。而那些用于訪問服務器資料的計算機則被叫做工作站。在F/W結構中,所有實際的數(shù)據(jù)處理工作仍在運行數(shù)據(jù)庫應用程序的PC工作站上完成,因此不論文件服務器的性能有多高,其整體網(wǎng)絡性能都將受到PC機能力的限制??蛻魴C(Client)是伴隨C/S數(shù)據(jù)訪問的興起而被提出來的,在一般人的理解中它和F/W概念沒有本質的區(qū)別。但是,嚴格說來,C/S模型并不是從物理分布的角度來定義的。它既包括具體的網(wǎng)絡結構設計,又包括軟件的運行和組織,所體現(xiàn)的是一種網(wǎng)絡數(shù)據(jù)的訪問方式。這里的客戶機和服務器不僅指承擔不同任務的計算機本身,而且包括主機上運行的客戶端和服務器端的軟件環(huán)境。它們的區(qū)別,是相對于各自在網(wǎng)絡數(shù)據(jù)庫訪問中所處的地位或實現(xiàn)的功能而言的。理解了以上的基本概念,才可以更好地理解C/S結構的實質和運行方式:所謂C/S結構,是將數(shù)據(jù)存取與應用程序分離開來,把一個軟件系統(tǒng)或應用系統(tǒng)按功能分成若干個部分,再將這些軟件的組成部分按其不同的角色分成Client軟件和Server軟件,分別放置在客戶機和服務器上??蛻魴C程序負責用戶交互界面、數(shù)據(jù)表示及應用處理邏輯等應用部分,而服務器端則負責數(shù)據(jù)存取管理、完整性控制及并發(fā)控制等數(shù)據(jù)庫管理部分??蛻魴C程序應用通過SQL語句訪問數(shù)據(jù)庫,相應的SQL語句經網(wǎng)絡傳輸?shù)椒掌鞫?,由服務器端的?shù)據(jù)庫服務器解釋執(zhí)行這些SQL語句,執(zhí)行后的結果數(shù)據(jù)送回客戶機。來承擔,服務器的能力可以得到充分的發(fā)揮。但是它也有以下一些缺點:l由于計算機技術的快速進步和企業(yè)需求變化的加快,企業(yè)面臨的硬件、網(wǎng)絡操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)、開發(fā)工具、應用系統(tǒng)的升級周期越來越短,因此“維護”客戶服務器的費用就變得越來越高昂。l快速升級的硬件、網(wǎng)絡操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)、開發(fā)工具使企業(yè)的技術人員失去了方向:不斷地消化新技術,卻無瑕顧及企業(yè)要解決的問題l在客戶端,必須安裝操作系統(tǒng)(一般為Windows95/NT)、網(wǎng)絡軟件、特定的中間件(SybasseNet-Library)以及應用軟件系統(tǒng)才能工作,因此應用系統(tǒng)的安裝、升級和維護通常需要專業(yè)人員才能用勝任,且必須各站點逐個安裝,從而使客戶端的維護費用變得也很高昂。對主機系統(tǒng)來說,這一點要優(yōu)越的多,只需要在主機上安裝一次即可。3.2.3PowerBuilder是客戶/服務器體系結構下客戶端的開發(fā)工具前面已提到,PowerBuilder是客戶/服務器體系結構下開發(fā)客戶程序用的開發(fā)工具,用PowerBuilder開發(fā)出的程序可以存取數(shù)據(jù)庫中的數(shù)據(jù)。下圖表示了PowerBuilder與數(shù)據(jù)庫配合工作的方式。我們看到,PowerBuilder作為客戶端的應用開發(fā)工具,主要完成的是表示邏輯方面的工作,例如,菜單、錄入界面。而數(shù)據(jù)庫服務器管理的是事務邏輯和數(shù)據(jù)存取方面的工作。因此,PowerBuilder開發(fā)工作應分為兩部分,一部分是前臺表示邏輯方面的工作,另一部分是數(shù)據(jù)庫后臺方面的設計工作(如數(shù)據(jù)庫觸發(fā)器、存儲過程和視圖等的設計)。一個好的應用系統(tǒng),前臺開發(fā)與后設計應是有機結合、合理分布的;良好的后臺設計可以降低前臺的開工作量,提高系統(tǒng)的運行效率?!?.3PowerBuilder6.5數(shù)據(jù)庫編程PowerBuilder與數(shù)據(jù)庫的關系是“配合”與“協(xié)調”的關系。PowerBuilder完成數(shù)據(jù)請求、數(shù)據(jù)表現(xiàn)、菜單、界面等表象方面的工作,而數(shù)據(jù)庫服務器完成數(shù)據(jù)庫數(shù)據(jù)的存儲管理、安全管理、并發(fā)控制、事務管理、完整性維護、查詢優(yōu)化等工作。PowerBuilder在操作數(shù)據(jù)庫時與以下幾方面有關:1、在數(shù)據(jù)庫畫筆中定義數(shù)據(jù)庫表和視圖l定義表的結構l表中列的擴展屬性2定義表中列的顯示風格2定義表中列的編輯屏蔽2定義表中列的校驗l定義表的主鍵l定義表的外部鍵l定義表的索引PowerBuilder有五個系統(tǒng)表,這五個系統(tǒng)表是PowerBuilder初次連接到數(shù)據(jù)庫時系統(tǒng)自動建立的。下表給出了這個系統(tǒng)表的表名和它們的作用PowerBuilder系統(tǒng)表用途PBCATTBL存放表或視圖,表或視圖中列的缺省字體。PBCATCOL存放列用到的顯示風格名、校驗規(guī)則名和編輯風格名;列的標題、列的標簽、字體的大小寫,字體的對齊方式。PBCATFMT列的顯示風格定義。PBCATVLD列的校驗規(guī)則定義。PBCATEDT列的編輯風格定義。表3-1PowerBuilder系統(tǒng)表2、在數(shù)據(jù)庫畫筆中在圖形方式下操作數(shù)據(jù)庫這些操作包括:l插入記錄l修改記錄l刪除記錄l查詢記錄l把查詢出的記錄存入文件l把表或視圖的定義轉變成建表的SQL語名這些功能是給開發(fā)人員和管理人員提供的。3、在數(shù)據(jù)庫畫筆中用SQL語句執(zhí)行平臺管理操作數(shù)據(jù)庫l生成數(shù)據(jù)庫l管理數(shù)據(jù)庫l維護數(shù)據(jù)在這里創(chuàng)建的表和規(guī)則不會記錄在PowerBuilder系統(tǒng)表中4、在查詢畫筆中定義查詢對象如果一個查詢動作要多次使用,還可以用PowerBuilder的查詢畫表生成查詢對象這個查詢對象不能由數(shù)據(jù)庫畫表調用,它只能由查詢畫表本身調用執(zhí)行。在建立數(shù)據(jù)窗口時,數(shù)據(jù)源也可以做在查詢對象之上。事實上,查詢對象就是寫好了的SQL語句,它存在PowerBuilder的pbl文件中,在使用的時候調用即可。5、用數(shù)據(jù)管道在不同數(shù)據(jù)庫之間轉換數(shù)據(jù)數(shù)據(jù)管道允許把一個數(shù)據(jù)庫的數(shù)據(jù)(一個或多個表中的全部或部分行)轉入到另一個數(shù)據(jù)庫的一個表中(這個表可以存在或不存在),從而可以使數(shù)據(jù)在不同數(shù)據(jù)庫之間相互復制。6、用數(shù)據(jù)窗口操作數(shù)據(jù)庫Datawindow是PowerBuilder操作數(shù)據(jù)庫的重要的手段,通過數(shù)據(jù)窗口可以查修改、插入和刪除數(shù)據(jù)庫的數(shù)據(jù)。PowerBuilder數(shù)據(jù)窗口操作數(shù)據(jù)庫的能力非常強,是PowerBuilder的精華所在。l數(shù)據(jù)窗口的數(shù)據(jù)源可以是:2表或視圖2多表連接2查詢對象2外部數(shù)據(jù)源2存儲過程l數(shù)據(jù)窗口列數(shù)據(jù)的顯示風格l數(shù)據(jù)窗口列的編輯屏蔽l數(shù)據(jù)窗口列的校驗7、PowerScript直接調用SQL語句操作數(shù)據(jù)庫PowerBuilder對數(shù)據(jù)庫的操作即可以通過數(shù)據(jù)窗口完成(本質上是數(shù)據(jù)窗口屏幕上對數(shù)據(jù)庫的操作轉化成SQL語句),又可以在PowerScript語言中直接調用SQL或存儲過程(本質上仍是SQL語句)完成。詳細操作在第*個章節(jié)已經介紹。第四章局域網(wǎng)圖書資料查詢系統(tǒng)設計分析根據(jù)數(shù)據(jù)庫系統(tǒng)生存期的設計方法,從數(shù)據(jù)庫應用系統(tǒng)和開發(fā)的全過程來考慮,將數(shù)據(jù)庫應用系統(tǒng)設計分為以下幾個階段(見圖4-1)1)規(guī)劃;2)需求分析;3)概念設計;4)邏輯設計5)物理設計§4.1應用需求分析要設計一個良好的局域網(wǎng)圖書資料查詢系統(tǒng),就必須首先明確該應用環(huán)境對系統(tǒng)的要求。局域網(wǎng)圖書資料查詢系統(tǒng)的應用背景為:一個數(shù)十人的科研或開發(fā)小組,搜集了上千冊有用的圖書資料,其中有一部分分布在個人手中,為了方便大家查閱,需要對每本書的狀態(tài)進行跟蹤,另新進和丟失的圖書資料必須得到及時的反映。因此,該系統(tǒng)需滿足以下幾方面需求:l用戶的管理:必須具有使用權限的用戶才能成功登錄到系統(tǒng)中來。所謂用戶權限在這里并不要求有功能上具體的劃分,集中實行松散管理,這建立在用戶高度自覺的基礎上。所以,在這里只需給每個需要使用系統(tǒng)的人一個用戶名和密碼,即可登錄系統(tǒng)進行各種操作。新的用戶需要取得管理員的許可將其加入系統(tǒng),加入系統(tǒng)的用戶可以對自己的用戶密碼進行修改。l查詢功能:系統(tǒng)需要提供幾種不同方式的查詢手段,以實現(xiàn)靈活方便地管理整個系統(tǒng)。2圖書分類查詢:一本圖書包括書名、出版社、作者、保管人等多個信息,這就要求系統(tǒng)能按照不同的信息類別對圖書進行查詢。比如說,按書名查詢、按作者查詢等。選定需要的查詢信息類別,再輸入想查詢的內容即可查詢到相關的圖書信息。2多條件查詢:很多時候,用戶需要了解的信息不僅僅局限于一個條件,比方說想同時查詢書名為“數(shù)據(jù)庫原理”但出版社僅為“經濟科學出版社”的圖書信息時,單純的分類查詢就不能滿足用戶的需要,這時就要用到多條件查詢。也就是說,多條件查詢不僅可以實現(xiàn)單個的分類查詢,還可以實現(xiàn)多條分類查詢的組合查詢。每個查詢條件之間用“并且”或“或者”的關系關聯(lián)起來組成完整的查詢條件。2模糊查詢:對于用戶來說并不一定完全記得某本圖書準確的名稱,類似,對于作者、出版社等等信息來說,很多時候用戶只是記得一些相關的信息而不是一字不差的準確信息。這個時候就要用到模糊查詢。用戶輸入查詢內容后,系統(tǒng)將會把包含查詢內容的(注意:并不是精確的等于查詢內容)所有相關圖書信息顯示出來,以使用戶得到準確的、自己真正需要的信息內容。l更新與編輯:2更新:系統(tǒng)允許用戶對查詢到的內容進行修改并且存盤。2編輯:系統(tǒng)允許用戶對現(xiàn)庫進行插入、刪除的操作,保證現(xiàn)庫的真實性與實時性。l打印輸出:系統(tǒng)可以將用戶查詢到的內容動態(tài)地生成報表,并打印輸出。§4.2系統(tǒng)功能模塊劃分局域網(wǎng)圖書圖書資料查詢系統(tǒng)功能劃分模塊圖如下:§4.3系統(tǒng)數(shù)據(jù)庫設計4.3.1概念設計概念設計的目標是產生反映局域網(wǎng)圖書資料查詢系統(tǒng)需求的數(shù)據(jù)庫概念結構,即概念模式。概念模式是獨立于數(shù)據(jù)庫邏輯結構,獨立于支持數(shù)據(jù)庫的DBMS,不依賴于計算機系統(tǒng)的。lER模型ER模型是對現(xiàn)實世界的一種抽象。它的主要成分是實體、聯(lián)系和屬性。使用這三種成分,我們可以建立許多應用環(huán)境的ER模型。lER模型的操作在利用ER模型進行數(shù)據(jù)庫概念設計的過程中,常常需要對ER圖進行種種變換。這些變換又稱為ER模型的操作,包括實體類型、聯(lián)系類型和屬性的分裂、合并和增刪等等。l利用ER方法的數(shù)據(jù)庫概念設計利用ER方法進行數(shù)據(jù)庫的概念設計,可以分成三步進行:首先設計局部ER
模式,然后把各局部ER模式綜合成一個全局ER模式,最后對全局ER模式進行優(yōu)化,得到最終的ER模式,即概念模式。
1.設計局部的ER模式通常,一個數(shù)據(jù)庫系統(tǒng)都是為多個不同用戶服務的。各個用戶對數(shù)據(jù)的觀點可能不一樣,信息處理需求也可能不同。在設計數(shù)據(jù)庫概念結構時,為了更好地模擬現(xiàn)實世界,一個有效的策略是“分而治之”,即先分別考慮各個用戶的信息需求,形成局部概念結構,然后再綜合成全局結構。在ER方法中,局部概念結構又稱為局部ER模式,其圖形表示稱為ER圖。實體和屬性的定義如下:圖書(資料編號,資料名稱,作者,出版社,出版日期,ISBN,資料類別,購買日期,保管人,備注)用戶(編號,用戶代碼,用戶姓名,登錄口令,使用權限,查詢顯示項,用戶顯示頭像)資料類別(資料編號,資料類別)出版社(出版社編號,出版社),依據(jù)需求分析的結果,考察局部結構中任意兩個實體類型之間是否存在聯(lián)系。若有聯(lián)系,進一步確定是1:N,M:N,還是1:1等。還要考察一個實體類型內部是否存在聯(lián)系,兩個實體類型之間是否存在聯(lián)系,多個實體類型之間是否存在聯(lián)系,等等。聯(lián)系定義如圖4-5所示。解釋如下:l一個用戶可以保管多本圖書資料,而一本圖書資料只能由一個用戶保管;l一個資料類別可以對應多本圖書,而一本圖書只對應一個資料類別;l一本圖書由一個出版社出版,而一個出版社可以出版多種圖書。3.設計全局ER模式所有局部ER模式都設計好了后,接下來就是把它們綜合成單一的全局概念結構。全局概念結構不僅要支持所有局部ER模式,而且必須合理地表示一個完整、一致的數(shù)據(jù)庫概念結構。1)確定公共實體類型為了給多個局部ER模式的合并提供開始合并的基礎,首先要確定各局部結構中的公共實體類型。在這一步中我們僅根據(jù)實體類型名和鍵枕認定公共實體類型。一般把同名實體類型作為公共實體類型的一類候選,把具有相同鍵的實體類型作為公共實體類型的另一類候選。2)局部ER模式的合并合并的原則是:首先進行兩兩合并;先和合并那些現(xiàn)實世界中有聯(lián)系的局部結構;合并從公共實體類型開始,最后再加入獨立的局部結構。3)消除沖突沖突分為三類:屬性沖突、結構沖突、命名沖突。設計全局ER模式的目的不在于把若干局部ER模式形式上合并為一個ER模式,而在于消除沖突,使之成為能夠被所有用戶共同理解和接受的同一的概念模型。3)全局ER模式的優(yōu)化在得到全局ER模式后,為了提高數(shù)據(jù)庫系統(tǒng)的效率,還應進一步依據(jù)處理需求對ER模式進行優(yōu)化。一個好的全局ER模式,除能準確、全面地反映用戶功能需求外,還應滿足下列條件:實體類型的個數(shù)要盡可能的少;實體類型所含屬性個數(shù)盡可能少;實體類型間聯(lián)系無冗余。4.3.2邏輯設計由于概念設計的結果是ER圖,DBMS一般采用關系型,因此數(shù)據(jù)庫的邏輯設計過程就是把ER圖轉化為關系模式的過程。由于關系模型古有的優(yōu)點,邏輯設計可以充分運用關系數(shù)據(jù)庫規(guī)范化理論,使設計過程形式化地進行。設計結果是一組關系模式的定義。1)導出初始關系模式圖4-5關系模式集
2)關系子模式子模式是用戶所用到的那部分數(shù)據(jù)的描述。除了指出用戶用到的數(shù)據(jù)外,還應指出數(shù)據(jù)與概念模式中相應數(shù)據(jù)的聯(lián)系,即指出概念模式與子模式之間的對應性。圖書信息子模式((編號#,資料名稱,作者,出版社,出版日期,ISBN,資料類別,購買日期,保管人,備注)用戶信息子模式(編號,用戶代碼,用戶姓名,登錄口令,使用權限,查詢顯示項,用戶顯示頭像)圖4-6部分子模式4.3.3數(shù)據(jù)庫的實現(xiàn)我們選用MicrosoftOffice中的Access數(shù)據(jù)庫來進行數(shù)據(jù)庫的邏輯設計。首先創(chuàng)建四個基本數(shù)據(jù)庫表如如4-1-4-5所示,然后建立各個表之間的聯(lián)系,如圖4-8所示。第五章局域圖書資料查詢系統(tǒng)應用程序設計§5.1系統(tǒng)模塊組成§5.2登錄模塊實現(xiàn)圖5-2登錄模塊圖
該窗口所含的控件信息如下:風格控件名說明用戶名SinglelineeditSle_1
口令SinglelineeditSle_1Propeties:passwd登錄日期EditMaskEm_1masktype:datamm/dd/yyyy表5-1登錄模塊控件信息表控件:Sle_1
事件(event):Modified
Scriptofmodified: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://查找不到符合條件的記錄則提示elsemessagebox("錯誤!",&"error:"+string(sqlca.sqldbcode)&+"information:"+sqlca.sqlerrtext)file://SQL出錯提示endifendif控件:Sle_2
事件(event):Modified
Scriptofmodified:stringinput_passwd,passwd,droitinput_passwd=RightTrim(this.text)//去掉輸入值右邊的空格selectpasswdinto:passwdfromkeeperwherename=:sle_1.text;passwd=RightTrim(passwd);//從用戶表中校驗口令的正確性ifsqlca.sqlcode=0thenifinput_passwd<>passwdthen
messagebox('口令錯誤','對不起,請重新輸入',stopsign!);
sle_2.SelectText(1,Len(sle_2.Text))
this.Clear()//口令錯誤則清除輸入內容
setfocus(sle_2)elseifinput_passwd=passwdthenuser=righttrim(sle_1.text)selectdroitinto:droit
fromkeeper
wherename=:user;//口令正確將用戶操作權限賦值給變量open(main)//打開程序主窗口
close(w_login)//關閉登錄窗口endifelseifsqlca.sqlcode=100thenmessagebox('提示!','無數(shù)據(jù)',Stopsign!)return1elsemessagebox("錯誤!",&"error:"+string(sqlca.sqldbcode)&+"information:"+sqlca.sqlerrtext)file://SQL出錯提示endif在登錄模塊中,用戶可輸入自己的編號或編碼來登錄系統(tǒng)。系統(tǒng)會根據(jù)用戶輸入的編號或編碼值來自動給出確實已存在庫中的用戶中文名,若查找不到庫中相匹配的記錄則提示出錯或重輸。若用戶存在,則提示輸入口令,口令正確則會順利進入該系統(tǒng)主界面。更新打印Datawindowscontroldw_1對應數(shù)據(jù)窗口d_information圖書信息檢索Datawindowscontroldw_2對應數(shù)據(jù)窗口d_query_condition查詢條件檢索CommandbuttonCb_2模糊查詢操作符英-中轉換表5-2查詢模塊控件信息表控件:w_main
事件(event):open
Scriptofopenstringmode,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=1to8ifMid(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]////對應的數(shù)據(jù)窗口顯示情況dw_1.object.id.visible=falsedw_1..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ù)窗口設為只讀dw_1.Object.DataWindow.ReadOnly="Yes"控件:pb_12“存為默認顯示選項”事件(event):clicked
Scriptofclickedbooleancheck[10]integeri,answerstringxs_item[10]stringxs_content,question_text,tempquestion_text="將當前顯示項存為"+user+"用戶的默認顯示項?"answer=messagebox('提示!',question_text,question!,YesNoCancel!)choosecaseanswercase1file://將當前對應的CHECEKBOX選項記錄下來check[1]=cbx_2.checked
check[2]=cbx_3.checked
check[3]=cbx_4.checked
check[4]=cbx_5.checked
check[5]=cbx_6.checked
check[6]=cbx_7.checked
check[7]=cbx_8.checked
check[8]=cbx_9.checked//file://將顯示項轉化為01的顯示,存入數(shù)組變量
xs_content=''fori=1to8ifcheck[i]=truethenxs_item[i]='1'else
xs_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;case100messagebox('!','修改失敗!')
endchoosecase2returncase3returnendchoose5.3.1模糊(分類)查詢的實現(xiàn)圖5-4模糊查詢窗口控件:ddlb_1事件(selectionchanged):
ScriptofSelectionchangedfile://清空歷史查詢內容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):Clicked
ScriptofClickedfile://將查詢項轉換為表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'endchoose//將操作符轉換為中文顯示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):Clicked
ScriptofClickedstringrqdatedcb_2.TriggerEvent(clicked!)//將英文操作符轉換為中文顯示dw_1.setredraw(true)old_sql=dw_1.getsqlselect()//得到原有數(shù)據(jù)窗口的SQL語句ifddlb_1.text='出版日期'orddlb_1.text='購買日期'then//查詢項為日期類型em_1.GetData(d)//取出輸入的日期數(shù)據(jù)rq=String(d,"yyyy/mm/dd")//將輸入的日期數(shù)據(jù)轉換為字符型choosecasequery_operator//根據(jù)操作符的不同將新產生的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//根據(jù)操作符的不同將新產生的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//對原有數(shù)據(jù)窗口進行新的查詢ifdw_1.setsqlselect(new_sql)=-1thenbeep(3)
messagebox("警告","檢索失敗",stopsign!)elsedw_1.settransobject(sqlca)
dw_1.retrieve()dw_1.setsqlselect(old_sql)endif5.3.2組合查詢(條件查詢)模塊的實現(xiàn):case'column_name'item=dw_2.getitemstring(dw_2.getrow(),'column_name')//根據(jù)查詢項目改變操作符的顯示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)endif//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','不包含')endchooseendchoose控件:pb_2“插入”事件(event):Clicked
ScriptofClickedintrow,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):Clicked
ScriptofClickedintrow//如果當前行不為第一行,則允許刪除ifdw_2.getrow()<>1thenrow=dw_2.getrow()//將當前行行號賦值給變量dw_2.deleterow(row)//刪除當前行elsereturnendif控件:pb_4“檢索”事件(event):Clicked
ScriptofClickedLongrow_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////將查詢條件窗口的總行數(shù)賦值給變量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'ifi<>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=1torow_countnew_condition=new_condition+condition[i]nextold_sql1=dw_1.getsqlselect()new_sql1=old_sql1+"where"+new_condition//對原有數(shù)據(jù)窗口進行新的查詢dw_1.reset()ifdw_1.setsqlselect(new_sql1)=-1thenbeep(3)
messagebox("警告","檢索失敗",stopsign!)elsedw_1.settransobject(sqlca)
dw_1.retrieve()
dw_1.setsqlselect(old_sql1)endif5.3.3更新打印模塊實現(xiàn)圖5-6更新打印窗口控件:pb_7“修改”事件(event):Clicked
ScriptofClickedfile://取消亮條顯示一行,便于進行編輯dw_1.selectrow(dw_1.getrow(),false)//將數(shù)據(jù)窗口屬性設為可以修改dw_1.Object.DataWindow.ReadOnly="no"dw_1.settransobject(sqlca)//將焦點設置在數(shù)據(jù)窗口控件上dw_1.setfocus()//觸發(fā)dw_1的Getfocus事件dw_1.TriggerEvent(Getfocus!)//將
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 把握青春珍惜友誼教學計劃
- 2025防安全工作計劃
- 企管部年度工作計劃報告
- 老寨完小2025年春季學期數(shù)學教研工作計劃
- 供銷社企業(yè)改制發(fā)展計劃
- 學生素養(yǎng)教育教學計劃
- 2025小學教務處年度工作計劃2
- 月份工作總結范文與下月計劃
- 《計算機圖形學基礎與CAD開發(fā)》課件-第3章 二維圖形處理技術
- 2020版 滬教版 高中音樂 必修4音樂編創(chuàng) 下篇《第三單元 蹙金結繡》大單元整體教學設計2020課標
- 小學二年級數(shù)學上冊-加減乘除法口算題800道
- 國開2024年秋《機械制圖》形考作業(yè)1-4答案
- 計算機網(wǎng)絡智慧樹知到期末考試答案章節(jié)答案2024年上海電力大學
- MOOC 創(chuàng)業(yè)管理-江蘇大學 中國大學慕課答案
- 北師大六年級數(shù)學上冊期末復習計劃
- 小學“班級十星”評選活動實施方案
- m3352系列光盤epc9200i l512liv128li用戶手冊
- 雜志、期刊印刷授權書、委托書(共2頁)
- 對“體育后進生”進行轉化教育的思考及策略
- 《復式條形統(tǒng)計圖》PPT課件
- 排洪溝工程設計說明
評論
0/150
提交評論