公務(wù)員期刊網(wǎng) 精選范文 倉庫管理系統(tǒng)設(shè)計報告范文

倉庫管理系統(tǒng)設(shè)計報告精選(九篇)

前言:一篇好文章的誕生,需要你不斷地搜集資料、整理思路,本站小編為你收集了豐富的倉庫管理系統(tǒng)設(shè)計報告主題范文,僅供參考,歡迎閱讀并收藏。

倉庫管理系統(tǒng)設(shè)計報告

第1篇:倉庫管理系統(tǒng)設(shè)計報告范文

1.分析系統(tǒng)的各個環(huán)節(jié)

第一個環(huán)節(jié):采購交貨。在這里,采購?fù)緩酱篌w上指下列幾點(diǎn),也就是直購、招標(biāo)采購、購置等方式。要是實(shí)施采購訂單,一定要先把訂單交給有關(guān)單位,然后通過接收單位形成收貨通知單,將其輸送至倉庫管理單位。這種方式形成的收貨通知單,通常上面有訂單號。另一方面,訂單下達(dá)單位應(yīng)當(dāng)通知企業(yè)質(zhì)檢單位對所要采購的物品進(jìn)行檢查,尤其注意的問題是,檢測報告之中必須注明訂單號。倉庫管理單位必須準(zhǔn)備好入庫單,其上面必須備注上訂單號,同時還應(yīng)當(dāng)生成具有簽章的收貨憑證,在第一時間內(nèi)將其提供給物資供應(yīng)商。第二個環(huán)節(jié):物資入庫。倉庫管理單位在這一個環(huán)節(jié)中需要向質(zhì)檢單位發(fā)出通知,讓后者對所要入庫的物資進(jìn)行相應(yīng)的檢測,通過檢驗單辦理入庫單,同時需要提供檢測報告,倉庫單位應(yīng)當(dāng)認(rèn)真檢查質(zhì)檢單,并在上面簽章,這樣之后才能入庫。第三個環(huán)節(jié):客戶退貨入庫。此處存在2個情況,即品質(zhì)不達(dá)標(biāo)、供貨量高出合同量。對于第一種情況下的物資,庫倉管理單位應(yīng)當(dāng)按照合同與客戶質(zhì)量憑證認(rèn)真做好入庫單,同時還有向客戶提供收貨憑證。對于第二種情況,管理單位應(yīng)當(dāng)按照合同單號與客戶反饋單認(rèn)真做好物資入庫單,在此基礎(chǔ)上,還需向客戶提供收貨憑證。第四個環(huán)節(jié):出庫管理。

(1)出庫。企業(yè)管理單位發(fā)出發(fā)貨指令,然后倉庫管理單位按照接收到的指令、根據(jù)營銷計劃執(zhí)行相應(yīng)的工作,并且還要形成出庫單,并形成裝箱明細(xì),然后將其給予客戶。在這里,管理單位出庫單是批準(zhǔn)物資出庫的參考憑證,物流人員通過該單據(jù)向倉庫部門索要出庫單,以此來作為出庫的憑證。

(2)廢品處理。對于淘汰、積壓的物資,要是不存在任何價值,則能夠填寫廢品出庫單。在這里,積壓物資主要包括2類,也就是代儲代管型與合同采購型,應(yīng)當(dāng)依次設(shè)計相應(yīng)的系統(tǒng)對兩者加以處理。

(3)特殊出庫。當(dāng)急用物資出庫的時候,應(yīng)當(dāng)具備緊急出庫設(shè)計,同時需要設(shè)計出庫方法,從而能夠?qū)崿F(xiàn)特殊需求。

2.系統(tǒng)功能設(shè)計。

第一,系統(tǒng)作用設(shè)定與資料維護(hù)模塊。企業(yè)倉庫管理系統(tǒng)開發(fā)過程中,相關(guān)工作者能夠?qū)σ磺斜O(jiān)管規(guī)則進(jìn)行自定義,例如添加用戶、登陸等。使用者能夠按照各批產(chǎn)品形成一個獨(dú)一無二的標(biāo)簽,按照各自需求來對其序列號進(jìn)行定義,通過這種方式使不同的產(chǎn)品都獲得相應(yīng)的編碼規(guī)定。這樣肯定能夠為廣大客戶提供有利條件,使他們能夠輕松的在數(shù)據(jù)庫里面搜索各種產(chǎn)品的信息,并且還可以實(shí)現(xiàn)對各種操作的監(jiān)管。

第二,采購管理模塊。

(1)采購定單,如果企業(yè)需進(jìn)行物資采購,在這種情況下,可以填該定單,然而卻不會對庫存產(chǎn)生干擾;

(2)采購收貨,上面的定單通過后,到貨的時候,先將標(biāo)簽貼在物資上面,接著在收貨單上掃碼,這樣庫存就將其錄入;

(3)其他入庫,主要包括退貨、歸還借出的物資等,僅僅需填寫收貨單。

第三,倉庫管理模塊。

(1)產(chǎn)品入庫,物資入庫之后將形成相應(yīng)的入庫單號,具體來說,物資能夠通過退貨、正常入庫等方式。為充分保證企業(yè)物資安全,質(zhì)檢屬于其中的關(guān)鍵,在同時具備煤安標(biāo)志、三證、規(guī)格、名稱、型號、數(shù)量、質(zhì)量等的前提下,并且具備檢驗報告(由質(zhì)檢單位提供)才能夠入庫;

(2)產(chǎn)品出庫,能夠形成出庫單號,能夠分辨各種出庫渠道;

(3)庫存管理:無須進(jìn)行手動管理,當(dāng)物資出入倉庫的過程中,系統(tǒng)將會自動產(chǎn)生不同物資的庫存量,為進(jìn)行查詢提供條件;

(4)特殊產(chǎn)品庫,為滿足顧客區(qū)分物資品種的需求,能夠針對各種物品設(shè)計虛擬倉庫管理;

(5)代儲產(chǎn)品庫,也就是按照協(xié)議進(jìn)行管理與銷售結(jié)算;

(6)盤點(diǎn)管理,用戶可定期或者不定期的對其中的物資品種進(jìn)行盤點(diǎn),并產(chǎn)生相應(yīng)的單據(jù),大大提高了該項業(yè)務(wù)的速度;

(7)庫存報警,針對物資品種的庫存設(shè)置一定的門限,在其無法滿足實(shí)際定量的時候,在這種情況下,系統(tǒng)將進(jìn)行報警。

3.生產(chǎn)報表模塊

這一個系統(tǒng)里面,各種類型的物資報表局能夠自動生成,不僅如此,用戶同時能夠自定義要求制定一系列的報表。

4.生成查詢統(tǒng)計模塊倉庫管理

系統(tǒng)開發(fā)工作者能夠開發(fā)不同類型的查詢模塊,在這里,主要涉及到庫存、采購單、銷售單等諸多查詢模塊。上述的各種查詢均能夠按照產(chǎn)品滿足的條件來實(shí)現(xiàn),包括物資出庫時間、客戶、序列號等方面。

二、系統(tǒng)實(shí)現(xiàn)研究

這一部分主要包括系統(tǒng)構(gòu)成、設(shè)計平臺與相關(guān)的工具。具體如下所示:

1.構(gòu)成。這一個系統(tǒng)主要是基于模式,將數(shù)據(jù)庫與兩個技術(shù)方法進(jìn)行充分融合,最終形成一種新技術(shù),其開發(fā)與運(yùn)用環(huán)境相分離。這一個系統(tǒng)存在諸多方面的優(yōu)點(diǎn),一方面,數(shù)據(jù)具有非常強(qiáng)的實(shí)時性,另一方面非常易于追蹤數(shù)據(jù)。

第2篇:倉庫管理系統(tǒng)設(shè)計報告范文

關(guān)鍵詞:中小物流企業(yè);信息化;成本控制

中圖分類號:F253.7 文獻(xiàn)標(biāo)識碼:A

Abstract: Starting from the definition of small and medium-sized logistics enterprises cost structure and control methods, the significance of the establishment of functional information system for small and medium-sized logistics enterprises to strengthen cost accounting and control issues is analyzed, and the goal of the implementation of information technology to control costs and strategy to reduce logistics costs in the optimization model are discussed.

Key words: small and medium-sized logistics enterprises; informatization; cost control

我國物流產(chǎn)業(yè)處在發(fā)展的初期,中小物流企業(yè)是該產(chǎn)業(yè)的主力軍,他們以富于靈活多變的經(jīng)營方式,服務(wù)于各類物流需求企業(yè)。他們彼此競爭,優(yōu)勝劣汰,不斷推動物流產(chǎn)業(yè)向前發(fā)展。然而由于物流服務(wù)業(yè)正處于快速成長期,物流行業(yè)和企業(yè)自身的規(guī)范管理存在很多問題,其中物流企業(yè)的成本核算與控制問題顯得尤其突出。我國的中小型物流企業(yè)大多采用的還是傳統(tǒng)的成本管理手段,中小物流企業(yè)比較注重成本核算分析的事后處理,忽視了成本管理的事前預(yù)測和生產(chǎn)過程相關(guān)環(huán)節(jié)的控制,因而使得物流成本高居不下。

1 中小物流企業(yè)的成本構(gòu)成與控制概述

物流企業(yè)的成本是指物流企業(yè)在包裝、裝卸、運(yùn)輸、倉儲、流通加工、增值服務(wù)以及物流信息等過程中耗費(fèi)的活勞動和物化勞動貨幣表現(xiàn)的總和。物流企業(yè)成本大致是由包裝成本、裝卸成本、運(yùn)輸成本、倉儲成本、流通加工成本、配送成本、增值服務(wù)成本及物流信息成本等構(gòu)成。其中增值服務(wù)成本是指物流企業(yè)在達(dá)到傳統(tǒng)物流基本功能的基礎(chǔ)上,根據(jù)顧客需求額外提供的延伸業(yè)務(wù)所發(fā)生的成本。在物流企業(yè)總的成本中,運(yùn)輸成本及配送成本占的比例較大。

當(dāng)前,物流成本控制主要分為部分成本控制和全面成本控制。部分成本控制主要是指對形成物流成本的各個部分施以控制,例如,運(yùn)輸成本控制、裝卸成本控制、包裝成本控制,等等。全面成本控制是指對物流活動事前預(yù)算控制,事中行為控制和事后信息反饋及偏差糾錯控制。

2 信息化程度較低、信息化系統(tǒng)功能不完善對中小物流企業(yè)成本管理的制約

現(xiàn)代信息系統(tǒng)的使用是物流業(yè)務(wù)開展和物流成本控制的關(guān)鍵。通過信息技術(shù),中小物流企業(yè)可以將影響到物流成本的各塊作業(yè)活動信息很好地共享,從而對物流作業(yè)的整個過程有一個全局的把握,對物流作業(yè)成本進(jìn)行分析與控制。并且,現(xiàn)代信息系統(tǒng)網(wǎng)絡(luò)除了提高中小企業(yè)內(nèi)部效率外,還使供應(yīng)鏈上的所有企業(yè)形成一種效率鏈接,能有效地將搜集到的物料的價格、數(shù)量等在網(wǎng)上傳輸、共享,從而避免交叉、重復(fù)的物流現(xiàn)象發(fā)生。通過構(gòu)建物流企業(yè)與其他相關(guān)方企業(yè)之間的物流供應(yīng)鏈信息化系統(tǒng),形成一個巨大網(wǎng)絡(luò),中小物流企業(yè)能夠從整體上控制物流成本。

目前我國中小物流企業(yè)信息化程度較低。平時的通訊與聯(lián)系主要是電話(包括移動電話)與傳真機(jī),這不僅準(zhǔn)確率低、及時性差,而且出錯率高。很多中小物流企業(yè)的物流成本控制采用的是手工操作,很難實(shí)現(xiàn)各個環(huán)節(jié)的最優(yōu)化控制。中國倉儲協(xié)會調(diào)查顯示,絕大多數(shù)中小物流企業(yè)尚不具備運(yùn)用現(xiàn)代信息技術(shù)處理物流信息的能力。在擁有信息系統(tǒng)的中小物流企業(yè)中,其信息系統(tǒng)的業(yè)務(wù)功能和系統(tǒng)功能還不完善,缺乏必要的訂單管理、貨物跟蹤、倉庫管理系統(tǒng)和運(yùn)輸管理系統(tǒng)等物流服務(wù)系統(tǒng),物流信息資源的整合能力尚未形成。因此,信息化程度較低、信息化系統(tǒng)功能不完善制約著我國中小物流企業(yè)成本管理水平的提高。

3 中小物流企業(yè)信息化中成本控制的策略

3.1 中小物流企業(yè)實(shí)施信息化控制成本的目標(biāo)

目前,很多中小型物流企業(yè)迫切需要信息化手段來解決一些發(fā)展瓶頸,但卻不知道自己的真正需求在哪里,因此對他們而言一個小而全的信息化方案是必要的。中小物流企業(yè)建立的信息管理系統(tǒng)應(yīng)包括倉庫管理系統(tǒng)、客戶關(guān)系管理系統(tǒng)、運(yùn)輸管理系統(tǒng)、財務(wù)管理系統(tǒng),其中成本分析子系統(tǒng)是財務(wù)管理系統(tǒng)中的重要部分。通過建立這些系統(tǒng)解決中小物流企業(yè)信息資源的采集問題。這不僅要收集包括訂貨單、存貨單、應(yīng)付賬、交易條款、用戶情況等大量內(nèi)部數(shù)據(jù)資料和信息,還要收集外部的供應(yīng)鏈上各參與方的信息。此外,還要求在包括定貨、采購、維修、服務(wù)、交易、存儲、運(yùn)輸?shù)雀鱾€環(huán)節(jié),采用最新的信息技術(shù),縮短運(yùn)作的時間,減小運(yùn)作成本。信息化管理需依靠軟件開發(fā)人才與會計人才合作,一同開發(fā)適應(yīng)目前我國中小物流企業(yè)的成本核算與控制的應(yīng)用軟件,此軟件的功能應(yīng)做到方便實(shí)用,最基本的要求是可對中小物流企業(yè)接到的每個任務(wù)的全部成本、費(fèi)用進(jìn)行核算,所有數(shù)據(jù)只需輸入原始數(shù)額以及所設(shè)定的參數(shù),結(jié)果能自動生成。

3.2 間接成本分?jǐn)倳r采用作業(yè)成本核算法

很多中小物流公司一直采用傳統(tǒng)的物流成本核算方法。由于間接成本分?jǐn)偛缓侠恚瑹o法對客戶進(jìn)行有效的成本和利潤分析。我國研究物流成本的控制文獻(xiàn)中,對合理控制物流成本主要采用定額法和作業(yè)成本法。而作業(yè)成本法是以作業(yè)管理為中心,包裝、倉儲、運(yùn)輸、裝卸等作業(yè)環(huán)節(jié)分工明確,對各個作業(yè)進(jìn)行管理,能有效地控制成本,所以中小物流企業(yè)有必要以作業(yè)成本法等新的核算理論作為指導(dǎo),對成本核算的方法進(jìn)行改進(jìn)。根據(jù)客戶的物流作業(yè)活動,準(zhǔn)確地計算出物流成本,不僅可以為物流服務(wù)的報價提供依據(jù),對客戶進(jìn)行選擇,而且可以對具體的物流作業(yè)過程進(jìn)行更準(zhǔn)確的成本控制,進(jìn)而使企業(yè)獲得成本上的優(yōu)勢。在中小物流企業(yè)實(shí)施信息化的前提下,以信息為基礎(chǔ)的作業(yè)成本法開始變得具有可行性,通過信息的共享與有效傳遞,中小物流有可能充分利用作業(yè)成本法來計算分析成本,從而更有效地進(jìn)行成本管理與控制。

3.3 以派車單號(訂單號)為對象歸集各種運(yùn)輸費(fèi)用的方法

中小物流企業(yè)的運(yùn)輸業(yè)務(wù)和信息反饋常采用如表1所示的表格,以便匯總各項費(fèi)用。該表格雖然便于物流公司按照車輛匯總費(fèi)用,但是不利于公司計算每次運(yùn)輸作業(yè)的費(fèi)用,進(jìn)而計算每個客戶運(yùn)輸業(yè)務(wù)的盈虧,企業(yè)無法為客戶提供具有競爭力的報價,導(dǎo)致客戶的流動性較大,客戶的維護(hù)費(fèi)用較高,公司的效益停滯不前。

由于中小物流企業(yè)的人力資源、財力、信息系統(tǒng)及實(shí)施成本等的制約,使得嚴(yán)格意義上的作業(yè)成本法在中小物流企業(yè)難以得到應(yīng)用。筆者認(rèn)為,針對在運(yùn)輸中發(fā)生各種費(fèi)用,例如燃油費(fèi)、停車費(fèi)、修理費(fèi)、裝修費(fèi)等,物流企業(yè)在建立成本管理模型時可以以派車單號(或者訂單號)作為對象進(jìn)行運(yùn)輸費(fèi)用的匯總,然后與客戶運(yùn)價相比,計算某一客戶的收益貢獻(xiàn)。這種在作業(yè)成本法指導(dǎo)下的簡易模型的建立使得成本核算按派車單號來劃分,從整體上來控制成本,而不是分解來控制成本,從而使物流成本降到最低。此外,根據(jù)這種模型可以及時統(tǒng)計各種數(shù)據(jù),將客戶進(jìn)行分類,也便于將客戶等級和服務(wù)費(fèi)等掛鉤,為財務(wù)進(jìn)行物流成本分析提供真實(shí)資料。

