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