3.4 在成本管理信息系統(tǒng)中合理設(shè)置和運(yùn)用關(guān)鍵指標(biāo)以控制成本

中小物流企業(yè)為了對物流成本客觀、科學(xué)地進(jìn)行控制,有必要在成本管理信息系統(tǒng)中設(shè)置和運(yùn)用關(guān)鍵指標(biāo)控制成本,并提供財務(wù)提醒功能。下面列舉幾組代表性和可操作性強(qiáng)的指標(biāo):

(1)燃料消耗指標(biāo)

評價燃料消耗的指標(biāo)主要有單位實(shí)際消耗、燃料消耗定額比,它反映了運(yùn)輸活動中燃料消耗的情況,可以促進(jìn)企業(yè)加強(qiáng)對燃料消耗的管理。其計算公式為:

單位實(shí)際油耗(升/百噸千米)=報告期實(shí)際油耗/報告期運(yùn)輸百噸千米數(shù)

燃料消耗定額比=百千米燃料實(shí)耗量/百千米燃料定額量

(2)配送成本指標(biāo)

配送是第三方物流企業(yè)的主營業(yè)務(wù),也是第三方物流企業(yè)降低物流成本、增強(qiáng)核心競爭力的重要方面。配送通常通過集中、配貨等環(huán)節(jié),將不同供應(yīng)商和眾多品種的貨物進(jìn)行統(tǒng)一運(yùn)送,利用規(guī)模優(yōu)勢以較低的單位運(yùn)作成本來開發(fā)利潤空間。配送成本指標(biāo)主要用于考核分析配送過程中發(fā)生的成本費(fèi)用。

①每噸重配送成本=配送成本/配送總重量

②每容積貨物配送成本=配送成本/配送貨物總?cè)莘e

③每車次配送成本=配送成本/配送總車次

④每公里配送成本=配送成本/配送總距離

(3)車輛空車率指標(biāo)

車輛空車率指標(biāo)可以用于衡量車輛的利用率。若該比率過高,表示物流企業(yè)未能充分做到回程順載的原則,或者未能合理安排好配送路線,以致造成實(shí)車去、空車回的現(xiàn)象。

空車率=空車走行距離/配送總距離×100%

4 總 結(jié)

現(xiàn)代信息技術(shù)使物流企業(yè)成本管理的控制與管理更為方便有效,而實(shí)施全面信息化方案成本較高,開發(fā)出合適的物流軟件并非易事,需要很大的投資。希望本文提出的策略能幫助中小物流企業(yè)克服信息化實(shí)施過程中的障礙,使其物流成本降低到較低的水平。

參考文獻(xiàn):

[1] 陳勝群. 現(xiàn)代成本管理概論[M]. 上海:立信會計出版社,2000.

[2] 楊英. 物流企業(yè)財務(wù)管理系統(tǒng)設(shè)計與實(shí)現(xiàn)[J]. 沈陽航空工業(yè)學(xué)院學(xué)報,2006(4):42-44.

[3] 蹇令香,李世民. 第三方物流企業(yè)作業(yè)成本控制績效評價[J]. 大連海事大學(xué)學(xué)報,2006(11):1-4.

[4] 王華. 企業(yè)物流成本控制研究[D]. 武漢:武漢理工大學(xué)(博士學(xué)位論文),2006.

第3篇:倉庫管理系統(tǒng)設(shè)計報告范文

本系統(tǒng)主要完成對圖書倉庫的庫存管理,包括圖書入庫、出庫、庫存,員工信息,供應(yīng)商信息以及密碼管理等六個方面。系統(tǒng)可以完成對各類信息的瀏覽、查詢、添加、刪除、修改、報表等功能。

系統(tǒng)的核心是入庫、庫存和出庫三者之間的聯(lián)系,每一個表的修改都將聯(lián)動的影響其它的表,當(dāng)完成入庫或出庫操作時系統(tǒng)會自動地完成庫存的修改。查詢功能也是系統(tǒng)的核心之一,在系統(tǒng)中即有單條件查詢和多條件查詢,也有精確查詢和模糊查詢,系統(tǒng)不僅有靜態(tài)的條件查詢,也有動態(tài)生成的條件查詢,其目的都是為了方便用戶使用。系統(tǒng)有完整的用戶添加、刪除和密碼修改功能,并具備報表打印功能。

系統(tǒng)采用microsoft office中的access 2000來設(shè)計數(shù)據(jù)庫,并使用當(dāng)前優(yōu)秀的開發(fā)工具—delphi 6.0 ,它有著最為靈活的數(shù)據(jù)庫結(jié)構(gòu),對數(shù)據(jù)庫應(yīng)用有著良好的支持。

論文主要介紹了本課題的開發(fā)背景,所要完成的功能和開發(fā)的過程。重點(diǎn)的說明了系統(tǒng)設(shè)計的重點(diǎn)、設(shè)計思想、難點(diǎn)技術(shù)和解決方案。

關(guān)鍵字:數(shù)據(jù)庫,sql語言,delph 6,數(shù)據(jù)庫組件,倉庫管理

目  錄

第一章 引言 ……………………………………………………………………………1

1.1  課題來源 ……………………………………………………………………1

1.2  開發(fā)工具的選擇  ……………………………………………………………2

1.3  所做的主要工作  ……………………………………………………………3

第二章 數(shù)據(jù)庫概論 ……………………………………………………………………4

2.1  數(shù)據(jù)庫的發(fā)展  ………………………………………………………………4

   2.1.1  數(shù)據(jù)庫的發(fā)展 …………………………………………………………4

   2.1.2  數(shù)據(jù)庫階段的特點(diǎn) ……………………………………………………5

   2.1.3  數(shù)據(jù)庫技術(shù) ……………………………………………………………6

2.2  數(shù)據(jù)庫理論基礎(chǔ)  ……………………………………………………………7

   2.2.1  數(shù)據(jù)庫模型 ……………………………………………………………7

   2.2.2  數(shù)據(jù)庫體系結(jié)構(gòu)    ……………………………………………………10

   2.2.3  數(shù)據(jù)的獨(dú)立性  ………………………………………………………11

   2.2.4  范式  …………………………………………………………………11

2.3  sql語言基礎(chǔ)   ……………………………………………………………13

   2.3.1  sql簡介  ……………………………………………………………13

   2.3.2  sql查詢    ……………………………………………………………13

   2.3.3  sql數(shù)據(jù)更新    ………………………………………………………14

第三章數(shù)據(jù)庫開發(fā)工具  ……………………………………………………………16

3.1  delphi 6.0 簡介  ……………………………………………………………16

3.2  delphi 6.0 控件  ……………………………………………………………17

3.2.1  ado數(shù)據(jù)訪問組件   …………………………………………………17

   3.2.2  數(shù)據(jù)控制類datacontrol    ……………………………………………18

   3.2.3  數(shù)據(jù)訪問類dataaccess     ……………………………………………18

   3.2.4  sql語言在delphi中的應(yīng)用    ………………………………………19

3.3  access 簡介    ………………………………………………………………21

第四章 系統(tǒng)總體設(shè)計   ………………………………………………………………23

4.1 系統(tǒng)需求分析     ……………………………………………………………23

4.2 系統(tǒng)概要設(shè)計     ……………………………………………………………25

   4.2.1  系統(tǒng)結(jié)構(gòu)設(shè)計    ………………………………………………………25

   4.2.2  數(shù)據(jù)庫設(shè)計    …………………………………………………………27

       4.2.2.1  er圖設(shè)計  ……………………………………………………27

       4.2.2.2  數(shù)據(jù)庫表格設(shè)計………………………………………………29

4.3系統(tǒng)詳細(xì)設(shè)計………………………………………………………………34

第五章 系統(tǒng)應(yīng)用程序設(shè)計  …………………………………………………………37

5.1  系統(tǒng)窗體模塊組成…………………………………………………………37

5.2  數(shù)據(jù)模塊窗體設(shè)置…………………………………………………………38

5.3  主窗體功能模塊的實(shí)現(xiàn)……………………………………………………39

5.4  入庫、出庫窗體模塊的實(shí)現(xiàn)………………………………………………43

5.5  查詢功能的實(shí)現(xiàn)……………………………………………………………51

5.6  系統(tǒng)登陸窗體模塊的實(shí)現(xiàn)…………………………………………………52

5.7  用戶管理功能的實(shí)現(xiàn)………………………………………………………54

   5.7.1  用戶管理主窗體  ……………………………………………………54

5.7.2  密碼修改窗體模塊的實(shí)現(xiàn)    …………………………………………54

   5.7.3  用戶注冊窗體模塊的實(shí)現(xiàn)    …………………………………………55

   5.7.4  用戶注銷窗體模塊的實(shí)現(xiàn)    …………………………………………57

結(jié)束語 …………………………………………………………………………………59

致謝 ……………………………………………………………………………………60

參考文獻(xiàn) ………………………………………………………………………………61

第一章    引  言  

§1.1   課題來源

隨著社會經(jīng)濟(jì)的迅速發(fā)展和科學(xué)技術(shù)的全面進(jìn)步,計算機(jī)事業(yè)的飛速發(fā)展,以計算機(jī)與通信技術(shù)為基礎(chǔ)的信息系統(tǒng)正處于蓬勃發(fā)展的時期。隨著經(jīng)濟(jì)文化水平的顯著提高,人們對生活質(zhì)量及工作環(huán)境的要求也越來越高。書籍做為人類的精神食糧,在現(xiàn)代社會中越來越受到重視,大量的書籍出現(xiàn)在市場上,人們有了各種各樣不同的選擇。與此同時,為了管理大量的圖書,圖書倉庫也大量的出現(xiàn),倉庫的管理問題也就提上了日程。隨著圖書的大量增加,其管理難度也越來越大,如何優(yōu)化倉庫的日常管理也就成為了一個大眾化的課題。

在計算機(jī)飛速發(fā)展的今天,將計算機(jī)這一信息處理利器應(yīng)用于倉庫的日常管理已是勢必所然,而且這也將為倉庫管理帶來前所未有的改變,它可以帶來意想不到的效益,同時也會為企業(yè)的飛速發(fā)展提供無限潛力。采用計算機(jī)管理信息系統(tǒng)已成為倉庫管理科學(xué)化和現(xiàn)代化的重要標(biāo)志,它給企業(yè)管理來了明顯的經(jīng)濟(jì)效益和社會效益。主要體現(xiàn)在:

極大提高了倉庫工作人員的工作效率,大大減少了以往入出存流程繁瑣,雜亂,周期長的弊端。

基于倉庫管理的全面自動化,可以減少入庫管理、出庫管理及庫存管理中的漏洞,可以節(jié)約不少管理開支,增加企業(yè)收入。

倉庫的管理的操作自動化和信息的電子化,全面提高了倉庫的管理水平。

隨著我國改革開放的不斷深入,經(jīng)濟(jì)飛速的發(fā)展,企業(yè)要想生存、發(fā)展,要想在激烈的市場競爭中立于不敗之地,沒有現(xiàn)代化的管理是萬萬不行的,倉庫管理的全面自動化、信息化則是其中極其重要的部分。為了加快倉庫管理自動化的步伐,提高倉庫的管理業(yè)務(wù)處理效率,建立倉庫管理系統(tǒng)已變得十分心要。

入庫、庫存、出庫還是現(xiàn)在企業(yè)圖書倉庫管理的常規(guī)基本模式,雖然,最近又出現(xiàn)了很多新的管理模式,如:基于零庫存思想的沃爾瑪特管理方式,但這些新的思想在

第二章    數(shù)據(jù)庫概論

§2.1     數(shù)據(jù)庫的發(fā)展

數(shù)據(jù)庫處理在信息系統(tǒng)的研究中一直是非常重要的主題,然而,近年來,隨著world wide web(/yingyongwengao/" target="_blank" title="">應(yīng)用超越具有早期應(yīng)用特點(diǎn)的簡單的。同時,internet技術(shù)提供了一種向用戶數(shù)據(jù)庫內(nèi)容的標(biāo)準(zhǔn)化的訪問方法。這些技術(shù)沒有脫離經(jīng)典數(shù)據(jù)庫技術(shù)的要求。它們只是加重了數(shù)據(jù)庫技術(shù)的重要性。

數(shù)據(jù)庫的設(shè)計和開發(fā)及包括藝術(shù)有包括工程。理解用戶的需求,然后,把它們轉(zhuǎn)變?yōu)橛行У臄?shù)據(jù)庫設(shè)計是一個藝術(shù)過程。把設(shè)計轉(zhuǎn)變?yōu)閷?shí)際的數(shù)據(jù)庫,并且這些數(shù)據(jù)庫帶有功能完備、高效能的應(yīng)用,是一個工程過程。

數(shù)據(jù)庫的目的是幫助人們跟蹤事務(wù)。經(jīng)典的數(shù)據(jù)庫應(yīng)用涉及諸如訂單、顧客、工作、員工、學(xué)生、電話之類的項,或其它數(shù)據(jù)量較大、需要密起關(guān)注的事務(wù)。最近,由于數(shù)據(jù)庫的普及,數(shù)據(jù)庫技術(shù)已經(jīng)被應(yīng)用到了新的領(lǐng)域,諸如用于internet的數(shù)據(jù)庫或用于公司內(nèi)聯(lián)網(wǎng)的數(shù)據(jù)庫。數(shù)據(jù)庫也被越來越多地應(yīng)用于生成和維護(hù)多媒體應(yīng)用程序上。

計算機(jī)的數(shù)據(jù)處理應(yīng)用,首先要把大量的信息以數(shù)據(jù)形式存放在存儲器中。存儲器的容量、存儲速率直接影響到數(shù)據(jù)管理技術(shù)的發(fā)展。從1956年生產(chǎn)出第一臺計算機(jī)到現(xiàn)在,存儲器的發(fā)展,為數(shù)據(jù)庫技術(shù)提供了良好的物質(zhì)基礎(chǔ)。

使用計算機(jī)以后,數(shù)據(jù)處理的速度和規(guī)模,無論是相對于手工方式,還是機(jī)械方式,都有無可比擬的優(yōu)勢。通常在數(shù)據(jù)處理中,計算是比較簡單的而數(shù)據(jù)的管理卻比較復(fù)雜。數(shù)據(jù)管理是指數(shù)據(jù)的收集、整理、組織、存儲、維護(hù)、檢索、傳送等操作,這部分操作是數(shù)據(jù)處理業(yè)務(wù)的基本環(huán)節(jié),而且是任何數(shù)據(jù)處理業(yè)務(wù)中必不可少的共有部分。數(shù)據(jù)管理技術(shù)的優(yōu)劣,將直接影響數(shù)據(jù)處理的效率。

2.1.1  數(shù)據(jù)庫的發(fā)展

數(shù)據(jù)管理技術(shù)的發(fā)展,與硬件(主要是外存)、軟件、計算機(jī)應(yīng)用的范圍有密切的聯(lián)系。數(shù)據(jù)管理技術(shù)的發(fā)展經(jīng)過三個階段:人工管理階段、文件系統(tǒng)階段和數(shù)據(jù)庫階段。

人工管理階段和文件系統(tǒng)階段都有著相當(dāng)多的缺陷,諸如數(shù)據(jù)冗余性 ,數(shù)據(jù)不一致性以及數(shù)據(jù)聯(lián)系弱等等。也正是由于這些原因,促使人們研究新的數(shù)據(jù)管理技術(shù),從而產(chǎn)生了數(shù)據(jù)庫技術(shù)。

20世紀(jì)60年代末發(fā)生的三件大事,層次模型ims系統(tǒng)的推出、關(guān)于網(wǎng)狀模型dbtg報告的發(fā)表以及關(guān)于關(guān)系模型論文的連續(xù)發(fā)表標(biāo)志著數(shù)據(jù)管理技術(shù)進(jìn)入數(shù)據(jù)庫階段。進(jìn)入70年代以后,數(shù)據(jù)庫技術(shù)得到迅速發(fā)展,開發(fā)了許多有效的產(chǎn)品并投入運(yùn)行。數(shù)據(jù)庫系統(tǒng)克服了文件系統(tǒng)的缺陷,提供了對數(shù)據(jù)更高級更有效的管理。

當(dāng)進(jìn)入數(shù)據(jù)庫階段后,隨著數(shù)據(jù)管理規(guī)模一再擴(kuò)大,數(shù)據(jù)量急劇增加,為了提高效率,開始時,人們只是對文件系統(tǒng)加以擴(kuò)充,在應(yīng)用文件中建立了許多輔助索引,形成倒排文件系統(tǒng)。但這并不能最終解決問題。在20世紀(jì)60年代末,磁盤技術(shù)取得重要進(jìn)展,具有數(shù)百兆容量和快速存取的磁盤陸續(xù)進(jìn)入市場,成本也不高,為數(shù)據(jù)庫技術(shù)的產(chǎn)生提供了良好的物質(zhì)條件。

2.1.2  數(shù)據(jù)庫階段的特點(diǎn)

(1)減少數(shù)據(jù)的重復(fù)(redundancy can be reduced)

當(dāng)在一個非數(shù)據(jù)庫系統(tǒng)當(dāng)中,每一個應(yīng)用程序都有屬于他們自己的文件,由于無法有系統(tǒng)建立的數(shù)據(jù),因此常常會造成存儲數(shù)據(jù)的重復(fù)與浪費(fèi)。例如:在一家公司當(dāng)中,人事管理程序與工資管理程序或許都會使用到職員與部門的信息或文件,而我們可以運(yùn)用數(shù)據(jù)庫的方法,把這兩個文件整理起來,以減少多余的數(shù)據(jù),過度地占用存儲空間。

(2)避免數(shù)據(jù)的不一致(inconsistency can avoid)

本項的特色,可以說是延伸前項的一個特點(diǎn),要說明這樣的一個現(xiàn)象,我們可以從下面這個實(shí)例來看:若是在同一家公司當(dāng)中,職員甲在策劃部門工作,且職員甲的記錄同時被存放在數(shù)據(jù)庫的兩個地方,而數(shù)據(jù)庫管理系統(tǒng)卻沒有對這樣重要的情況加以控制,當(dāng)其中一條數(shù)據(jù)庫被修改時,便會造成數(shù)據(jù)的不一致,但是,對于一個健全的數(shù)據(jù)庫管理系統(tǒng)而言,將會對這樣的情況加以控制,但有時并不需要刻意消除這種情形,應(yīng)當(dāng)視該數(shù)據(jù)庫的需求與效率來決定。                      

(3)數(shù)據(jù)共享(data shared)

對于數(shù)據(jù)共享的意義,并不是只有針對數(shù)據(jù)庫設(shè)計的應(yīng)用程序,可以使用數(shù)據(jù)庫中的數(shù)據(jù),對于其他撰寫好的應(yīng)用程序,同樣可以對相同數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)進(jìn)行處理,進(jìn)而達(dá)到數(shù)據(jù)共享的目的。

(4)強(qiáng)化數(shù)據(jù)的標(biāo)準(zhǔn)化(standard can be enforced)

由數(shù)據(jù)庫管理系統(tǒng),對數(shù)據(jù)做出統(tǒng)籌性的管理,對于數(shù)據(jù)的格式與一些存儲上的標(biāo)準(zhǔn)進(jìn)行控制,如此一來,對于不同的環(huán)境的數(shù)據(jù)交換(data interchange)上將有很大的幫助,也能提高數(shù)據(jù)處理的效率。

(5)實(shí)踐安全性的管理(security restriction can be applied)

通過對數(shù)據(jù)庫完整的權(quán)限控制,數(shù)據(jù)庫管理者可以確認(rèn)所有可供用戶存取數(shù)據(jù)的合法途徑渠道,并且可以事先對一些較重要或關(guān)鍵性的數(shù)據(jù)進(jìn)行安全檢查,以確保數(shù)據(jù)存取時,能夠?qū)⑷魏尾划?dāng)損毀的情形降至最低。

(6)完整性的維護(hù)(integrity can be maintained)

所謂完整性的問題,就是要確認(rèn)某條數(shù)據(jù)在數(shù)據(jù)庫當(dāng)中,是正確無誤的。正如(2)所述,若是無法控制數(shù)據(jù)的不一致性,便會產(chǎn)生完整性不足的問題,所以,我們會發(fā)現(xiàn),當(dāng)數(shù)據(jù)重復(fù)性高的時候,數(shù)據(jù)不完整的情形也會增加,當(dāng)然,若是數(shù)據(jù)庫的功能完整,將會大大地提高數(shù)據(jù)完整性,也會增加數(shù)據(jù)庫的維護(hù)能力與維護(hù)簡便性。

(7)需求沖突會獲得平衡(conflicting requirements can be balance)

在一個較大型的企業(yè)當(dāng)中,用戶不同的需求,往往會造成系統(tǒng)或數(shù)據(jù)庫在設(shè)計上的困擾,但是一個合適的數(shù)據(jù)庫系統(tǒng),可以通過數(shù)據(jù)庫管理員的管理,將會有效地整理各方面的信息,對于一些較重要的應(yīng)用程序,可以適時地提供較快速的數(shù)據(jù)存取方法與格式,以平衡多個用戶在需求上的沖突。

上述七個方面構(gòu)成了數(shù)據(jù)庫系統(tǒng)的主要特征。這個階段的程序和數(shù)據(jù)間的聯(lián)系可用下圖表示: 2.1.3  數(shù)據(jù)庫技術(shù)

從文件系統(tǒng)發(fā)展到數(shù)據(jù)庫系統(tǒng)是信息處理領(lǐng)域的一個重大變化。在文件系統(tǒng)階段,人們關(guān)注的中心問題是系統(tǒng)功能的設(shè)計,因而程序設(shè)計處于主導(dǎo)地位,數(shù)據(jù)只起著服從程序需要的作用。在數(shù)據(jù)庫方式下,信息處理觀念已為新體系所取代,數(shù)據(jù)占據(jù)了中心位置。數(shù)據(jù)結(jié)構(gòu)的設(shè)計成為信息系統(tǒng)首先關(guān)心的問題,而利用這些數(shù)據(jù)的應(yīng)用程序設(shè)計則退居到以既定的數(shù)據(jù)結(jié)構(gòu)為基礎(chǔ)的外圍地位。

目前世界上已有數(shù)百萬個數(shù)據(jù)庫系統(tǒng)在運(yùn)行,其應(yīng)用已經(jīng)深入到人類社會生活的各個領(lǐng)域,從企業(yè)管理、銀行業(yè)務(wù)、資源分配、經(jīng)濟(jì)預(yù)測一直到信息檢索、檔案管理、普查統(tǒng)計等。并在通信網(wǎng)絡(luò)基礎(chǔ)上,建立了許多國際性的聯(lián)機(jī)檢索系統(tǒng)。我國20世紀(jì)90年代初在全國范圍內(nèi)裝備了12個以數(shù)據(jù)庫技術(shù)為基礎(chǔ)的大型計算機(jī)系統(tǒng),這些系分布在郵電、計委、銀行、電力、鐵路、氣象、民航、情報、公安、軍事、航天和財稅等行業(yè)。

數(shù)據(jù)庫技術(shù)還在不斷的發(fā)展,并且不斷地與其它計算機(jī)技術(shù)相互滲透。數(shù)據(jù)庫技術(shù)與網(wǎng)絡(luò)通信技術(shù)相結(jié)合,產(chǎn)生了分布式數(shù)據(jù)庫系統(tǒng)。數(shù)據(jù)庫技術(shù)與面向?qū)ο蠹夹g(shù)相結(jié)合,產(chǎn)生了面向?qū)ο髷?shù)據(jù)庫系統(tǒng)。

在數(shù)據(jù)庫技術(shù)中有四個名詞,其概念應(yīng)該分清。

(1)數(shù)據(jù)庫(database,db):db是統(tǒng)一管理的相關(guān)數(shù)據(jù)的集合。db能為各種用戶共享,具有最小冗余度,數(shù)據(jù)間聯(lián)系密切,而又有較高的數(shù)據(jù)獨(dú)立性。

(2)數(shù)據(jù)庫管理系統(tǒng)(database management system,dbms):dbms是位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件,為用戶或應(yīng)用程序提供訪問db的方法,包括db的建立、查詢、更新及各種數(shù)據(jù)控制。dbms總是基于某種數(shù)據(jù)模型,可以分為層次型、網(wǎng)狀型、關(guān)系型和面向?qū)ο笮蚫bms。

(3)數(shù)據(jù)庫系統(tǒng)(database system,dbs):dbs是實(shí)現(xiàn)有組織地、動態(tài)地存儲大量關(guān)聯(lián)數(shù)據(jù),方便多用戶訪問的計算機(jī)軟件、硬件和數(shù)據(jù)資源組成的系統(tǒng),即采用了數(shù)據(jù)庫技術(shù)的計算機(jī)系統(tǒng)。

(4)數(shù)據(jù)庫技術(shù):這是一門研究數(shù)據(jù)庫的結(jié)構(gòu)、存儲、管理和使用的軟件學(xué)科。數(shù)據(jù)庫技術(shù)是操作系統(tǒng)的文件系統(tǒng)基礎(chǔ)上發(fā)展起來的。而dbms本身要在操作系統(tǒng)的支持下才能工作。數(shù)據(jù)庫不僅用到數(shù)據(jù)結(jié)構(gòu)的知識,而且豐富了數(shù)據(jù)結(jié)構(gòu)的內(nèi)容。在關(guān)系數(shù)據(jù)庫中要用到集合論、數(shù)理邏輯的理論。因此,數(shù)據(jù)庫技術(shù)是一門綜合性較強(qiáng)的學(xué)科。

§2.2數(shù)據(jù)庫理論基礎(chǔ)

2.2.1  數(shù)據(jù)庫模型

從20世紀(jì)50年代中期開始,計算機(jī)的應(yīng)用由科學(xué)研究部門逐步擴(kuò)展到企業(yè)、行政部門。至60年代,數(shù)據(jù)處理成為計算機(jī)的主要應(yīng)用。數(shù)據(jù)庫技術(shù)作為數(shù)據(jù)管理技術(shù),是計算機(jī)軟件領(lǐng)域的一個重要分支,產(chǎn)生于60年代末?,F(xiàn)已形成相當(dāng)規(guī)模的理論體系和實(shí)用技術(shù)。

模型是對現(xiàn)實(shí)世界的抽象。在數(shù)據(jù)庫技術(shù)中,我們用模型的概念描述數(shù)據(jù)庫的結(jié)構(gòu)與語義,對現(xiàn)實(shí)世界進(jìn)行抽象,表示實(shí)體類型及實(shí)體間聯(lián)系的模型稱為“數(shù)據(jù)模型” 。

目前廣泛作用的數(shù)據(jù)模型可分為兩種類型。

一種是獨(dú)立于計算機(jī)系統(tǒng)的模型,完全不涉及信息在系統(tǒng)中的表示,只是用來描述某個特定組織所關(guān)心的信息結(jié)構(gòu),這類模型稱為“概念數(shù)據(jù)模型” 。要領(lǐng)模型用于建立信息世界的數(shù)據(jù)模型,強(qiáng)調(diào)其語義表達(dá)功能,應(yīng)該概念簡單、清晰,易于用戶理解,它是現(xiàn)實(shí)世界的第一層抽象,是用戶和數(shù)據(jù)庫設(shè)計人員之間進(jìn)行交流的工具。這一其中著名的模型是“實(shí)體聯(lián)系模型” 。

另一種數(shù)據(jù)模型是直接面向數(shù)據(jù)庫的邏輯結(jié)構(gòu),它是現(xiàn)實(shí)世界的第二層抽象。 這類模型涉及到計算機(jī)系統(tǒng)和數(shù)據(jù)庫管理系統(tǒng),又稱為“結(jié)構(gòu)數(shù)據(jù)模型” 。例如,層次、網(wǎng)狀、關(guān)系、面向?qū)ο蟮饶P?。這類模型有嚴(yán)格的形式化定義,以便于在計算機(jī)系統(tǒng)中實(shí)現(xiàn)。

(1)層次模型。用樹型結(jié)構(gòu)表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型。樹的結(jié)點(diǎn)是記錄類型,每個非根結(jié)點(diǎn)有且只有一個父結(jié)點(diǎn)。上一層記錄類型和下一層記錄類型間聯(lián)系是1∶n聯(lián)系。

層次模型的特點(diǎn)是記錄之間的聯(lián)系通過指針實(shí)現(xiàn),查詢效率較高。但層次模型有兩個缺點(diǎn):一是只能表示1∶n聯(lián)系,雖然有多種輔助手段實(shí)現(xiàn)了m∶n聯(lián)系,但都較復(fù)雜,用戶不易掌握,二是由于樹型結(jié)構(gòu)層次順序的嚴(yán)格和復(fù)雜,引起數(shù)據(jù)的查詢和更新操作也很復(fù)雜,因此,編寫應(yīng)用程序也很復(fù)雜。

(2)網(wǎng)狀模型。用有向圖結(jié)構(gòu)表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型。。1969年dbtg報告提出的數(shù)據(jù)模型是網(wǎng)狀模型的主要代表。有向圖中的結(jié)點(diǎn)是記錄類型,有向邊表示從箭尾一端的記錄類型到箭頭一端的記錄類型間聯(lián)系是1∶n聯(lián)系。

網(wǎng)狀模型的特點(diǎn):記錄之間聯(lián)系通過指針實(shí)現(xiàn),m∶n聯(lián)系也容易實(shí)現(xiàn)(每個m∶n聯(lián)系可拆成兩個1∶n聯(lián)系),查詢效率較高。網(wǎng)狀模型的缺點(diǎn)是編寫應(yīng)用程序比較復(fù)雜,程序員必須熟悉數(shù)據(jù)庫的邏輯結(jié)構(gòu)。由于層次系統(tǒng)和網(wǎng)狀系統(tǒng)的應(yīng)用程序編制比較復(fù)雜,因此,從20世紀(jì)80年代中期起,其市場已被關(guān)系系統(tǒng)所取代。但是使用這兩種模型建立起的許多數(shù)據(jù)庫仍然在正常運(yùn)轉(zhuǎn),只是在外層加了個關(guān)系數(shù)據(jù)庫語言的接口。網(wǎng)狀模型有許多成功的產(chǎn)品,20世紀(jì)70年代的產(chǎn)品大部分網(wǎng)狀系統(tǒng),例如,honeywell公司的ids/ⅱ、hp公司的image/3000、burroughs公司的dmsⅱ、umivac公司的dms1100、cullinet公司的idms、cimcom公司的total等

(3)關(guān)系模型。關(guān)系模型的主要是用二維表格結(jié)構(gòu)表達(dá)實(shí)體集,用外鍵表示實(shí)體間聯(lián)系。關(guān)系模型是由若干個關(guān)系模式組成的集合。關(guān)系模式相當(dāng)于前面提到的記錄類型,它的實(shí)例稱為關(guān)系,每個關(guān)系實(shí)際上是一張二維表格。

關(guān)系模型和層次、網(wǎng)狀模型的最大判別是用關(guān)鍵碼而不是用指針導(dǎo)航數(shù)據(jù),表格簡單用戶易懂,編程時并不涉及存儲結(jié)構(gòu),訪問技術(shù)等細(xì)節(jié)。關(guān)系模型是數(shù)學(xué)化模型。sql語言是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)化語言,已得到了廣泛的應(yīng)用。20世紀(jì)70年代對關(guān)系數(shù)據(jù)庫的研究主要集中在理論和實(shí)驗系統(tǒng)的開發(fā)方面。80年代初才形成產(chǎn)品,但很快得到廣泛的應(yīng)用和普及,并最終取代了層次、網(wǎng)狀數(shù)據(jù)庫產(chǎn)品?,F(xiàn)在市場上典型的關(guān)系dbms產(chǎn)品有db2、oracle、sybase、informix和微機(jī)型產(chǎn)品foxpro、access等。

關(guān)系模型和網(wǎng)狀、層次模型的最大區(qū)別是:關(guān)系模型用表格數(shù)據(jù)而不是通過指針鏈來表示和實(shí)現(xiàn)實(shí)體間聯(lián)系。關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)簡單、易懂。只需用簡單的查詢語句就可對數(shù)據(jù)庫進(jìn)行操作。

關(guān)系模型是數(shù)學(xué)化的模型,可把表格看成一個集合,因此集合論、數(shù)理邏輯等知識可引入到關(guān)系模型中來。關(guān)系模型已是一個成熟的有前途的模型,已得到廣泛應(yīng)用。

(4)面向?qū)ο竽P汀D壳?,關(guān)系數(shù)據(jù)庫的使用已相當(dāng)普遍,但是,現(xiàn)實(shí)世界中仍然存在著許多含有復(fù)雜數(shù)據(jù)結(jié)構(gòu)的應(yīng)用領(lǐng)域,例如,cad數(shù)據(jù)、圖形數(shù)據(jù)等,而關(guān)系模型在這方面的處理能力就顯得力不從心。因此,人們需要更高級的數(shù)據(jù)庫技術(shù)來表達(dá)這類信息。面向?qū)ο蟮母拍钭钤绯霈F(xiàn)在程序設(shè)計語言中,隨后迅速滲透到計算機(jī)領(lǐng)域的每一個分支。面向?qū)ο髷?shù)據(jù)庫是面向?qū)ο蟾拍钆c數(shù)據(jù)庫技術(shù)相結(jié)合的產(chǎn)物。

面向?qū)ο竽P湍芡暾孛枋霈F(xiàn)實(shí)世界的數(shù)據(jù)結(jié)構(gòu),具有豐富的表達(dá)能力,但模型相對較復(fù)雜,涉及的知識面也廣,因此面向?qū)ο髷?shù)據(jù)庫尚未達(dá)到關(guān)系數(shù)據(jù)庫那樣的普及程度。

2.2.2  數(shù)據(jù)庫體系結(jié)構(gòu)

數(shù)據(jù)庫的體系結(jié)構(gòu)分三級:內(nèi)部級(internal),概念級(conceptual)和外部級(external)。這個三級結(jié)構(gòu)有時也稱為“三級模式結(jié)構(gòu)”,或“數(shù)據(jù)抽象的三個級別”,最早是在1971年通過的dbtg報告中提出,后來收入在1975年的美國ansi/sparc報告中。雖然現(xiàn)在dbms的產(chǎn)品多種多樣,在不同的操作系統(tǒng)支持下工作,但是大多數(shù)系統(tǒng)在總的體系結(jié)構(gòu)上都具有三級模式的結(jié)構(gòu)特征。從某個角度看到的數(shù)據(jù)特性稱為“數(shù)據(jù)視圖”(data view)。

外部級最接近用戶,是單個用戶所能看到的數(shù)據(jù)特性。單個用戶使用的數(shù)據(jù)視圖的描述稱為“外模式”。

概念級涉及到所有用戶的數(shù)據(jù)定義,是全局的數(shù)據(jù)視圖。全局?jǐn)?shù)據(jù)視圖的描述稱為“概念模式”。

內(nèi)部級最接近于物理存儲設(shè)備,涉及到實(shí)際數(shù)據(jù)存儲的結(jié)構(gòu)。物理存儲數(shù)據(jù)視圖的描述稱為“內(nèi)模式”。

數(shù)據(jù)庫的三級模式結(jié)構(gòu)是數(shù)據(jù)的三個抽象級別。它把數(shù)據(jù)的具體組織留給dbms去做,用戶只要抽象地處理數(shù)據(jù),而不必關(guān)心數(shù)據(jù)在計算機(jī)中的表示和存儲,這樣就減輕了用戶使用系統(tǒng)的負(fù)擔(dān)。

三級結(jié)構(gòu)之間往往差別很大,為了實(shí)現(xiàn)這三個抽象級別的聯(lián)系和轉(zhuǎn)換,dbms在三級結(jié)構(gòu)之間提供兩個層次的映象(mappings):外模式/模式映象,模式/內(nèi)模式映象。此處模式是概念模式的簡稱。

2.2.3  數(shù)據(jù)的獨(dú)立性

由于數(shù)據(jù)庫系統(tǒng)采用三級模式結(jié)構(gòu),因此系統(tǒng)具有數(shù)據(jù)獨(dú)立性的特點(diǎn)。在數(shù)據(jù)庫技術(shù)中,數(shù)據(jù)獨(dú)立性是指應(yīng)用程序和數(shù)據(jù)之間相互獨(dú)立,不受影響。數(shù)據(jù)獨(dú)立性分成物理數(shù)據(jù)獨(dú)立性和邏輯數(shù)據(jù)獨(dú)立性兩級。

(1)物理數(shù)據(jù)獨(dú)立性

如果數(shù)據(jù)庫的內(nèi)模式要進(jìn)行修改,即數(shù)據(jù)庫的存儲設(shè)備和存儲方法有所變化,那么模式/內(nèi)模式映象也要進(jìn)行相當(dāng)?shù)男薷?,使概念模式盡可能保持不變。也就是對內(nèi)模式的修改盡量不影響概念模式,當(dāng)然,對于外模式和應(yīng)用程序的影響更小,這樣,我們稱數(shù)據(jù)庫達(dá)到了物理數(shù)據(jù)獨(dú)立性。

(2)邏輯數(shù)據(jù)獨(dú)立性

如果數(shù)據(jù)庫的概念模式要進(jìn)行修改,譬如增加記錄類型或增加數(shù)據(jù)項,那么外模式/模式映象也要進(jìn)行相應(yīng)的修改,使外模式盡可能保持不變。也就是對概念模式的修改盡量不影響外模式和應(yīng)用程序,這樣,我們稱數(shù)據(jù)庫達(dá)到了邏輯數(shù)據(jù)獨(dú)立性。

現(xiàn)有關(guān)系系統(tǒng)產(chǎn)品均提供了較高的物理獨(dú)立性,而對邏輯獨(dú)立性的支持尚有欠缺,例如,對外模式的數(shù)據(jù)更新受到限制等。

2.2.4  范式

建立起一個良好的數(shù)據(jù)指標(biāo)體系,是建立數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫的最重要的一環(huán)。一個良好的數(shù)據(jù)指標(biāo)體系是建立db的必要條件,但不是充分條件。我們完全可以認(rèn)為所建指標(biāo)體系中的一個指標(biāo)類就是關(guān)系數(shù)據(jù)庫中的一個基本表,而這個指標(biāo)類下面的一個個具體指標(biāo)就是這個基本表中的一個字段。但如果直接按照這種方式建庫顯然還不能算最佳。對于指標(biāo)體系中數(shù)據(jù)的結(jié)構(gòu)在建庫前還必須進(jìn)行規(guī)范化的重新組織。

在數(shù)據(jù)的規(guī)范化表達(dá)中,一般將一組相互關(guān)聯(lián)的數(shù)據(jù)稱為一個關(guān)系(relation),而在這個關(guān)系下的每個數(shù)據(jù)指標(biāo)項則被稱為數(shù)據(jù)元素(data element),這種關(guān)系落實(shí)到具體數(shù)據(jù)庫上就是基本表,而數(shù)據(jù)元素就是基本表中的一個字段(field)。規(guī)范化表達(dá)還規(guī)定在每一個基本表中必須定義一個數(shù)據(jù)元素為關(guān)鍵字(key),它可以唯一地標(biāo)識出該表中其它相關(guān)的數(shù)據(jù)元素。在規(guī)范化理論中表是二維的,它有如下四個性質(zhì):

在表中的任意一列上,數(shù)據(jù)項應(yīng)屬于同一個屬性(如圖中每一列都存放著不同合同記錄的同一屬性數(shù)據(jù))。

表中所有行都是不相同的,不允許有重復(fù)組項出現(xiàn)(如圖中每一行都是一個不同的合同記錄)。

在表中,行的順序無關(guān)緊要(如圖中每行存的都是合同記錄,至于先放哪一個合同都沒關(guān)系)。

在表中,列的順序無關(guān)緊要,但不能重復(fù)(如圖中合同號和合同名誰先誰后都沒關(guān)系,但二者不可重復(fù)或同名)。

在對表的形式進(jìn)行了規(guī)范化定義后,數(shù)據(jù)結(jié)構(gòu)還有五種規(guī)范化定義,定名為規(guī)范化模式,稱為范式。在這五種范式中,一般只用前三種,對于常用系統(tǒng)就足夠了。而且這五種范式是“向上兼容”的,即滿足第五范式的數(shù)據(jù)結(jié)構(gòu)自動滿足一、二、三、四范式,滿足第四范式的數(shù)據(jù)結(jié)構(gòu)自動滿足第一、二、三范式,……,依此類推。

第一范式(first normal form,簡稱1st nf)就是指在同一表中沒有重復(fù)項出現(xiàn),如果有則應(yīng)將重復(fù)項去掉。這個去掉重復(fù)項的過程就稱之為規(guī)范化處理。在本文所討論的開發(fā)方法里,1st nf實(shí)際上是沒有什么意義的。因為我們按規(guī)范化建立的指標(biāo)體系和表的過程都自動保證了所有表都滿足1st nf。

第二范式(second normal form,簡稱 2nd nf)是指每個表必須有一個(而且僅一個)數(shù)據(jù)元素為主關(guān)鍵字(primary key),其它數(shù)據(jù)元素與主關(guān)鍵字一一對應(yīng)。例如,在圖l9.7中如果我們將合同號定義為主關(guān)鍵字(其它數(shù)據(jù)元素中的記錄數(shù)據(jù)都有可能重名,故不能作為主關(guān)鍵字),故只要知道了一個合同記錄的合同號,就可以唯一地在同一行中找到該合同的任何一項具體信息。通常我們稱這種關(guān)系為函數(shù)依賴(functional dependence)關(guān)系。即表中其它數(shù)據(jù)元素都依賴于主關(guān)鍵字,或稱該數(shù)據(jù)元素唯一地被主關(guān)鍵字所標(biāo)識。

第三范式(third normal form,簡稱 3rd nf)就是指表中的所有數(shù)據(jù)元素不但要能夠唯一地被主關(guān)鍵字所標(biāo)識,而且它們之間還必須相互獨(dú)立,不存在其它的函數(shù)關(guān)系。也就是說對于一個滿足了 2nd nf的數(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è)計。

§2.3 sql語言基礎(chǔ)

2.3.1  sql簡介

用戶對數(shù)據(jù)庫的使用,是通過數(shù)據(jù)庫管理系統(tǒng)提供的語言來實(shí)現(xiàn)的。不同的數(shù)據(jù)庫管理系統(tǒng)提供不同的數(shù)據(jù)庫語言。關(guān)系數(shù)據(jù)庫管理系統(tǒng)幾乎都提供關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言——sql。

sql 的全稱是structured query language,即結(jié)構(gòu)化查詢語言。sql語句可以從關(guān)系數(shù)據(jù)庫中獲得數(shù)據(jù),也可以建立數(shù)據(jù)庫、增加數(shù)據(jù)、修改數(shù)據(jù)。1986年ansi采用sql語言作為關(guān)系數(shù)據(jù)庫系統(tǒng)的標(biāo)準(zhǔn)語言,后被國際化標(biāo)準(zhǔn)組織(iso)采納為國際標(biāo)準(zhǔn)。sql語言使用方便、功能豐富、簡潔易學(xué),是操作數(shù)據(jù)庫的工業(yè)標(biāo)準(zhǔn)語言,得到廣泛地應(yīng)用。例如關(guān)系數(shù)據(jù)庫產(chǎn)品db2、oracle等都實(shí)現(xiàn)了sql語言。同時,其它數(shù)據(jù)庫產(chǎn)品廠家也紛紛推出各自的支持sql的軟件或者與sql的接口軟件。這樣sql語言很快被整個計算機(jī)界認(rèn)可。

sql語言是一種非過程化語言,它一次處理一個記錄集合,對數(shù)據(jù)提供自動導(dǎo)航。sql語言允許用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,而不對單個記錄進(jìn)行操作。sql語言不要求用戶指定數(shù)據(jù)的存取方法,而是使用查詢優(yōu)化器,由系統(tǒng)決定對指定數(shù)據(jù)存取的最快速手段。當(dāng)設(shè)計者在關(guān)系表上定義了索引時,系統(tǒng)會自動利用索引進(jìn)行快速檢索,用戶不需知道表上是否有索引或者有什么類型的索引等細(xì)節(jié)。

sql語言可以完成許多功能,例如:

查詢數(shù)據(jù)

在數(shù)據(jù)庫表格中插入、修改和刪除記錄

建立、修改和刪除數(shù)據(jù)對象

控制對數(shù)據(jù)和數(shù)據(jù)對象的存取

確保數(shù)據(jù)庫的一致性和完整性等

2.3.2  sql查詢

數(shù)據(jù)查詢是關(guān)系運(yùn)算理論在sql語言中的主要體現(xiàn),select 語句是sql查詢的基本語句,當(dāng)我們在對一個數(shù)據(jù)庫進(jìn)各種各樣的操作時,使用的最多的就是數(shù)據(jù)查詢,在以sql為基礎(chǔ)的關(guān)系數(shù)據(jù)庫中,使用的最多的就是select查詢語句。

select語句的完整句法如下:

select 目標(biāo)表的列名或列表達(dá)式序列

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

[where 行條件表達(dá)式]

[group by 列名序列]

[having 組條件表達(dá)式]

[order by列名 [asc│deac]…]

我在select語句中還使用了大量的保留字和通配符以進(jìn)行各種各樣的條件查詢。在系統(tǒng)中有大量的查詢按鈕,其使用了大量的查詢語句,而且這些查詢語句大部分使用的是模糊查詢,所以大量的使用了模式匹配符like(判斷值是否與指定的字符通配格式相符)。在包含like的查詢語句中可以使用兩個通配符:%(百分號):與零個或多個字符組成的字符串匹配;_(下劃線):與單個字符匹配。系統(tǒng)中的條件判斷往往包含多個條件,這時就需要使用邏輯運(yùn)算符not、and、or(用于多條件的邏輯連接),謂詞all以及保留字distinct等等。做為select語句還有很多的使用方法,這里就不再敘述。

2.3.3  sql數(shù)據(jù)更新

使用數(shù)據(jù)庫的目的是為了有效地管理數(shù)據(jù),而數(shù)據(jù)的插入、刪除和修改則是必不可少的一個功能。在本系統(tǒng)中就大量地使用了數(shù)據(jù)插入、刪除和修改這三種操作,現(xiàn)做一個簡單地介紹。

數(shù)據(jù)插入

往數(shù)據(jù)庫的基本表中插入數(shù)據(jù)使用的是insert語句,其方式有兩種:一種是元組值的插入,另一種是查詢結(jié)果的插入。在本系統(tǒng)中使用的是前一種方式,其句法如下:

insert into 基本表名(列表名)values(元組值)

數(shù)據(jù)刪除

往數(shù)據(jù)庫的基本表中刪除數(shù)據(jù)使用的是delete語句,其句法如下:

delete from 基本表名 [where 條件表達(dá)式]

在些作一點(diǎn)說明,刪除語句實(shí)際上是“select * from 基本表名 [where 條件表達(dá)式]”和delete操作的結(jié)合,每找到一個元組,就把它刪除。此外,delete語句只能從一個基本表中刪除元組,where子句中條件可以嵌套,也可以是來自幾個基本表的復(fù)合條件。

數(shù)據(jù)修改

當(dāng)需要修改基本表中元組的某些列值時,可以用update語句實(shí)現(xiàn),其句法如下:

update基本表名

set列名=值表達(dá)式[,列名=值表達(dá)式…]

[where條件表達(dá)式]

在delphi中使用sql語句是很方便的,一般來說,都是通過tquery組件來使用sql語言的。有一點(diǎn)要進(jìn)行說明,雖然通過tquery組件來使用sql語言很方便,但考慮到自己對不同組件的理解程度、個人習(xí)慣以及其它各個方面,在本系統(tǒng)中我采用的是ado組件來對數(shù)據(jù)庫進(jìn)行操作。最簡單的方法比如在tadoquery組件的sql屬性中就可以鍵入sql語句,至于詳細(xì)的使用方法在后面進(jìn)行介紹。

第三章    數(shù)據(jù)庫開發(fā)工具

§3.1 delphi 6.0 簡介

delphi類可以粗略地分成兩部分:一部分是組件類,這些組件類通常以某種方式出現(xiàn)在組件面板上,當(dāng)用戶從組件面板上點(diǎn)取一個類的圖標(biāo)后,在程序中就自動生成了該類的對象(非可視組件除外);另一部分是功能類,這此功能類的對象通常出現(xiàn)在程序代碼中,起著不可代替的作用,但是這些功能類在組件面板上是找不到的。在delphi中,每一個類的祖先都是tobject類,整個類的層次結(jié)構(gòu)就像一棵倒掛的樹,在最頂層的樹根即為tobject類。這樣,按照面向?qū)ο缶幊痰幕舅枷耄褪沟糜脩艨捎胻object類這個類型代替任何其它類的數(shù)據(jù)類型。實(shí)際上在delphi的類庫中,tobject類派生出了為數(shù)相當(dāng)眾多的子類,它們形成了一個龐大的體系,通常情況下,如果不自行開發(fā)組件,就不必了解整個類的體系結(jié)構(gòu),只用到類層次樹的葉結(jié)點(diǎn)就足夠了。

凡是做過程序開發(fā)的人都知道從來沒有單純的數(shù)據(jù)應(yīng)用程序,也就是說,數(shù)據(jù)庫應(yīng)用程序必須和用戶界面(可以是圖形界面,也可以是命令接口)元素相結(jié)合,只講界面或只講數(shù)據(jù)庫本身都構(gòu)不成數(shù)據(jù)庫應(yīng)用程序,因而用delphi 6.0開發(fā)數(shù)據(jù)庫應(yīng)用程序就隱含著界面開發(fā)。delphi6中的vcl組件可用圖3-1來說明。組件在delphi程序的開發(fā)中是最顯眼的角色。大家知道,在編寫程序時一般都開始于在組件面板上選擇組件并定義組件間的相互作用。但也有一些組件不在組件面板上,例如tform和tapplication(典型的非可視組件)。組件是tcomponents派生出來的子類,可以流的形式存放在dfm文件中,具有事件和publish屬性。

窗口組件類是窗口化的可視化組件類,在delphi的類庫中占有最大的份額。在實(shí)際編程中,窗口組件類的對象都有句柄,可以接受輸入焦點(diǎn)和包含其它組件。

圖形組件與窗口組件并列,是另一大類組件。圖形組件不是基于窗口的,因而不能有窗口句柄,不能接受輸入焦點(diǎn)和包含其它組件。從圖8-43中可以看出,圖形組件的基類是tgraphiccontrol,在實(shí)際編程中,它們必須寄生于它們的宿主——窗口組件類的對象,由它們的擁有者負(fù)責(zé)其顯示,而且它們還能觸發(fā)一些和鼠標(biāo)活動相關(guān)的事件。圖形控件最典型的例子是tlabel和tspeedbutton。由此可以看出圖形組件的功能很弱,有讀者會問圖形組件的用處何在呢?其實(shí)使用圖形組件的最大好處在于節(jié)省資源,正是因為它們的功能較弱,所以使用的系統(tǒng)資源就要少。在一個應(yīng)用程序中,如果能在不影響其功能的前提下合理大量地使用圖形組件,將會大減少程序?qū)ο到y(tǒng)資源的消耗。

非可視組件是與可視組件相并列的另一類組件,非可視組件在程序運(yùn)行中是不可見的(除各種對話框組件之外,事實(shí)上有人認(rèn)為對話框組件不能歸入非可視組件,應(yīng)該是另一種介于可視與非可視之間的組件)。

§3.2 delphi 6.0 控件

用delphi6開發(fā)數(shù)據(jù)庫應(yīng)用,重點(diǎn)是和各種數(shù)據(jù)庫組件打交道,當(dāng)然也要使用其它的一些組件,現(xiàn)在就我在系統(tǒng)設(shè)計中所使用的重要組件給與簡單介紹。

3.2.1  ado數(shù)據(jù)訪問組件

ado數(shù)據(jù)對象(active data objects)實(shí)際是一種提供訪問各種數(shù)據(jù)類型的鏈接機(jī)制。ado設(shè)計為一種極簡單的格式,通過odbc的方法同數(shù)據(jù)庫接口中,可以使用任何一種odbc數(shù)據(jù)源,即不止適合于sql server、oracle、access等數(shù)據(jù)庫應(yīng)用程序,也適合于excel表格、文本文件、圖形文件和無格式的數(shù)據(jù)文件。ado是基于ole-db之上的技術(shù),因此ado通過其內(nèi)部的屬性和方法提供統(tǒng)一的數(shù)據(jù)訪問接口方法。ado使您的客戶端應(yīng)用程序能夠通過ole db提供訪問和操作在數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)。ado支持用于建立c/s和web的應(yīng)用程序的主要功能。其主要優(yōu)點(diǎn)是易于使用、高速度、低內(nèi)存支出和占用磁盤空間較少。ado同時具有遠(yuǎn)程數(shù)據(jù)服務(wù)(rds)功能,通過rds可以在一次往返過程中實(shí)現(xiàn)將數(shù)據(jù)從服務(wù)器移動到客戶端應(yīng)用程序和web頁、在客戶端對數(shù)據(jù)進(jìn)行處然后將更新結(jié)果返回服務(wù)器的操作。

delphi 6.0繼續(xù)對microsoft的ado訪問能力的支持。這種能力是通過一組新組件實(shí)現(xiàn)的,這些組件是在企業(yè)版的ado組件頁中,在組件面版的ado頁上可以找到這些組件。利用在前面章節(jié)提到的tdataset抽象類,ado組件可以不通過bde而直接實(shí)現(xiàn)ado連接。這意味著只需要很少的代碼就可以實(shí)現(xiàn)該連接并且性能得到提高。

利用ado數(shù)據(jù)訪問組件,可以只使用ado結(jié)構(gòu)與數(shù)據(jù)庫取得聯(lián)系并對其中的數(shù)據(jù)進(jìn)行操作,而在這些過程中完全不需要使用bde。大多數(shù)的ado連接和數(shù)據(jù)集組件都是與基于bde的連接和數(shù)據(jù)集組件相類似的。tadoconnection組件與基于bde的應(yīng)用程序中的tdatabase組件類似。tadotable與ttable,tadoquery與tquery,以及tadostoreproc和tstoredproc之間都具有這種類似的對應(yīng)關(guān)系。使用這些ado組件的方式與我們常使用的數(shù)據(jù)訪問組件(基于bde)都有許多相同之處。ttadodataset沒有直接的bde對應(yīng)組件,但它提供了許多與ttable和tquery相同的功能。同樣,tadocommand也沒有相對應(yīng)的bde組件,它是在delphi/ado環(huán)境中完成特定功能的組件。delphi 6.0通過ado數(shù)據(jù)集訪問組件,可以不借助bde數(shù)據(jù)引擎而是通過微軟的oledb來訪問更為廣泛的數(shù)據(jù)庫中的數(shù)據(jù)。ado數(shù)據(jù)集訪問組件與常用的數(shù)據(jù)訪問組件是并列的關(guān)系。

在系統(tǒng)中我主要使用的是adotablet和adoquery兩個組件。

3.2.2  數(shù)據(jù)控制類datacontrol

數(shù)據(jù)控制類負(fù)責(zé)數(shù)據(jù)庫數(shù)據(jù)的顯示,并把用戶對數(shù)據(jù)的修改傳回。這里的絕大多數(shù)組件,如dbtext, dbedit,  dbmemo, dbimage, dblistbox, dbcombobox, dbcheckbox, dbradiogroup, dblookuplistbox, dblookupcombox, dbctrgrid的功能和對應(yīng)的非數(shù)據(jù)感知組件相同,如tedit框,tradiogroups單選按鈕組等,只不過在顯示數(shù)據(jù)庫數(shù)據(jù)時要用而已。

在系統(tǒng)中主要使用數(shù)據(jù)網(wǎng)格控件dbgrid和數(shù)據(jù)庫導(dǎo)航器控件dbnavigator。

3.2.3  數(shù)據(jù)訪問類dataaccess

數(shù)據(jù)庫應(yīng)用系統(tǒng)中數(shù)據(jù)訪問是一個首要問題,包括單用戶和 c/s系統(tǒng),都必須聯(lián)系一些數(shù)據(jù)庫和數(shù)據(jù)表文件。delphi 6 提供了專門用于數(shù)據(jù)訪問的基類控件。主要包括數(shù)據(jù)源控件datasource、客戶數(shù)據(jù)集控件clientdataset、數(shù)據(jù)集提供器控件datasetprovider等等。

tdatabase:當(dāng)一個基于bde的數(shù)據(jù)庫應(yīng)用程序需要一個永久數(shù)據(jù)庫連接時,需要定制向一個數(shù)據(jù)庫服務(wù)器的連接時,需要事務(wù)控制和特殊的數(shù)據(jù)庫別名時就得用到tdatabase對象。特別是當(dāng)連接到一個遠(yuǎn)程的sql數(shù)據(jù)庫服務(wù)器時,如果要利用bde進(jìn)行數(shù)據(jù)庫事務(wù)處理,那么,tdatabase對象的威力就體現(xiàn)出來了。在一個應(yīng)用程序中為每一個數(shù)據(jù)庫連接顯示的聲明tdatabase對象要根據(jù)需要而定,不是必需的。對一個數(shù)據(jù)庫連接,如果沒有顯示的聲明并實(shí)例化tdatabase對象,系統(tǒng)就會產(chǎn)生一個帶有默認(rèn)屬性的tdatabase對象。

tdatasource對象用于在dataset對象(包括tquery,tstoredproc,ttable等)和數(shù)據(jù)感知組件之間提供一個連接的紐帶,以便在窗體上顯示數(shù)據(jù)庫中的數(shù)據(jù),在數(shù)據(jù)庫中導(dǎo)航定位與編輯數(shù)據(jù)集中的數(shù)據(jù)。如果一個dataset對象中的數(shù)據(jù)想在數(shù)據(jù)感知組件中顯示和修改,它就必須和tdatasource對象相聯(lián)系。同樣,一個數(shù)據(jù)感知組件如果想和數(shù)據(jù)源相聯(lián)系以便顯示和操縱數(shù)據(jù),就必須以tdatasource對象為中介。

用delphi6作數(shù)據(jù)庫應(yīng)用開發(fā)概括來說如下:先利用數(shù)據(jù)存取組件和實(shí)際的數(shù)據(jù)庫建立連接,并用tsession對象和tdatabase對象管理這些連接。然后以tdatasource對象為中介,用數(shù)據(jù)感知組件向用戶顯示數(shù)據(jù)庫的內(nèi)容并接受用戶的查詢和修改等操作。

3.2.4  sql語言在delphi中的應(yīng)用

在delphi中使用sql語言非常方便,一般來說,都是通過tquery組件來使用sql語言的。可以在tquery組件的sql屬性中設(shè)置sql語句。設(shè)計程序時,在該組件的屬性對話框中選擇sql屬性,單擊帶省略號的按鈕,就可以打開string list editor對話框,然后我們就可以在對話框中添加sql語句。還可以使用delphi的sql builder來自動生成sql語句,這樣可以避免手工編寫sql而可能造成的語法錯誤。

靜態(tài)sql語句在程序設(shè)計時便已固定下來,它不包含任何參數(shù)和變量。

動態(tài)sql語句,也被稱作參數(shù)化的語句,在其中間包含著表示字段名或表名的參數(shù),例如下面的語句是一條動態(tài)sql語句:

select  *  from  students  where studentcode =: studentcode;

其中的變量studentcode便是一個參數(shù)變量,它由一個冒號引導(dǎo),在程序運(yùn)行過程中,必須要為該參數(shù)賦值,該條sql語句才能正確執(zhí)行,每次運(yùn)行應(yīng)用程序時可以為該參數(shù)變量賦予不同的值。為參數(shù)賦值有三種方法:

①根據(jù)參數(shù)在sql語句中出現(xiàn)的順序,設(shè)置tquery部件的params屬性值為參數(shù)賦值。

②直接根據(jù)sql語句中各參數(shù)的名字,調(diào)用parambyname方法來為各參數(shù)賦值。

③將tquery部件的datasource屬性設(shè)置為另一個數(shù)據(jù)源,這樣將另一個數(shù)據(jù)源中與當(dāng)前tquery部件的sql語句中的參數(shù)名相匹配的字段值賦給其對應(yīng)的參數(shù)。利用這種方法也能實(shí)現(xiàn)所謂的連接查詢,創(chuàng)建主要—明細(xì)型數(shù)據(jù)庫應(yīng)用。

在程序運(yùn)行過程中,要想設(shè)置tquery部件的sql屬性,必須首先調(diào)用close方法,關(guān)閉tquery部件,然后再調(diào)用clear方法清除sql屬性中現(xiàn)存的sql命令語句, 最后再調(diào)用add方法為sql屬性設(shè)置新的sql命令語句。例如:

query1.close {關(guān)閉query1)

query1.sql.clear {清除sql屬性中的sql命令語句}

query1.sql.add(‘select * from students‘);

query1.sql.add(‘ where name ="lucy" ‘);

在為tquery部件設(shè)置sql屬性時調(diào)用close方法總是很安全的,如果tquery部件已經(jīng)被關(guān)閉了,調(diào)用close方法時不會產(chǎn)生任何影響。在應(yīng)用程序中為sql屬性設(shè)置新的sql 命令語句時,必須要調(diào)用clear方法以清除sql屬性中現(xiàn)存的sql命令語句,如果不調(diào)用clear方法,便調(diào)用add方法向sql屬性中設(shè)置sql命令語句,那么新設(shè)置的sql命令語句會追加在現(xiàn)存sql命令語句后面, 在程序運(yùn)行時常常會出現(xiàn)出乎意料的查詢結(jié)果甚至程序無法運(yùn)行下去。

在這里要特別注意的,一般情況下tquery部件的sql屬性只能包含一條完整的sql語句,它不允許被設(shè)置成多條sql語句。當(dāng)然有些數(shù)據(jù)庫服務(wù)器也支持在tquery部件的sql屬性中設(shè)置多條sql語句,只要數(shù)據(jù)庫服務(wù)器允許這樣,我們在編程時可以為 sql 屬性設(shè)置多條sql語句。

在為tquery部件設(shè)置完sql屬性的屬性值之后,也即編寫好適當(dāng)?shù)膕ql程序之后,可以有多種方式來執(zhí)行sql程序。

在設(shè)計過程中,設(shè)置完tquery部件的sql屬性之后將其active屬性的值置為true, 這樣便可以執(zhí)行sql屬性中的sql程序,如果應(yīng)用中有與tquery部件相連的數(shù)據(jù)瀏覽部件( 如tddgrid tdbedit等)那么在這些數(shù)據(jù)瀏覽部件中會顯示sql程序的執(zhí)行結(jié)果。

在應(yīng)用程序運(yùn)行過程中,通過程序調(diào)用tquery部件的open方法或execsql 方法可以執(zhí)行其sql屬性中的sql程序。open方法和execsql方法是不一樣的。open方法只能用來執(zhí)行sql語言的查詢語句(select命令), 并返回一個查詢結(jié)果集,而execsql方法還可以用來執(zhí)行其它常用的sql語句(如insert, update, delete等命令),例如:

query1.open (這樣會返回一個查詢結(jié)果集)

如果調(diào)用open方法,而沒有查詢結(jié)果時,會出錯。此時應(yīng)該調(diào)用execsql 方法來代替open方法。如:

query1.execsql (沒有返回結(jié)果)

當(dāng)然在設(shè)計應(yīng)用程序時,程序設(shè)計人員是無法確定tquery部件中的sql 語句是否會返回一個查詢結(jié)果的。對于這種情況應(yīng)當(dāng)用try…except模塊來設(shè)計程序。在 try 部分調(diào)用open方法,而在except部分調(diào)用excesql方法,這樣才能保證程序的正確運(yùn)行。

delphi中用adoquery來使用sql語句同樣十分方便。在adoquery組件中首先通過connectionstring屬性值來聯(lián)接數(shù)據(jù)源,然后就通過雙擊sql…屬性值來寫入sql語句。在delphi中調(diào)用數(shù)據(jù)庫,就可以調(diào)用adoquery組件,通過修改其中的sql…屬性中的sql語句來實(shí)現(xiàn)對數(shù)據(jù)庫的各項操作。

值得注意的是,adoquery組件只有在激活的情況下才可以被正確地使用,這樣就提出了一個問題,也就是說,在每次修改adoquery組件的sql…屬性時都必須先行進(jìn)行關(guān)閉,待清除掉sql…中所有的sql語句后才可以添加新的sql語句。而且,在每一次修改完成以后,還應(yīng)該記得重新將adoquery激活。其它的使用方法與ttquery有許多的相似之處。

§3.3 access 簡介

建立一個數(shù)據(jù)庫我們有多種選擇,現(xiàn)在市場上有各種各樣的數(shù)據(jù)庫,而且每一種數(shù)據(jù)庫都有其自身的特點(diǎn),不能說哪一種更好,只能在其中尋找一種能更好地適應(yīng)系統(tǒng)需求、更好地滿足用戶的要求以及適應(yīng)開發(fā)人員的習(xí)慣。在本系統(tǒng)中,做為圖書倉庫管理系統(tǒng)是一個比較小的應(yīng)用系統(tǒng),它所產(chǎn)生和處理的數(shù)據(jù)量也比較小。因此,沒有必要使用像sql server和oracle這樣的大型數(shù)據(jù)庫。我首先想到的數(shù)據(jù)庫是borland公司的paradox數(shù)據(jù)庫。另外,microsoft office中的access數(shù)據(jù)庫在計算機(jī)上的應(yīng)用比較普及,是開發(fā)小型數(shù)據(jù)庫系統(tǒng)的比較理想的選擇,所以,在本系統(tǒng)中我選擇了access數(shù)據(jù)庫。

access做為一個數(shù)據(jù)庫管理系統(tǒng),它被集成在microsoft office中。access數(shù)據(jù)庫處理的基本結(jié)構(gòu),采取關(guān)系型數(shù)據(jù)庫模式。與其他的數(shù)據(jù)庫系統(tǒng)相比,access更加簡單易學(xué),一個普通的計算機(jī)用戶可以很快地掌握它。access 2000的功能十分強(qiáng)大,利用它可以方便地實(shí)現(xiàn)對信息保存、維護(hù)、查詢、統(tǒng)計、打印、交流、,而且它可以十分方便地與office其他組件交流數(shù)據(jù),這些功能對一個一般用戶而言已經(jīng)足夠了。

第四章  系統(tǒng)總體設(shè)計

軟件系統(tǒng)的總體設(shè)計大約要經(jīng)歷可行性分析和項目開發(fā)計劃,需求分析,概要設(shè)計,詳細(xì)設(shè)計,編碼,測試以及維護(hù)等七個階段??尚行苑治龊晚椖块_發(fā)計劃在前面已經(jīng)敘述,下面所要做的是進(jìn)行軟件需求分析,概要設(shè)計和詳細(xì)設(shè)計。編碼過程將在下一節(jié)論述,而測試和維護(hù)過程不在本文敘及。

§4.1   系統(tǒng)需求分析

在經(jīng)過前一階段的分析之后,我確定了我的開發(fā)課題為圖書倉庫管理?,F(xiàn)在所要做的是要準(zhǔn)確定義系統(tǒng)必須做什么以及系統(tǒng)必須具備的功能。

軟件需求分析中我采用結(jié)構(gòu)化分析方法(structured analysis,簡稱sa),sa是面向數(shù)據(jù)流進(jìn)行需求分析的方法,像所有的軟件分析方法(如面向?qū)ο蠓治龇椒?、idef方法等等)一樣,sa也是一種建?;顒?,它使用簡單易讀的符號,根據(jù)軟件內(nèi)部數(shù)據(jù)傳遞、變換的關(guān)系,自頂向下逐層分解,描繪滿足功能要求的軟件模型。

在系統(tǒng)中我采用數(shù)據(jù)流圖(dfd)這種半形式化的描述方式表達(dá)需求。它是一種功能模型,以圖形的方式描繪數(shù)據(jù)在系統(tǒng)中流動和處理的過程,只反映系統(tǒng)必須完成的邏輯功能。它有四種基本圖形符號:

:箭頭,表示數(shù)據(jù)流;

〇:圓或橢圓,表示加工;

:雙杠,表示數(shù)據(jù)存儲;

:方框,表示數(shù)據(jù)的源點(diǎn)或終點(diǎn)。

為了表達(dá)較為復(fù)雜問題的數(shù)據(jù)處理過程,用一張數(shù)據(jù)流圖是不夠的,要按照問題的層次結(jié)構(gòu)進(jìn)行逐步分解,并以一套分層的數(shù)據(jù)流圖反映這種結(jié)構(gòu)關(guān)系。在這里我一共使用了三層數(shù)據(jù)流圖,即頂層圖,0層圖和1層圖(也是底層圖)。

在多層數(shù)據(jù)流圖中,頂層流圖僅包含一個加工,它代表被開發(fā)系統(tǒng),它的輸入流是該系統(tǒng)的輸入數(shù)據(jù)了,輸出流是該系統(tǒng)的輸出數(shù)據(jù);底層流圖是指其加工不需要再做分解的數(shù)據(jù)流圖,中間層流圖表示對其上層父圖的細(xì)化,它的每一步加工可能繼續(xù)細(xì)化成子圖。

經(jīng)過對系統(tǒng)的分析首先得到系統(tǒng)的頂層dfd,如下: 一步細(xì)化得到系統(tǒng)的0層dfd,如下:

再進(jìn)一步細(xì)化每一個數(shù)據(jù)加工功能,得到系統(tǒng)的1層dfd圖。

在這里只給出有關(guān)入庫管理和出庫管理的1層數(shù)據(jù)流圖,它們是系統(tǒng)的關(guān)鍵部分,也是主要的部分。通過以上對數(shù)據(jù)流圖的分析之后,我們已大體地了解了系統(tǒng)的功能和目標(biāo),接下來所要做的就是系統(tǒng)功能模塊的劃分和數(shù)據(jù)庫的設(shè)計,也就是系統(tǒng)的概要設(shè)計。

§4.2   系統(tǒng)概要設(shè)計

在軟件需求分析階段,搞清楚了軟件“做什么”的問題,形成了目標(biāo)系統(tǒng)的邏輯模型。現(xiàn)在我們所要做的就是要把軟件“做什么”的邏輯模型變換為“怎么做”的物理模型,即著手實(shí)現(xiàn)軟件的需求。首先,我們需要描述的是系統(tǒng)的總的體系結(jié)構(gòu)。

4.2.1  系統(tǒng)結(jié)構(gòu)設(shè)計

系統(tǒng)的概要設(shè)計中最重要的就是系統(tǒng)的模塊化。模塊化是指解決一個復(fù)雜問題時自項向下逐層把軟件系統(tǒng)劃分成若干個模塊的過程。每個模塊完成一個特定的功能,所有的模塊按某種方法組織起來,成為一個整體,完成整個系統(tǒng)所要求的功能。

 將系統(tǒng)劃分為多個模塊是為了降低軟件系統(tǒng)的復(fù)雜性,提高可讀性、可維護(hù)性,但模塊的劃分不能是任意的,應(yīng)盡量保持其獨(dú)立性。也就是說,每個模塊只完成系統(tǒng)要求的獨(dú)立的子功能,并且與其他模塊的聯(lián)系最少且接口簡單,即盡量做到高內(nèi)聚低耦合,提高模塊的獨(dú)立性,為設(shè)計高質(zhì)量的軟件結(jié)構(gòu)奠定基礎(chǔ)。

在系統(tǒng)的概要設(shè)計中我采用結(jié)構(gòu)化設(shè)計(structure design,簡稱sd),sd以需求分析階段產(chǎn)生的數(shù)據(jù)流圖dfd為基礎(chǔ),按一定的步驟映射成軟件結(jié)構(gòu)。我首先將整個系統(tǒng)化分為幾個小問題,小模塊,在系統(tǒng)中,我設(shè)計了用戶管理、庫存管理、入庫管理、出庫管理、員工管理和供應(yīng)商管理6個小模塊。然后,進(jìn)一步細(xì)分模塊,添加細(xì)節(jié)。比如,用戶管理我又將其分為用戶注冊、用戶注銷、密碼修改;庫存管理分為庫存記錄查詢、庫存記錄修改、庫存記錄打印等等。

以下就是系統(tǒng)的結(jié)構(gòu)圖:(在這里為了表達(dá)方便我將結(jié)構(gòu)圖分開來表達(dá)。)

    在得到系統(tǒng)的第一層功能模塊圖后,經(jīng)過進(jìn)一步地細(xì)化,得一系統(tǒng)的子功能模塊圖:

4.2.2  數(shù)據(jù)庫設(shè)計

在信息世界中,信息從客觀事物出發(fā)流經(jīng)數(shù)據(jù)庫,通過決策機(jī)構(gòu)最后又回到客觀世界,信息的這一循環(huán)經(jīng)歷了三個領(lǐng)域:信息世界,數(shù)據(jù)世界,現(xiàn)實(shí)世界。現(xiàn)實(shí)世界的事物反映到人的頭腦中,人的大腦對它有個認(rèn)識過程,經(jīng)過分析(選擇、命名、分類等)進(jìn)入信息世界。這些信息再進(jìn)一步加工、編碼,然后進(jìn)數(shù)據(jù)世界,而軟件系統(tǒng)的開發(fā)工作需要考慮這兩個方面的問題,也就是要考慮系統(tǒng)開發(fā)所需要的數(shù)據(jù),以及如何對這些數(shù)據(jù)進(jìn)行操作。這兩個問題貫穿了整個軟件系統(tǒng)的開發(fā)過程,這也就是數(shù)據(jù)庫的設(shè)計問題,軟件設(shè)計的一個核心。

4.2.2.1  er圖設(shè)計

在系統(tǒng)設(shè)計的開始,我首先考慮的是如何用數(shù)據(jù)模型來數(shù)據(jù)庫的結(jié)構(gòu)與語義,以對現(xiàn)實(shí)世界進(jìn)行抽象。目前廣泛使用的數(shù)據(jù)模型可分為兩種類型,一種是獨(dú)立于計算機(jī)系統(tǒng)的“概念數(shù)據(jù)模型”,如“實(shí)體聯(lián)系模型”;另一種是直接面向數(shù)據(jù)庫邏輯結(jié)構(gòu)的“結(jié)構(gòu)數(shù)據(jù)模型”。在本系統(tǒng)中我采用“實(shí)體聯(lián)系模型”(er模型)來描述數(shù)據(jù)庫的結(jié)構(gòu)與語義,以對現(xiàn)實(shí)世界進(jìn)行第一次抽象。er模型直接從現(xiàn)實(shí)世界抽象出實(shí)體類型及實(shí)體間聯(lián)系,然后用er圖來表示數(shù)據(jù)模型。它有兩個明顯的優(yōu)點(diǎn):接近于人的思維,容易理解;與計算機(jī)無關(guān),用戶容易接受。但er模型只能說明實(shí)體間語義的聯(lián)系,不能進(jìn)一步說明詳細(xì)的數(shù)據(jù)結(jié)構(gòu),它只是數(shù)據(jù)庫設(shè)計的第一步。

er圖是直觀表示概念模型的工具,它有四個基本成分:

矩形框,表示實(shí)體類型(考慮問題的對象)。

菱形框,表示聯(lián)系類型(實(shí)體間的聯(lián)系)。

橢圓形框,表示實(shí)體類型和聯(lián)系類型的屬性。對于關(guān)鍵碼的屬性,在屬性名下劃一橫線。

直線,聯(lián)系類型與其涉及的實(shí)體類型之間以直線連接。

本系統(tǒng)為圖書倉庫管理,主要管理圖書的入庫、出庫以及庫存等事項。倉庫根據(jù)需要可以查詢圖書供應(yīng)商的信息,同時還需要了解在入庫和出庫中員工的參與情況。依據(jù)倉庫管理的實(shí)際情況,考慮了多方面的因素以后,確定系統(tǒng)的er圖如下:

(為了表達(dá)的方便,在這里我沒有在一張圖上表達(dá)出所有的關(guān)系,而是用一張總體er圖,和幾張實(shí)體屬性關(guān)系圖來表達(dá)數(shù)據(jù)庫的結(jié)構(gòu)。)

在該數(shù)據(jù)庫中,我設(shè)計了三個實(shí)體,分別是庫存、員工和供應(yīng)商以及兩個聯(lián)系類型入庫和出庫。在本系統(tǒng)中庫存是核心,也是基本,沒有了庫存其它的也就沒有什么意義了。員工記錄的添加是考慮到責(zé)任問題,也就是說,在倉庫管理的實(shí)際運(yùn)用中,出現(xiàn)了責(zé)任不清的現(xiàn)象,特別是由于倉庫的進(jìn)出圖書數(shù)量都比較大時產(chǎn)生了一系列問題,所以在設(shè)計數(shù)據(jù)庫時,我特別考慮到這一點(diǎn),加入了員工記錄這一實(shí)體。供應(yīng)商信息的添加主要出于對圖書來源問題的思考。通過添加供應(yīng)商信息可以比較清楚地了解圖書的進(jìn)貨渠道,從圖書的質(zhì)量到供應(yīng)商的信譽(yù)都可以進(jìn)行了解,同時可以為以后的圖書進(jìn)購提供一定有用的信息。

入庫聯(lián)系類型將庫存信息、供應(yīng)商信息和員工信息聯(lián)系在一起,可以方便地實(shí)現(xiàn)三個實(shí)體之間的聯(lián)接,而出庫聯(lián)系類型則將庫存信息和員工信息較好地聯(lián)接起,同時這兩個聯(lián)系類型又都具有各自特有的屬性。

下面就是各實(shí)體及聯(lián)系類型的屬性圖:(帶#號的屬性為關(guān)鍵字段)4.2.2.2  數(shù)據(jù)庫表格設(shè)計

在完成系統(tǒng)的er圖之后,需要將er模型轉(zhuǎn)化為關(guān)系模型,也就是說,要設(shè)計出數(shù)據(jù)庫所需要的表格。在這里,我選用的是關(guān)系數(shù)據(jù)庫。因為關(guān)系數(shù)據(jù)庫中的二維表格可以很清楚地描述數(shù)據(jù)之間的聯(lián)系。

在這里不得不提到一個概念——范式。其實(shí)在上一節(jié)的er圖設(shè)計中,已經(jīng)運(yùn)用了范式的思想,不僅如此,在數(shù)據(jù)庫的表格設(shè)計中更離不開范式的思想,它是數(shù)據(jù)庫設(shè)計的基礎(chǔ),如果不注意這個問題將會導(dǎo)致一系列問題的出現(xiàn)。

我在系統(tǒng)中定義的表格都嚴(yán)格地按照范式的思想和要求去完成,數(shù)據(jù)庫中的所有表格都達(dá)到了三范式的要求。根據(jù)系統(tǒng)er圖,針對本系統(tǒng)的特點(diǎn),在對所搜集的數(shù)據(jù)進(jìn)行規(guī)范化之后,定義了如下六張表格,分別是庫存信息表,入庫信息表,出庫信息表,員工信息表,供應(yīng)商信息表和密碼信息表。通過對這六張表格的操作可以較好地完成系統(tǒng)設(shè)計的各項功能,六張表格之間有著不同程度的聯(lián)系。(說明:在以下數(shù)據(jù)表中,k代表主鍵,#代表外鍵,字段值不為空。)

bookrecord 表(庫存信息表)

 字段名稱 數(shù)據(jù)類型 說明

k bookid 數(shù)字 圖書編號

 bookname 文本 圖書名

 author 文本 作者

 publisher 文本 出版社

 pubdate 日期/時間 出版日期

 price 貨幣 價格

 booktype 文本 圖書類型

 number1 數(shù)字 庫存數(shù)量

 addation 文本 備注

圖4.13  庫存信息表

庫存信息表主要用于記錄倉庫中現(xiàn)存放的所有圖書的詳細(xì)信息,包括圖書編號、書名、作者、出版社、圖書類型等有關(guān)圖書的各類信息,它即是該數(shù)據(jù)庫的主表,也是系統(tǒng)主界面的主要內(nèi)容。

在該表中圖書編號是主鍵,它按圖書入庫的先后次序來編寫,每當(dāng)有圖書入庫,系統(tǒng)自動給出圖書編號,這樣我們按圖書編號來查找圖書是比較方便的??紤]到編號比較難于記憶,所以使用了出版社和圖書類型兩個字段,在系統(tǒng)中我提供了出版社和圖書類型的分類查找,而且全部采用自動生成,每當(dāng)系統(tǒng)中有新的出版社類型和圖書類型,彈出菜單會自動添中新類型,這樣就可以比較方便地實(shí)現(xiàn)按出版社和按圖書類型查找。此外,庫存數(shù)量也是一個比較關(guān)鍵的字段,該字段是在系統(tǒng)初始化時就給定的,每當(dāng)有圖書入庫或出庫操作,系統(tǒng)就會自動修改圖書的庫存數(shù)量,以保持?jǐn)?shù)據(jù)的一致性。做為備注有一點(diǎn)說明,我的數(shù)據(jù)庫中備注的數(shù)據(jù)類型是文本,而不是備注類型,主要考慮到該字段的長度并不大,而且在delphi中文本數(shù)據(jù)類型的處理也比較方便一點(diǎn)。

employee 表(員工信息表)

 字段名稱 數(shù)據(jù)類型 說明

k employeeid 數(shù)字 員工編號

 employeename 文本 員工姓名

 sex 文本 性別

 borndate 日期/時間 出生日期

 grade 文本 職稱

 workdate 日期/時間 工作日期

 telephone 文本 聯(lián)系電話

 address 文本 聯(lián)系地址

   圖4.14  員工信息表

員工信息表主要用于記錄有關(guān)員工的各類信息,包括姓名、職稱、出生日期、聯(lián)系電話、聯(lián)系地址等。它主要用來為系統(tǒng)提供員工的有關(guān)信息,因為在系統(tǒng)中,入庫和出庫操作均與員工有著一定的聯(lián)系,在查詢?nèi)霂煨畔⒑统鰩煨畔r,有時需要查找有關(guān)此項記錄有關(guān)的員工信息,在系統(tǒng)中我是通過入庫記錄與員工記錄(出庫記錄和員工記錄)之間的聯(lián)接查詢來完成的。另外,作為一個倉庫也有必要了解其所屬員工的一些基本情況,以便查詢。

shopkeeper 表(供應(yīng)商信息表)

 字段名稱 數(shù)據(jù)類型 說明

k shopkeeperid 數(shù)字 供應(yīng)商編號

 shopkeepername 文本 供應(yīng)商姓名

 address 文本 地址

 postno 數(shù)字 郵編

 officephone 文本 辦公電話

 homephone 文本 住宅電話

 email 文本 e-mail

 paytype 文本 付款方式

   圖4.15  供應(yīng)商信息表

供應(yīng)商信息表主要用于記錄有關(guān)供應(yīng)商的各類信息,包括姓名、地址、電話、付款方式等。它主要用來為系統(tǒng)提供供應(yīng)商的有關(guān)信息,在系統(tǒng)中入庫記錄是與供應(yīng)商記錄相聯(lián)系的,通過入庫記錄可以查找相關(guān)的供應(yīng)商信息。在供應(yīng)商信息中,考慮當(dāng)實(shí)際情況,我特別加入了email和付款方式這兩個字段,因為在當(dāng)今信息世界中,多種多樣的通訊方式和多種多樣的付款方式是必然的,是數(shù)據(jù)庫中必須與以記錄。

inrecord 表(入庫信息表)

 字段名稱 數(shù)據(jù)類型 說明

k inid 數(shù)字 入庫編號

# bookid 數(shù)字 圖書編號

# employeeid 數(shù)字 員工編號

# shopkeeperid 數(shù)字 供應(yīng)商編號

 number 數(shù)字 入庫數(shù)量

 buydate 日期/時間 入庫日期

  圖4.16  入庫信息表

outrecord 表(出庫信息表)

 字段名稱 數(shù)據(jù)類型 說明

k outid 數(shù)字 出庫編號

# bookid 數(shù)字 圖書編號

# employeeid 數(shù)字 員工編號

 number2 數(shù)字 出庫數(shù)量

 outdate 日期/時間 出庫日期

   圖4.17  出庫信息表

入庫信息表主要用于記錄有關(guān)入庫的詳細(xì)信息,包括入庫數(shù)量、入庫日期以及圖書、員工、供應(yīng)商三方的編號,以便查詢。出庫信息表主要用于記錄有關(guān)出庫的詳細(xì)信息,包括出庫數(shù)量、出庫日期以及圖書、員工的編號。出庫信息表和入庫信息表一樣,其實(shí)它們都屬于聯(lián)系類型,系統(tǒng)通過這兩個表可以聯(lián)接上其它的表為用戶提供多種條件的聯(lián)接查詢。值得提出的一點(diǎn)是入庫記錄和出庫記錄的添加不僅僅是單表操作,由于它們都與庫存記錄相聯(lián)系,所以,無論您是添中入庫記錄還是添加出庫記錄,都必須同時修改庫存記錄,以保持?jǐn)?shù)據(jù)的一致性,否則將引發(fā)系統(tǒng)出錯而這些我都讓其在系統(tǒng)中自動完成。無論您是添加入庫記錄,還是添加出庫記錄,系統(tǒng)都將自動修改庫存中圖書的數(shù)量,而且,在您出庫的數(shù)量大于庫存數(shù)量時,系統(tǒng)還會自動提示錯誤,這樣就可以防止一定錯誤的發(fā)生。

在入庫信息表和出庫信息表中我還定義了幾個外鍵,它提供了一種表示幾個關(guān)系聯(lián)系的方法。比如,系統(tǒng)中通過在入庫信息表中定義的外鍵 bookid、employeeid和shopkeeperid可以將庫存信息表、員工信息表和供應(yīng)商信息表聯(lián)系在一起,從而方便地實(shí)現(xiàn)聯(lián)接查詢,而且,引入外鍵的定義是實(shí)體完整性約束的一個主要方面。

key 表(密碼信息表)

 字段名稱 數(shù)據(jù)類型 說明

k keyname 文本 用戶姓名

 keyno 文本 用戶密碼

圖4.18  密碼信息表

密碼信息表主要用于記錄所有的用戶名和用戶密碼。它是在用戶登陸時用來確定用戶和密碼的正確性,以防止非法用戶登陸。

通過以上設(shè)計已經(jīng)完成了系統(tǒng)的概要設(shè)計,當(dāng)我們有了系統(tǒng)的功能模塊圖和數(shù)據(jù)庫之后,就需要著手去實(shí)現(xiàn)每一個模塊,為每一個功能設(shè)計程序流程圖,這也就是系統(tǒng)的詳細(xì)設(shè)計。

§4.3   系統(tǒng)詳細(xì)設(shè)計

在前面的概要設(shè)計中,已將系統(tǒng)劃分為多個模塊,并將它們按照一定的原則組裝起來,同時確定了每個功能及模塊之間的外部接口?,F(xiàn)在所要做的就是確定每個模塊具體執(zhí)行過程,也可以說是“過程設(shè)計”。

在處理過程設(shè)計時我采用的是結(jié)構(gòu)化程序設(shè)計(簡稱sp)方法。需要指出的是系統(tǒng)的詳細(xì)設(shè)計并不是指具體的編程序,而是將概要設(shè)計階段產(chǎn)生的系統(tǒng)功能模塊圖細(xì)化成很容易產(chǎn)生程序的圖紙。因此詳細(xì)設(shè)計的結(jié)果基本決定了最終程序的質(zhì)量。為軟件的質(zhì)量,延長軟件的生存期,軟件的可測試性、可維護(hù)性提供重要的保障。詳細(xì)設(shè)計的目標(biāo)不僅是邏輯上正確地實(shí)現(xiàn)每個模塊的功能,還應(yīng)使設(shè)計出的處理過程清晰易讀。

由前一階段產(chǎn)生的系統(tǒng)功能模塊圖,我為系統(tǒng)的主要部分設(shè)計了如下程序流程圖:通過以上步驟,基本上完成了對整個系統(tǒng)的總體設(shè)計,接下來所要做的就是軟件的編碼工作。系統(tǒng)總體設(shè)計的好壞直接影響著下一步工作,只有在這一階段設(shè)計出好的模塊圖和程序流程圖,才能更有利于編碼,產(chǎn)生好的軟件系統(tǒng)。

第五章   系統(tǒng)應(yīng)用程序設(shè)計

§5.1  系統(tǒng)窗體模塊組成

§5.2  數(shù)據(jù)模塊窗體的設(shè)置

在編寫數(shù)據(jù)庫應(yīng)用程序時,經(jīng)常要遇到這樣的情況,即好多組件、窗體同時訪問相同的數(shù)據(jù)源,如果為每一個組件或者窗體都設(shè)置一個數(shù)據(jù)源將是十分耗時的工件,而且要保證這些數(shù)據(jù)源的確是相同的也需花一番功夫。那么,能不能將這些數(shù)據(jù)源集中管理,最好是做成一個統(tǒng)一的模塊,需要時就將該模塊引入而不必直接操作數(shù)據(jù)源本身呢?數(shù)據(jù)模塊(datamodule)是解決這個問題最好的答案。簡單說來,數(shù)據(jù)模塊是用來集中管理數(shù)據(jù)源的一個窗體,該窗體可被需要的地方隨時引入。

圖5.2給出了本程序的數(shù)據(jù)模塊(datamoduleform)窗體圖,除報表窗體外所有的數(shù)據(jù)存取組件和數(shù)據(jù)源組件都在此數(shù)據(jù)模塊中進(jìn)行了定義。值得一提的是,設(shè)置了數(shù)據(jù)庫database組件,該組件引入了系統(tǒng)所需的唯一的數(shù)據(jù)庫tsxs,database組件的databasename屬性設(shè)置為tsckgl。tsxs數(shù)據(jù)庫已在odbc配置程序中進(jìn)行了設(shè)置。其他的數(shù)據(jù)存取組件都是基于此數(shù)據(jù)庫組件創(chuàng)建的,這樣做的好處是,當(dāng)數(shù)據(jù)庫的別名或者其他信息改變之后,只需修改tdatabase組件的aliasname屬性即可。

另外,在本系統(tǒng)的數(shù)據(jù)模塊窗體圖中,我大多采用的aodquery組件而沒有采用bde組,這主要是基于對ado組件的了解。在delphi的學(xué)習(xí)中我對ado組件了解的更加清楚,使用也較bde更為熟練,而且,ado組件的功能也較bde更為強(qiáng)大,所以在這里大多采用ado組件來進(jìn)行數(shù)據(jù)庫聯(lián)接。同時我也使用了bde組件中的table,因為在某些時候bde有著其自身特有的優(yōu)越性。  主窗體功能模塊的實(shí)現(xiàn)                          

file://主窗體程序代碼

public      file://在程序的起始部分,定義快捷按鈕點(diǎn)擊事件

procedure popup1handler(sender:tobject);

procedure popup2handler(sender:tobject);

**********************************************************************

procedure tmainform.popup1handler(sender: tobject);

begin       file://快捷按鈕1(點(diǎn)“按出版社分類”按鈕產(chǎn)生)的點(diǎn)擊事件

with datamoduleform.mainquery do    

begin     file://打開數(shù)據(jù)模塊窗體的mainquery,對bookrecord表進(jìn)行操作

close;     file://關(guān)閉mainquery

sql.clear;      file://清除sql屬性中的sql命令語句

sql.add(‘select * from bookrecord where publisher=:pub‘); file://添加新的sql語句

parameters.parambyname(‘pub‘).value:=(sender as tmenuitem).caption;

open;      file://重新打開mainquery

end;

end;

**********************************************************************

procedure tmainform.speedbutton1click(sender: tobject);

var s1,s2,s3,s4,s5 :string;     file://設(shè)立5個變量以方便實(shí)現(xiàn)模糊查詢

begin      file://主窗口庫存查詢按鈕事件

with datamoduleform.mainquery do

begin

close;

sql.clear;

sql.add(‘select * from bookrecord‘);

sql.add(‘where bookid like :bookid and bookname like :name and author like :author and publisher like :pub and booktype like :booktype‘);

           file://使用like語句來實(shí)現(xiàn)模糊查詢

if edit1.text<>‘‘  then  s1:=‘%‘+edit1.text+‘%‘   else  s1:=‘%‘;

parameters.parambyname(‘bookid‘).value:=s1;         file://給變量s1賦值

if edit2.text<>‘‘  then  s2:=‘%‘+edit2.text+‘%‘   else  s2:=‘%‘;

parameters.parambyname(‘name‘).value:=s2;           file://給變量s2賦值

if edit3.text<>‘‘  then  s3:=‘%‘+edit3.text+‘%‘   else  s3:=‘%‘;

parameters.parambyname(‘a(chǎn)uthor‘).value:=s3;          file://給變量s2賦值

if edit4.text<>‘‘  then  s4:=‘%‘+edit4.text+‘%‘   else  s4:=‘%‘;

parameters.parambyname(‘pub‘).value:=s4;             file://給變量s2賦值

if edit5.text <>‘‘  then  s5:=‘%‘+edit5.text+‘%‘   else  s5:=‘%‘;

parameters.parambyname(‘booktype‘).value:=s5;        file://給變量s2賦值

open;

if fieldvalues[‘bookid‘]=null         file://判斷是否找到記錄

then  begin

messagedlg(‘沒有找到你所需要的記錄!‘,mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit3.text:=‘‘;edit4.text:=‘‘;edit5.text:=‘‘;

close;

sql.clear;

sql.add(‘select * from bookrecord‘);     file://這里相當(dāng)于一個刷新功能

open;

end;end;

end;

**********************************************************************

procedure tmainform.speedbutton3click(sender: tobject);

begin         file://庫存表刷新按鈕事件

with datamoduleform.mainquery do

begin

close;

sql.clear;

sql.add(‘select * from bookrecord‘);

open;

end;  

end;

**********************************************************************

procedure tmainform.speedbutton11click(sender: tobject);

var popupitem:tmenuitem;

begin         file://自動生成快捷按鈕1的內(nèi)容

with datamoduleform.bookquery do

begin         file://從數(shù)據(jù)庫中選擇出版社類型

close;

sql.clear;

sql.add(‘select distinct publisher from bookrecord‘);

open;

popupmenu1:=tpopupmenu.create(self);  file://自動生成快捷菜單

popupmenu1.autohotkeys:=mamanual;    file://自定義熱鍵

while not eof do

begin           file://根據(jù)出版社內(nèi)容生成菜單子項

popupitem:=tmenuitem.create(self);

popupitem.caption:=fieldbyname(‘publisher‘).asstring;

popupmenu1.items.add(popupitem);

popupitem.onclick:=popup1handler;     file://確定菜單子項的點(diǎn)擊事件

next;

end;  end;

popupmenu1.popup(384,67);      file://在指定位置顯示快捷菜單1

end;

**********************************************************************

procedure tmainform.formactivate(sender: tobject);

begin      file://系統(tǒng)初始化,在進(jìn)入mainform時自動添加數(shù)據(jù)源

mainform.dbgrid1.datasource:=datamoduleform.mainsource;

mainform.dbnavigator1.datasource:=datamoduleform.mainsource;

mainform.dbgrid2.datasource:=datamoduleform.empsource;

mainform.dbnavigator2.datasource:=datamoduleform.empsource;

mainform.dbgrid3.datasource:=datamoduleform.shopsource;

mainform.dbnavigator3.datasource:=datamoduleform.shopsource;

mainform.dbgrid4.datasource:=datamoduleform.insource;

mainform.dbnavigator4.datasource:=datamoduleform.insource;

mainform.dbgrid5.datasource:=datamoduleform.outsource;

mainform.dbnavigator5.datasource:=datamoduleform.outsource;

end;

**********************************************************************

procedure tmainform.formcreate(sender: tobject);

begin     file://系統(tǒng)初始化,定義界面大小,以適應(yīng)不同分辯率

width:=800;height:=600;

end;

**********************************************************************

procedure tmainform.timer1timer(sender: tobject);

begin         file://在狀態(tài)欄顯示時間

statusbar1.panels[2].text:=datetostr(date);

statusbar1.panels[4].text:=timetostr(time);

end;

§5.4  入庫、出庫窗體模塊的實(shí)現(xiàn)

 

                      圖5.4  系統(tǒng)入庫管理窗體

 

                          圖5.5  系統(tǒng)出庫管理窗體

procedure tinoutform.speedbutton4click(sender: tobject);

begin           file://入庫管理查找按鈕事件

  with datamoduleform.bookquery do    file://入庫查詢處理

  begin

    close;

    sql.clear;

    sql.add(‘select * from bookrecord where bookid=:bookid‘);

    parameters.parambyname(‘bookid‘).value:=edit13.text;

    open;

    if fieldvalues[‘bookid‘]<>null

then

begin

      edit1.text:=‘‘;

      edit1.readonly:=true;edit1.color:=clmenu;

      edit6.text:=fieldvalues[‘bookname‘];  file://顯示圖書名

edit6.readonly:=true;edit6.color:=clmenu;   file://設(shè)置顯示框不可更改屬性

      edit7.text:=fieldvalues[‘a(chǎn)uthor‘];

      edit7.readonly:=true;edit7.color:=clmenu;

      edit8.text:=fieldvalues[‘publisher‘];

      edit8.readonly:=true;edit8.color:=clmenu;

      edit9.text:=fieldvalues[‘pubdate‘];

      edit9.readonly:=true;edit9.color:=clmenu;

      edit10.text:=fieldvalues[‘price‘];

      edit10.readonly:=true;edit10.color:=clmenu;

      edit11.text:=fieldvalues[‘booktype‘];

      edit11.readonly:=true;edit11.color:=clmenu;

      edit12.text:=fieldvalues[‘number1‘];

      edit12.readonly:=true;edit12.color:=clmenu;

      if  fieldvalues[‘a(chǎn)ddation‘]<>null

then edit25.text:=fieldvalues[‘a(chǎn)ddation‘]

      else edit25.text:=‘‘;

      edit25.readonly:=true;edit25.color:=clmenu;

      end

      else

      begin    file://在沒有查找到的情況下,清空所有顯示框

      edit1.readonly:=false;edit1.text:=‘‘;edit1.color:=clmenu;

      edit6.readonly:=false;edit6.text:=‘‘;edit6.color:=clmenu;

      edit7.readonly:=false;edit7.text:=‘‘;edit7.color:=clmenu;

      edit8.readonly:=false;edit8.text:=‘‘;edit8.color:=clmenu;

      edit9.readonly:=false;edit9.text:=‘‘;edit9.color:=clmenu;

      edit10.readonly:=false;edit10.text:=‘‘;edit10.color:=clmenu;

      edit11.readonly:=false;edit11.text:=‘‘;edit11.color:=clmenu;

      edit12.readonly:=false;edit12.text:=‘‘;edit12.color:=clmenu;

      edit25.readonly:=false;edit25.text:=‘‘;edit25.color:=clmenu;

      messagedlg(‘沒有找到你所需要的記錄!‘,mtinformation,[mbok],0);

      edit13.text:=‘‘;edit13.setfocus;

      end;

  end;

with datamoduleform.inquery do   file://自動入庫編號的獲取

  begin

    close;

    sql.clear;

    sql.add(‘select * from inrecord where inid>=all(select inid from inrecord)‘);

    open;            file://找到入庫編號中最大的一個

    edit26.readonly:=false;

    edit26.text:=fieldvalues[‘inid‘]+1;  file://最大的入庫編號加1形成新的入庫編號

    edit26.readonly:=true;edit26.color:=clmenu;  file://設(shè)置編號的不可更改性

  end;

end;

**********************************************************************

procedure tinoutform.speedbutton1click(sender: tobject);

var s:integer;

begin            file://入庫管理添加按鈕事件

  if edit1.text<>null

  then messagedlg(‘請輸入完整的入庫信息和圖書信息,然后單擊確定按鈕?!?

mtinformation,[mbok],0)

  else  begin

    if (edit2.text=‘‘) or (edit3.text=‘‘) or (edit4.text=‘‘) or (edit5.text=‘‘)

    then  begin

      messagedlg(‘請輸入完整的入庫信息!‘,mtinformation,[mbok],0);

      edit2.setfocus;

    end

    else  begin

      with datamoduleform.inquery do    file://將找到的圖書信息顯示

      begin

      close;

      sql.clear;

sql.add(‘insert into inrecord values(:inid,:bookid,:empid,:shopid,

:number,:indate)‘);   file://向入庫信息表中插入記錄

      parameters.parambyname(‘inid‘).value:=edit26.text;  file://向edit框取值

      parameters.parambyname(‘bookid‘).value:=edit13.text;

      parameters.parambyname(‘empid‘).value:=edit2.text;

      parameters.parambyname(‘shopid‘).value:=edit3.text;

      parameters.parambyname(‘number‘).value:=edit4.text;

      parameters.parambyname(‘indate‘).value:=edit5.text;

      execsql;

      end;

      edit12.readonly:=false;

      s:=strtoint(edit12.text)+strtoint(edit4.text);  file://計算入庫后庫存圖書數(shù)量

      edit12.text:=inttostr(s);    file://將修改后的庫存圖書數(shù)量顯示

      edit12.readonly:=true;

      with datamoduleform.bookquery do     file://修改庫存記錄中圖書數(shù)量

      begin

      close;

      sql.clear;

      sql.add(‘update bookrecord set number1=:number where

bookid=:bookid‘);

      parameters.parambyname(‘number‘).value:=s;

      parameters.parambyname(‘bookid‘).value:=edit13.text;

      execsql;         file://提交sql語句

      messagedlg(‘記錄已成功添加!‘,mtinformation,[mbok],0);

      edit13.setfocus;

      end;

    end;

  end;

end;

**********************************************************************

procedure tinoutform.speedbutton2click(sender: tobject);

begin          file://入庫管理確定按鈕事件

  if (edit2.text=‘‘) or (edit3.text=‘‘) or (edit4.text=‘‘) or (edit5.text=‘‘)

     or (edit6.text=‘‘) or (edit7.text=‘‘) or (edit8.text=‘‘) or (edit9.text=‘‘)

     or (edit10.text=‘‘) or (edit11.text=‘‘) or (edit25.text=‘‘)

  then  begin          file://判斷輸入信息的完整性

  messagedlg(‘請輸入所需的全部入庫信息!‘,mtinformation,[mbok],0);

edit2.setfocus;

end

  else

  begin

    with datamoduleform.inquery do    file://入庫信息添加

    begin

    close;

    sql.clear;

sql.add(‘insert into inrecord values(:inid,:bookid,:empid,:shopid,

:number,:indate)‘);      file://向入庫信息表中插入記錄

    parameters.parambyname(‘inid‘).value:=edit26.text;

    parameters.parambyname(‘bookid‘).value:=edit1.text;

    parameters.parambyname(‘empid‘).value:=edit2.text;

    parameters.parambyname(‘shopid‘).value:=edit3.text;

    parameters.parambyname(‘number‘).value:=edit4.text;

    parameters.parambyname(‘indate‘).value:=edit5.text;

    execsql;

    end;

    with datamoduleform.bookquery do

    begin

     close;

     sql.clear;        file://在完成入庫信息的添加后,修改庫存記錄

sql.add(‘insert into bookrecord values(:bookid,:bookname,:author,

:publisher,:pubdate,:price,:booktype,:number,:addration)‘);

     parameters.parambyname(‘bookid‘).value:=edit1.text;

     parameters.parambyname(‘bookname‘).value:=edit6.text;

     parameters.parambyname(‘a(chǎn)uthor‘).value:=edit7.text;

     parameters.parambyname(‘publisher‘).value:=edit8.text;

     parameters.parambyname(‘pubdate‘).value:=edit9.text;

     parameters.parambyname(‘price‘).value:=edit10.text;

     parameters.parambyname(‘booktype‘).value:=edit11.text;

     parameters.parambyname(‘number‘).value:=edit4.text;

     parameters.parambyname(‘a(chǎn)ddration‘).value:=edit25.text;

     execsql;

    end;

    messagedlg(‘記錄添加成功!‘,mtinformation,[mbok],0);

  end;

end;

**********************************************************************

procedure tinoutform.speedbutton11click(sender: tobject);

begin           file://新書入庫按鈕事件

  edit13.text:=‘‘;edit13.color:=clmenu;

  with datamoduleform.inquery do   file://自動入庫編號的獲取

  begin

  close;

  sql.clear;

  sql.add(‘select * from inrecord where inid>=all(select inid from inrecord)‘);

  open;

  edit26.text:=fieldvalues[‘inid‘]+1;

  edit26.readonly:=true;edit26.color:=clmenu;

  end;

  with datamoduleform.bookquery do    file://自動圖書編號的獲取

  begin

  close;

    sql.clear;

    sql.add(‘select * from bookrecord where bookid>=all(select bookid from bookrecord)‘);     file://找到庫存圖書編號中最大的一個

    open;

    edit1.readonly:=false;

    edit1.text:=fieldvalues[‘bookid‘]+1;   file://顯示自動生成的圖書編號

    edit1.readonly:=true;edit1.color:=clmenu;

  end;

  edit2.text:=‘‘;edit3.text:=‘‘;edit4.text:=‘‘;edit5.text:=‘‘;

  edit6.readonly:=false;edit6.text:=‘‘;edit6.color:=clwindow;

  edit7.readonly:=false;edit7.text:=‘‘;edit7.color:=clwindow;

  edit8.readonly:=false;edit8.text:=‘‘;edit8.color:=clwindow;

  edit9.readonly:=false;edit9.text:=‘‘;edit9.color:=clwindow;

  edit10.readonly:=false;edit10.text:=‘‘;edit10.color:=clwindow;

  edit11.readonly:=false;edit11.text:=‘‘;edit11.color:=clwindow;

  edit12.readonly:=false;edit12.text:=‘‘;edit12.color:=clmenu;

  edit25.readonly:=false;edit25.text:=‘‘;edit25.color:=clwindow;

end;

procedure tinoutform.speedbutton22click(sender: tobject);

var s:integer;

begin            file://出庫管理確定按鈕事件

if (edit24.text=‘‘) or (edit27.text=‘‘) or (edit28.text=‘‘)

then begin

messagedlg(‘請輸入完整的出庫信息!‘,mtinformation,[mbok],0);

edit24.setfocus;

   end

else begin

if edit27.text>edit21.text    file://檢查出庫數(shù)量是否小于庫存數(shù)量

then begin

messagedlg(‘庫存中的圖書數(shù)量不夠!‘,mtinformation,[mbok],0);

edit27.text:=‘‘;edit27.setfocus;

     end

else begin

  with datamoduleform.outquery do

  begin

  close;

  sql.clear;

sql.add(‘insert into outrecord values(:outid,:bookid,:empid,

:number,:outtime)‘);    file://添加出庫記錄

parameters.parambyname(‘outid‘).value:=edit23.text;

parameters.parambyname(‘bookid‘).value:=edit14.text;

parameters.parambyname(‘empid‘).value:=edit24.text;

parameters.parambyname(‘number‘).value:=edit27.text;

parameters.parambyname(‘outtime‘).value:=edit28.text;

execsql;

end;

edit21.readonly:=false;

s:=strtoint(edit21.text)-strtoint(edit27.text);  file://計算出庫后庫存圖書數(shù)量

edit21.text:=inttostr(s);    file://顯示出庫后庫存圖書數(shù)量

edit21.readonly:=true;

with datamoduleform.bookquery do

begin      file://修改庫存圖書數(shù)量

close;

sql.clear;

sql.add(‘update bookrecord set number1=:number where bookid=:bookid‘);

parameters.parambyname(‘number‘).value:=s;

parameters.parambyname(‘bookid‘).value:=edit14.text;

execsql;

end;

messagedlg(‘出庫記錄添加成功!‘,mtinformation,[mbok],0);

edit14.text:=‘‘;edit14.setfocus;

end;

end;

end;       

§5.5  查詢功能的實(shí)現(xiàn)

    查詢功能包括員工信息查詢,供應(yīng)商信息查詢,入庫信息查詢和出庫信息查詢。由于每一個功能的實(shí)現(xiàn)都差不太多,而且其窗體也差不太多,所以在這里只給出員工信息查詢窗體及其源代碼。

           

                      圖5.6  員工信息查詢窗體

procedure tfindempform.speedbutton1click(sender: tobject);

var s1,s2,s3 :string;

begin          file://員工記錄查詢窗體查找按鈕事件

with datamoduleform.empquery do

begin

close;

sql.clear;

sql.add(‘select * from employee‘);

sql.add(‘where employeeid like :empid and employeename like :name and grade like :grade‘);         file://實(shí)現(xiàn)模糊查詢功能

if edit1.text<>‘‘  then  s1:=‘%‘+edit1.text+‘%‘  else  s1:=‘%‘;

parameters.parambyname(‘empid‘).value:=s1;

if edit2.text<>‘‘ then  s2:=‘%‘+edit2.text+‘%‘   else  s2:=‘%‘;

parameters.parambyname(‘name‘).value:=s2;

if edit3.text<>‘‘  then  s3:=‘%‘+edit3.text+‘%‘  else  s3:=‘%‘;

parameters.parambyname(‘grade‘).value:=s3;

open;

if fieldvalues[‘employeeid‘]<>null

then  findempform.close      file://在找到記錄的情況下關(guān)閉查找窗口

else

begin

messagedlg(‘沒有找到你所需要的記錄!‘,mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit3.text:=‘‘;edit1.setfocus;

close;  sql.clear;

sql.add(‘select * from employee‘);    file://刷新員工信息窗口

open;

end; end;

end;

§5.6  系統(tǒng)登陸窗體模塊的實(shí)現(xiàn)

由于系統(tǒng)登陸窗體中有一幅彩圖,在這里不便給出,而只給出了系統(tǒng)的實(shí)現(xiàn)。

var  keyname: string;   file://定義了一個全局變量,在key2中有調(diào)用

procedure tkeyform.speedbutton1click(sender: tobject);

var s:string;              file://登陸窗口登陸按鈕事件

begin

if  (edit1.text=‘‘)  then  begin

messagedlg(‘清輸入登陸姓名和密碼!‘,mtinformation,[mbok],0);

edit1.setfocus;

end

else begin

datamoduleform.keytable.active:=true;

if not datamoduleform.keytable.locate(‘keyname‘,edit1.text,[])

            file://判斷登陸名是否存在

then begin

messagedlg(‘登陸名錯誤,請重新輸入!‘,mtinformation,[mbok],0);

edit1.text:=‘‘; edit1.setfocus;

end

else begin

with datamoduleform.keyquery do

begin

close;  sql.clear;

sql.add(‘select * from key where keyname=:keyname‘);

parameters.parambyname(‘keyname‘).value:=edit1.text;

open;

s:=fieldvalues[‘keyno‘];

end;

if s<>edit2.text   file://判斷登陸密碼是否正確

then begin

messagedlg(‘登陸密碼錯誤,請重新輸入!‘,mtinformation,[mbok],0);

edit2.text:=‘‘; edit2.setfocus;

end

else begin

keyname:=edit1.text;

keyform.hide;

mainform.show;mainform.windowstate:=wsmaximized;

end; end; end;

end;

§5.7  用戶管理功能的實(shí)現(xiàn)

5.7.1   用戶管理主窗體

           

                       圖5.7  用戶管理主窗體

5.7.2   密碼修改窗體模塊的實(shí)現(xiàn)

           

                        圖5.8  密碼修改窗體

procedure tkey2form.speedbutton1click(sender: tobject);

begin          file://密碼修改窗口修改按鈕事件

if (edit1.text=‘‘)or(edit2.text=‘‘)or(edit3.text=‘‘)

then begin

messagedlg(‘請輸入完整的信息?!?mtinformation,[mbok],0);

edit1.setfocus;

end

else begin

if not datamoduleform.keytable.locate(‘keyno‘,edit1.text,[])

then begin

messagedlg(‘原密碼輸入錯誤,不能修改新密碼!‘,mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit3.text:=‘‘;edit1.setfocus;

end

else begin

if edit2.text<>edit3.text

then begin

messagedlg(‘兩次密碼輸入不同,請重新輸入新密碼!‘,mtinformation,[mbok],0);

edit2.text:=‘‘;edit3.text:=‘‘;edit2.setfocus;

end

else begin         file://在數(shù)據(jù)庫中修改密碼

with datamoduleform.keyquery do

begin

close;   sql.clear;

sql.add(‘update key set keyno=:keyno where keyname=:keyname‘);

parameters.parambyname(‘keyname‘).value:=keyname;

parameters.parambyname(‘keyno‘).value:=edit2.text;

execsql;

messagedlg(‘密碼修改成功!‘,mtinformation,[mbok],0);

key2form.close;

end; end; end; end;

end;

5.7.3   用戶注冊窗體模塊的實(shí)現(xiàn)

           

                         圖5.9  用戶注冊窗體

procedure tkey3form.speedbutton1click(sender: tobject);

begin        file://用戶注刪窗口注刪按鈕事件

if (edit1.text=‘‘)or(edit2.text=‘‘)or(edit3.text=‘‘)

then begin

messagedlg(‘請輸入完整的信息!‘,mtinformation,[mbok],0);

edit1.setfocus;

end

else begin

if datamoduleform.keytable.locate(‘keyname‘,edit1.text,[])

       file://判斷用戶名是否存在,系統(tǒng)不允許用戶名重復(fù)

then begin

messagedlg(‘用戶名已存在,請輸入新的用戶名和密碼!‘,

mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit3.text:=‘‘;edit1.setfocus;

end

else begin

if edit2.text<>edit3.text

then begin

messagedlg(‘您輸入的兩個密碼不相同,請重新輸入!‘,mtinformation,[mbok],0);

edit2.text:=‘‘;edit3.text:=‘‘;edit2.setfocus;

end

else begin

with datamoduleform.keyquery do     file://在數(shù)據(jù)庫中添加該用戶

begin

close;

sql.clear;

sql.add(‘insert into key values(:keyname,:keyno)‘);

parameters.parambyname(‘keyname‘).value:=edit1.text;

parameters.parambyname(‘keyno‘).value:=edit2.text;

execsql;

end;

messagedlg(‘新用戶添加成功,您可以繼續(xù)添加用戶,或按“取消”退出。‘,mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit3.text:=‘‘;edit1.setfocus;

end; end; end;

end;

5.7.4   用戶注銷窗體模塊的實(shí)現(xiàn)

           

                         圖5.10  用戶注銷窗體

procedure tkey4form.speedbutton1click(sender: tobject);

var s:string;

begin        file://用戶注銷窗口注銷按鈕事件

if (edit1.text=‘‘)or(edit2.text=‘‘)

then messagedlg(‘請輸入完整的信息!‘,mtinformation,[mbok],0)

else begin

if not datamoduleform.keytable.locate(‘keyname‘,edit1.text,[])

      file://判斷用戶名是否存在,用戶名必須存在,才可以刪除

then begin

messagedlg(‘您所輸入的用戶名不存在,請重新輸入或按“取消”退出。‘,

mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit1.setfocus;

end

else begin

with datamoduleform.keyquery do

begin

close;

sql.clear;

sql.add(‘select * from key where keyname=:keyname‘);

parameters.parambyname(‘keyname‘).value:=edit1.text;

open;

s:=fieldvalues[‘keyno‘];

end;

if s<>edit2.text  file://判斷該用戶名下的密碼是否正確

then begin

messagedlg(‘您所輸入的密碼不正確,請重新輸入或按“取消”退出?!?

mtinformation,[mbok],0);

edit2.text:=‘‘;edit2.setfocus;

end

else begin        file://從數(shù)據(jù)庫中刪除該用戶

with datamoduleform.keyquery do

begin

close;

sql.clear;

sql.add(‘delete from key where keyname=:keyname‘);

parameters.parambyname(‘keyname‘).value:=edit1.text;

execsql;

end;

messagedlg(‘用戶已成功刪除,您可以繼續(xù)刪除用戶,或按“取消”退出?!?

mtinformation,[mbok],0);

edit1.text:=‘‘;edit2.text:=‘‘;edit1.setfocus;

end; end; end;

end;

 

                        結(jié)束語

本系統(tǒng)是一個面向小型圖書企業(yè),具有一定實(shí)用性的數(shù)據(jù)庫信息管理系統(tǒng)。它主要完成對圖書倉庫的一系列管理,包括入庫、出庫、庫存以及員工和供應(yīng)商信息管理。本系統(tǒng)采用當(dāng)前流行的面向?qū)ο蟮拈_發(fā)工具—delphi來完成整個系統(tǒng)的設(shè)計,在數(shù)據(jù)庫的設(shè)計上利用了access的便利性和實(shí)用性。

本系統(tǒng)具有相當(dāng)?shù)膶?shí)用功能。在查詢方面,系統(tǒng)實(shí)現(xiàn)了多條件任意字段的模糊查詢,同時在分類查詢上實(shí)現(xiàn)了動態(tài)生成,系統(tǒng)可以自動識別用戶不同的輸入。在圖書入庫、出庫和庫存三者之間建立了良好的鏈接關(guān)系,某一部分地修改均會自動引發(fā)系統(tǒng)對與其相關(guān)的部分進(jìn)行連鎖修改。在用戶管理方面,系統(tǒng)較好地實(shí)現(xiàn)了用戶注冊,用戶注銷和密碼修改等各項功能。

系統(tǒng)在設(shè)計過程中不可避免地遇到了各種各樣的問題,由于整個系統(tǒng)完全都是由個人設(shè)計的,有關(guān)delphi許多細(xì)節(jié)問題都要靠自己去摸索,加之本人水平有限,并沒有完全地理解delphi的強(qiáng)大功能,而且還存在著許多不足之處。如:

 受開發(fā)條件和開發(fā)時間的限制,本系統(tǒng)只利用了本地數(shù)據(jù)庫access,它同應(yīng)用程序處于同一系統(tǒng)中,能存儲的數(shù)據(jù)量也有一定限制,并沒有發(fā)揮出delphi其數(shù)據(jù)庫方面的優(yōu)勢;

 報表打印功能尚不夠全面完善,不能實(shí)現(xiàn)動態(tài)報表;

 在一些數(shù)據(jù)輸入時沒有及時的進(jìn)行數(shù)據(jù)格式校驗,不能保證數(shù)據(jù)輸入的絕對正確性。

 由于時間關(guān)系,系統(tǒng)功能實(shí)現(xiàn)不夠完善,使用不是很方便,比如,沒有實(shí)現(xiàn)多條記錄的連鎖刪除和添加以及數(shù)據(jù)的導(dǎo)入功能。

這些都是需要完善的地方,該系統(tǒng)離實(shí)際使用也還有相當(dāng)?shù)木嚯x,需要我進(jìn)行不斷地補(bǔ)充和完善。

通過本次畢業(yè)設(shè)計我學(xué)到了不少新的東西,也發(fā)現(xiàn)了大量的問題,有些在設(shè)計過程中已經(jīng)解決,有些還有待今后慢慢學(xué)習(xí)。只要學(xué)習(xí)就會有更多的問題,有更多的難點(diǎn),但也會有更多的收獲。

 考 文 獻(xiàn)

[1] 鄭榮貴、黃平、谷會東,delphi 6.0數(shù)據(jù)庫開發(fā)與應(yīng)用,中科多媒體電子出版社,2002

[2] 伍俊良,delphi 6控件應(yīng)用實(shí)例教程,北京希望電子出版社,2002

[3] 盧國俊,delphi 6數(shù)據(jù)庫開發(fā),電子工業(yè)出版社,2002