物理模型論文范文
時(shí)間:2023-04-01 22:41:35
導(dǎo)語(yǔ):如何才能寫好一篇物理模型論文,這就需要搜集整理更多的資料和文獻(xiàn),歡迎閱讀由公務(wù)員之家整理的十篇范文,供你借鑒。
篇1
1前言隨著計(jì)算機(jī)技術(shù)和人類社會(huì)經(jīng)濟(jì)的發(fā)展,對(duì)于紡織服裝業(yè)CAD/CAM的應(yīng)用要求也越來(lái)越高,二維服裝CAD系統(tǒng)已經(jīng)不能滿足要求,人們迫切希望借助計(jì)算機(jī)完成一些更加實(shí)用的三維功能。若能直接將二維服裝CAD系統(tǒng)設(shè)計(jì)的衣片,在計(jì)算機(jī)上真實(shí)地模擬出穿在人體上的效果,便可以幫助設(shè)計(jì)師直接在計(jì)算機(jī)上進(jìn)行著裝效果檢查、服裝裁剪片縫合檢查等工作。這樣就可大大提高服裝從設(shè)計(jì)階段到生產(chǎn)階段間的效率,具有非常重要的實(shí)用價(jià)值。要通過(guò)計(jì)算機(jī)實(shí)現(xiàn)這一功能,有兩個(gè)關(guān)鍵的問題必須解決:1)建立合適的織物變形模型;2)選擇高效而實(shí)用的碰撞檢測(cè)算法。
研究織物變形仿真的方法通常分為三類:幾何的、物理的和混合的(幾何和物理方法的混合)。純幾何的造型方法很難反映織物的物理特性,因此基于物理的方法研究,近年來(lái)已占據(jù)了主導(dǎo)地位。在織物變形物理仿真模型中[1],按比擬織物結(jié)構(gòu)的方式又可分為兩大類:1)離散質(zhì)點(diǎn)型模型:比較典型的有Feynma等建立的質(zhì)點(diǎn)網(wǎng)格模型、Breen等建立的粒子模型和XProvot等建立的彈簧質(zhì)點(diǎn)模型;2)連續(xù)介質(zhì)型模型:比較典型的有Terzopoulos等建立的彈性變型模型、Liling等建立的空氣動(dòng)力模型、Aono建立的波傳播模型、Collier等建立的有限元模型等。
以上的織物變形物理仿真模型,由于其建模的原理和方法不盡相同,因此,它們適用于不同的應(yīng)用場(chǎng)合有其各自的優(yōu)缺點(diǎn)。
我們結(jié)合設(shè)計(jì)虛擬穿衣功能的實(shí)際,認(rèn)為XProvot所建立的彈簧質(zhì)點(diǎn)模型,模型簡(jiǎn)單,易于計(jì)算機(jī)實(shí)現(xiàn),在模擬衣片復(fù)雜的動(dòng)態(tài)變形過(guò)程時(shí),能夠取得比較真實(shí)的模擬效果和較快的模擬速度。
在模擬三維服裝穿在人體上的真實(shí)效果時(shí),會(huì)遇到大量的碰撞現(xiàn)象:衣片同人模之間以及衣片自身間的一種相互滲透和穿越。只有很好地解決了滲透和穿越的問題,才能逼真地完成虛擬穿衣的模擬過(guò)程。因此,碰撞檢測(cè)是整個(gè)模擬過(guò)程的關(guān)鍵。碰撞檢測(cè)非常耗時(shí),最簡(jiǎn)單的碰撞檢測(cè)算法是對(duì)兩個(gè)碰撞體中的所有基本幾何元素(通常為三角形)進(jìn)行兩兩相交測(cè)試。
現(xiàn)有的碰撞檢測(cè)算法大致可劃分為兩大類:空間分解法(spacedecomposition),和層次包圍盒法(hierarchicalboundingvolumes)。前者是將整個(gè)虛擬空間劃分成相等體積的小單元格,只對(duì)占據(jù)同一單元格或相鄰單元格的幾何對(duì)象進(jìn)行相交測(cè)試。比較典型的方法有八叉樹和BSP樹。層次包圍盒法的核心思想是利用體積略大而幾何特性簡(jiǎn)單的包圍盒將復(fù)雜幾何對(duì)象包裹起來(lái),在進(jìn)行碰撞檢測(cè)時(shí),首先進(jìn)行包圍盒之間相交測(cè)試,只有包圍盒相交時(shí),才對(duì)其所包裹的對(duì)象,做進(jìn)一步求交計(jì)算。在構(gòu)造碰撞體的包圍盒時(shí),若引入樹狀層次結(jié)構(gòu),可快速剔除不發(fā)生碰撞的元素,減少大量不必要的相交測(cè)試,從而提高碰撞檢測(cè)效率。比較典型的包圍盒類型有沿坐標(biāo)軸的包圍盒AABB(axisalignedboundingboxes),包圍球(sphere),方向包圍盒OBB(orientedboundingbox)等。
在本文中,我們充分利用了AABB層次包圍盒法的優(yōu)勢(shì),同時(shí)在構(gòu)建靜態(tài)人模的AABB樹時(shí),又借助層次空間分解法中子空間在空間排列上的有序性和相關(guān)性的思想,將縫合衣片的相對(duì)位置同人模自身的結(jié)構(gòu)信息相結(jié)合,靈活地構(gòu)造人模AABB樹,這樣減少了需相交測(cè)試的元素,從而提高了碰撞檢測(cè)的效率。
2織物的變形模型
2.1織物變形模型的描述
我們建立的織物變形模型是以XProvot的彈簧質(zhì)點(diǎn)模型作為基礎(chǔ),將織物設(shè)想為一個(gè)個(gè)質(zhì)點(diǎn)集合,質(zhì)點(diǎn)間相互關(guān)系歸結(jié)為質(zhì)點(diǎn)間的彈簧作用。其中彈簧分為三類:結(jié)構(gòu)彈簧、剪切彈簧和彎曲彈簧,具體構(gòu)成如圖1所示。圖1織物模型離散成規(guī)則網(wǎng)格
1)結(jié)構(gòu)彈簧:在質(zhì)點(diǎn)Pij和Pi+1,j間,以及Pij和Pi,j+1間的彈簧為結(jié)構(gòu)彈簧,結(jié)構(gòu)彈簧是為了保持質(zhì)點(diǎn)間初始狀態(tài)時(shí)的距離。
2)剪切彈簧:在質(zhì)點(diǎn)Pij和Pi+1,j+1間,以及Pi+1,j和Pi,j+1間的彈簧為剪切彈簧。剪切彈簧是為了防止織物在自身平面過(guò)渡和不真實(shí)的變形,而給織物的一個(gè)剪切剛性。3)彎曲彈簧:在質(zhì)點(diǎn)Pij和Pi+2,j間,以及Pij和Pi,j+2間的彈簧為彎曲彈簧,彎曲彈簧是為了防止織物彎曲。2.2質(zhì)點(diǎn)的位移在縫合衣片過(guò)程中,衣片上所有質(zhì)點(diǎn)因受力而產(chǎn)生一定的位移,質(zhì)點(diǎn)位移我們選用Nowton運(yùn)動(dòng)定律來(lái)描述:F外力(i,j)+F內(nèi)力(i,j)=ma(i,j)其中,m是質(zhì)點(diǎn)P(i,j)的質(zhì)量。在本文中,我們假定布料是各向均質(zhì)的,因此,質(zhì)點(diǎn)的質(zhì)量可由衣片總質(zhì)量除以質(zhì)點(diǎn)總數(shù)得到,a(i,j)是該點(diǎn)加速度,F外力(i,j)是該點(diǎn)所受的外力,F內(nèi)力(i,j)是該點(diǎn)所受的內(nèi)力。為了簡(jiǎn)化模型,在我們?nèi)S服裝CAD系統(tǒng)中,只考慮兩種外力:縫合力和重力??梢杂靡韵鹿絹?lái)表示:F外力(i,j)=F縫合力(i,j)+F重力(i,j)
在衣片縫合過(guò)程中,為了將不同的衣片縫在一起,我們?cè)谝缕瑢?duì)應(yīng)縫合邊上加載縫合力。在模型中,縫合力被定義成對(duì)應(yīng)縫合點(diǎn)之間距離的線性函數(shù)。對(duì)兩個(gè)縫合點(diǎn)pi,j和qi,j間的縫合力,可以按如下公式計(jì)算:F縫合力(i,j)=CsDis(pi,j,qi,j)Npi,j-qi,j式中Cs為縫合力系數(shù),該系數(shù)與織物的縫合性能有關(guān),通常,較難變形的布料采用較大的縫合力系數(shù);Dis(pi,j,qi,j)表示兩縫合點(diǎn)pi,j和qi,j間的距離;Npi,j-qi,j表示從pi,j點(diǎn)指向qi,j點(diǎn)的單位方向矢量。為了獲得較真實(shí)的仿真效果,我們?cè)谧冃文P椭锌紤]了衣片所受的重力。質(zhì)點(diǎn)所受的重力可按如下公式計(jì)算:F重力(i,j)=mi,jg式中mi,j為質(zhì)點(diǎn)pi,j的質(zhì)量。在彈簧質(zhì)點(diǎn)模型中,唯一考慮的彈性內(nèi)力是彈簧的彈性變形力,由于采用的是理想的彈簧質(zhì)點(diǎn)系統(tǒng),可以利用胡克(Hooke)定律來(lái)計(jì)算彈簧的彈性變形力:F內(nèi)力(i,j)=-∑(k,l)∈Rk(Pi,jPk,l-Pi,jPk,l0Pi,jPk,lPi,jPk,l)其中,k是彈簧的彈性變形系數(shù),R是P(i,j)鄰點(diǎn)的集合,Pi,jPk,l0表示質(zhì)點(diǎn)P(i,j)與質(zhì)點(diǎn)P(k,l)之間的原始距離,彈簧的彈性變形系數(shù)k可以?讕菟∮彌锏牟牧閑閱懿問呷范ā?/P>
2.3織物變形模型的求解我們選擇顯式歐拉方法來(lái)求解織物變形模型。求解公式如下:ai,j(t+t)=1mi,jFi,j(t)Vi,j(t+t)=Vi,j(t)+tai,j(t+t)Pi,j(t+t)=Pi,j(t)+tVi,j(t+t)其中,Fi,j是質(zhì)點(diǎn)P(i,j)所受所有力的合力,mi,j(t)是質(zhì)點(diǎn)P(i,j)的質(zhì)量,ai,j(t)、Vi,j(t)和Pi,j(t)分別是質(zhì)點(diǎn)P(i,j)在時(shí)間t的加速度,速度和位置。t是系統(tǒng)選定的時(shí)間步長(zhǎng)。
3基于AABB樹層次包圍盒的碰撞檢測(cè)
3.1建立AABB樹一個(gè)碰撞體的AABB被定義為包含該碰撞體,且邊平行于坐標(biāo)軸的最小六面體。因此,描述一個(gè)AABB,僅需六個(gè)標(biāo)量。在構(gòu)造AABB包圍盒時(shí),需沿著碰撞體局部坐標(biāo)系統(tǒng)的軸向(X,Y,Z)來(lái)構(gòu)造,所以所有的AABB包圍盒具有一致的方向。
AABB樹是基于AABB的二叉樹,按照由上至下的遞歸細(xì)分方式構(gòu)造生成的。在每一次遞歸過(guò)程中,要求取最小的AABB,需沿所選擇的剖分面將碰撞體分為正負(fù)兩半,并將所對(duì)應(yīng)的原始幾何元素(如三角面)分別歸屬正、負(fù)兩邊,整個(gè)遞歸過(guò)程類似于空間二叉剖分,只是每次剖分的對(duì)象是AABB,而不是空間區(qū)域。遞歸細(xì)分一直要進(jìn)行到每一個(gè)葉子節(jié)點(diǎn)只包容一個(gè)原始幾何元素為止,所以具有n個(gè)原始幾何元素的AABB樹具有n-1個(gè)非葉子節(jié)點(diǎn)和n個(gè)葉子節(jié)點(diǎn)。對(duì)于剖分面的選擇,在本文中,選擇垂直AABB的最長(zhǎng)軸,且平分該軸的平面。經(jīng)試驗(yàn)證明,這種方式,在大多數(shù)情況下的算法復(fù)雜度僅為O(nlogn),較其它的剖分面選擇方法有了極大的提高。至于原始幾何元素的歸屬則應(yīng)依據(jù)幾何元素的重心P在最長(zhǎng)軸上的投影坐標(biāo)。若投影坐標(biāo)大于剖分面的坐標(biāo)(mid),則在剖分面的正向,否則在負(fù)向,如圖2所示。圖2三角面歸屬負(fù)區(qū)域,因?yàn)槠滟|(zhì)心投影坐標(biāo)小于剖分面的基準(zhǔn)坐標(biāo)
3.2AABB的相交判斷AABB間的相交測(cè)試比較簡(jiǎn)單,兩個(gè)AABB相交當(dāng)且僅當(dāng)它們?cè)谌齻€(gè)坐標(biāo)軸上的投影區(qū)間均相交。通過(guò)投影,我們即將三維求交問題轉(zhuǎn)化為一維求交問題。而對(duì)一維求交問題,我們則采用SAT(SeparatingAxesTest)[2]法。因SAT無(wú)需求交計(jì)算,只需比較兩個(gè)包圍盒分別在三個(gè)軸向上投影的重疊情況,即可得出相交測(cè)試結(jié)果,非常簡(jiǎn)單?,F(xiàn)以在一個(gè)軸向上的投影情況為例說(shuō)明:圖3AABBs在X軸向相交判斷。
設(shè)A,B為兩包圍盒,X為投影軸,CA,CB分別為A,B的中心點(diǎn),PA,PB為點(diǎn)CA,CB在X上的投影。RA,RB分別為包圍盒A,B在X上的投影。若RA+RB
PAPB,(如圖3所示)則在軸向X上A和B不相交,反之在軸向X上A和B鄰接或相53第5期高成英等:虛擬穿衣中織物模型的建立和碰撞檢測(cè)的處理交。當(dāng)包圍盒A,B在三條軸向上的投影均相交時(shí),則A,B相交。定義AABB的六個(gè)最大最小值分別確定了它在三個(gè)坐標(biāo)軸上的投影區(qū)間,因此AABB間的相交測(cè)試最多只需六次比較運(yùn)算,非常簡(jiǎn)單快速。
3.3AABB樹的更新當(dāng)衣片移動(dòng)、旋轉(zhuǎn)后,需要對(duì)AABB進(jìn)行更新,根據(jù)定義AABB的6個(gè)最大最小值的組合,可以得到AABB的8個(gè)頂點(diǎn),對(duì)這8個(gè)頂點(diǎn)進(jìn)行相應(yīng)的旋轉(zhuǎn)和平移變化,并根據(jù)變化后的頂點(diǎn)計(jì)算新的AABB。當(dāng)衣片發(fā)生變形時(shí),需要重新計(jì)算AABB樹中發(fā)生變形了的葉結(jié)點(diǎn)的AABB,再利用變形葉節(jié)點(diǎn)的新AABB來(lái)重新計(jì)算它們父節(jié)點(diǎn)的AABB。這種計(jì)算必須嚴(yán)格按照從下到上的方式進(jìn)行。父節(jié)點(diǎn)AABB的具體求法為:令(Xmax1,Xmin1,Ymax1,Ymin1,Zmax1,Zmin1)和(Xmax2,Xmin2,Ymax2,Ymin2,Zmax2,Zmin2)分別是兩個(gè)變形葉結(jié)點(diǎn)的AABB,則父結(jié)點(diǎn)的AABB即為(max(Xmax1,Xmax2),min(Xmin1,Xmin2),max(Ymax1,Ymax2),min(Ymin1,Ymin2),max(Zmax1,Zmax2),min(Zmin1,Zmin2),只需6次比較運(yùn)算就完成一個(gè)結(jié)點(diǎn)的更新,其效率遠(yuǎn)遠(yuǎn)高于重新構(gòu)造AABB包圍盒樹。
3.4基于AABB樹的碰撞檢測(cè)算法基于AABB樹碰撞檢測(cè)算法的核心是通過(guò)有效地遍歷這兩棵樹,以確定在當(dāng)前位置下,兩個(gè)碰撞體的某些部分是否發(fā)生碰撞,這是一個(gè)雙重遞歸遍歷的過(guò)程。算法描述如下:step1:分別為人模和衣片構(gòu)造AABB樹。step2:人模的AABB樹的根結(jié)點(diǎn)遍歷衣片的AABB樹。如果發(fā)現(xiàn)人模AABB樹的根結(jié)點(diǎn)的包圍盒與衣片AABB樹內(nèi)部結(jié)點(diǎn)的包圍盒不相交,則停止向下遍歷;如果遍歷能到達(dá)衣片AABB樹的葉節(jié)點(diǎn),再用該葉節(jié)點(diǎn)遍歷人模AABB樹。如果能到達(dá)人模AABB樹的葉節(jié)點(diǎn),則進(jìn)一步進(jìn)行基本幾何元素間的相交測(cè)試。step3:檢測(cè)基本幾何元素間是否相交。3.5自碰撞檢測(cè)在衣片縫合過(guò)程中,除了衣片同人模之間的碰撞外,由于衣片的動(dòng)態(tài)變形,使得衣片與衣片自身間也有碰撞現(xiàn)象,因此必須進(jìn)行進(jìn)一步的自相交檢測(cè)。在系統(tǒng)設(shè)計(jì)中,我們利用三角形表面曲率來(lái)簡(jiǎn)化計(jì)算。當(dāng)鄰近三角形法線的夾角較小時(shí),它們不可能發(fā)生碰撞,只有當(dāng)夾角超過(guò)閾值,才有可能碰撞。我們?yōu)槊總€(gè)三角形建立它的臨近三角形列表,通過(guò)判斷每個(gè)三角形的所有鄰近區(qū)域的三角形表面曲率,來(lái)排除大部分不可能相交的情況,從而簡(jiǎn)化了計(jì)算。
4虛擬穿衣的具體實(shí)現(xiàn)步驟
(1)讀入二維服裝CAD系統(tǒng)設(shè)計(jì)的衣片
(2)選擇所有需要縫合衣片的對(duì)應(yīng)的縫合邊
(3)將二維衣片離散并形成初始的彈簧質(zhì)點(diǎn)系統(tǒng)a)將衣片離散成規(guī)則四邊域網(wǎng)格,再將四邊域網(wǎng)格的對(duì)角線相連,形成規(guī)則三角形網(wǎng)格的彈簧質(zhì)點(diǎn)系統(tǒng)。三角形的頂點(diǎn)形成質(zhì)點(diǎn),三角形的邊形成相應(yīng)的彈簧。衣片的三角化,正是為方便地建立衣片的AABB樹;b)按質(zhì)點(diǎn)間的相應(yīng)關(guān)系,加入各種彈力。在離散衣片時(shí),需特別注意的是在(2)中所選擇的對(duì)應(yīng)縫合邊的長(zhǎng)度一定要相等,且當(dāng)衣片離散化時(shí),在對(duì)應(yīng)縫合邊上的原始幾何元素(這里為三角形)的個(gè)數(shù)也應(yīng)相同。若在(2)中所選擇的對(duì)應(yīng)縫合邊長(zhǎng)度不等,或原始幾何元素個(gè)數(shù)不同時(shí),系統(tǒng)將需做一些預(yù)處理:將其中一條縫合邊的所有信息刪除,將另一條縫合邊的相應(yīng)信息賦給它。
(4)將衣片交互式地放置在人體模型附近的初始位置在該步驟中,首先,給每一縫合衣片賦一個(gè)別名(系統(tǒng)自定義的標(biāo)準(zhǔn)別名:左前片,右前片,左后片,右后片等),根據(jù)每一衣片的別名,衣片被自動(dòng)地放置在人體模型附近的相應(yīng)初始位置上。
(5)分別為人模和衣片建立AABB樹本文中所涉及的兩個(gè)碰撞體,分別為人模和衣片,其中人模在整個(gè)動(dòng)態(tài)模擬過(guò)程中為靜態(tài)的,因此,只需在初始化時(shí)構(gòu)造一次AABB樹即可。為了進(jìn)一步提高碰撞檢測(cè)的效率,我們?cè)跇?gòu)造人模的AABB樹時(shí),應(yīng)根據(jù)(4)中得到的縫合衣片別名,結(jié)合人模的幾何結(jié)構(gòu),靈活構(gòu)造人模的AABB樹。例如:假設(shè)我們?cè)?4)中,得到衣片分別為:左前片,右前片,左后片,右后片。我們即可知,將要縫合的為一件四片裁剪片的上衣,所以在構(gòu)造人模的AABB樹,我們只取人模上半身數(shù)據(jù)來(lái)構(gòu)造人模的AABB,具體層次結(jié)構(gòu)如圖4所示。在進(jìn)行人模和衣片間碰撞檢測(cè)時(shí),根據(jù)衣片的別名分別進(jìn)行局部檢測(cè),(例如:左前片,就只需和人模AABB樹第三層最左邊的結(jié)點(diǎn),左前半身的AABB進(jìn)行碰撞檢測(cè))有效地減少了需要碰撞檢測(cè)的元素。系統(tǒng)根據(jù)所縫合的衣片不同,建立的人模AABB樹亦不相同。圖4人模的AABB樹層次結(jié)構(gòu)圖
(6)動(dòng)態(tài)變形模型的計(jì)算根據(jù)衣片的縫合信息,我們?cè)谝缕膶?duì)應(yīng)縫合邊上加載縫合力。在縫合力、重力和衣片上各質(zhì)點(diǎn)間內(nèi)部彈力的共同作用下,二維衣片將逐步變形,并逐漸被縫合在一起,整個(gè)縫合過(guò)程是一個(gè)動(dòng)態(tài)的迭代過(guò)程。在動(dòng)態(tài)迭代過(guò)程中,要同時(shí)進(jìn)行大量的人?!缕g,及衣片—衣片間的碰撞檢測(cè)處理,并給出相應(yīng)碰撞響應(yīng)(當(dāng)有碰撞現(xiàn)象發(fā)生時(shí),要重新調(diào)整碰撞點(diǎn)處的位置,避免發(fā)生穿越和滲透)的處理??p合過(guò)程結(jié)束后,便可以得到縫合好的三維服裝穿在靜態(tài)人模上的效果。
5結(jié)束語(yǔ)實(shí)驗(yàn)證明,本文所采用的織物變形模型———彈簧質(zhì)點(diǎn)模型,模型簡(jiǎn)單,能夠較真實(shí)地反映虛擬環(huán)境下的織物特性。所采用的基于AABB的層次包圍盒碰撞檢測(cè)算法,除了AABB層次包圍盒自身在碰撞檢測(cè)上的較高性能外,算法還從以下幾方面提高了碰撞的檢測(cè)效率:
1)將縫合衣片的相對(duì)位置同人模自身的結(jié)構(gòu)信息相結(jié)合,靈活地構(gòu)造人模AABB樹,減少了人模和衣片之間不可能相交元素碰撞檢測(cè)的次數(shù);
2)AABB包圍盒的相交判斷中,采用SAT方法進(jìn)行包圍盒之間的交疊判斷,降低了算法的復(fù)雜度,提高算法效率。
3)衣片之間的碰撞判斷,利用了每個(gè)三角形相鄰區(qū)域的三角形表面曲率來(lái)簡(jiǎn)化求交判斷。
篇2
內(nèi)容摘要:我國(guó)是國(guó)際貿(mào)易大國(guó),在國(guó)際貿(mào)易中賒銷是主流的貿(mào)易方式,而在賒銷結(jié)算方式中,企業(yè)面臨著控制應(yīng)收賬款風(fēng)險(xiǎn),加快資金運(yùn)轉(zhuǎn)的難題。2008年金融危機(jī)爆發(fā)以來(lái),全球欠款指數(shù)不斷攀升,我國(guó)的出口企業(yè)面臨著更為嚴(yán)峻的國(guó)際市場(chǎng)環(huán)境。國(guó)際保理業(yè)務(wù)以其有效保障賒銷貿(mào)易暢通,促進(jìn)企業(yè)資金高效運(yùn)轉(zhuǎn)而吸引企業(yè)的眼球。目前國(guó)內(nèi)商業(yè)銀行普遍采用小規(guī)模的保理業(yè)務(wù)團(tuán)隊(duì)來(lái)提供保理服務(wù),這種單一的服務(wù)模式已不能滿足企業(yè)需求。借鑒歐美發(fā)達(dá)國(guó)家經(jīng)驗(yàn),成立專業(yè)的保理公司不僅可以為企業(yè)提供多樣化的國(guó)際保理服務(wù),同時(shí)也是我國(guó)建立多層次的金融服務(wù)體系的一個(gè)有益嘗試。
關(guān)鍵詞:商業(yè)銀行國(guó)際貿(mào)易賒銷保理業(yè)務(wù)
保理業(yè)務(wù)是保理商在國(guó)際和國(guó)內(nèi)貿(mào)易中對(duì)買賣雙方提供的一項(xiàng)貿(mào)易服務(wù)綜合性產(chǎn)品,在國(guó)外也被稱為應(yīng)收賬款買斷、應(yīng)收賬款承購(gòu)、保付等,通常是指在以賒銷或承兌交單(D/A)為貿(mào)易條件的情況下,由保理商向賣方提供的包括貿(mào)易融資、銷售分戶賬管理、應(yīng)收賬款催收、信用風(fēng)險(xiǎn)控制與壞賬擔(dān)保等項(xiàng)目的綜合性金融服務(wù)。保理業(yè)務(wù)在歐美等發(fā)達(dá)國(guó)家經(jīng)過(guò)多年的發(fā)展,已形成了較為完備的保理服務(wù)體系:完備的法律基礎(chǔ),相當(dāng)數(shù)量的客戶群體、多層次保理服務(wù)機(jī)構(gòu)等。目前中國(guó)地區(qū)有二十多家商業(yè)銀行能夠提供保理服務(wù),規(guī)模均不大,且保理業(yè)務(wù)在銀行內(nèi)部一般被認(rèn)為是銀行的“副業(yè)”,其服務(wù)能力和業(yè)務(wù)品種往往滿足不了企業(yè)的需求。中國(guó)地區(qū)已成立了數(shù)家專業(yè)的保理公司,但由于缺乏銀行背景,在服務(wù)能力、滿足客戶需求和市場(chǎng)影響力等方面有著一定的局限。銀行成立專業(yè)的保理公司不僅可以為企業(yè)提供多樣化的保理服務(wù),同時(shí)也是我國(guó)建立多層次金融服務(wù)體系的一個(gè)有益嘗試。
一、保理業(yè)務(wù)在我國(guó)的發(fā)展及作用
保理于上世紀(jì)90年代初隨著國(guó)際貿(mào)易的發(fā)展進(jìn)入我國(guó),至今已有近20年的歷史。在2000年以前,我國(guó)保理業(yè)務(wù)處于市場(chǎng)起步和培育階段,商業(yè)銀行中只有中國(guó)銀行和交通銀行開辦了國(guó)際保理業(yè)務(wù),且業(yè)務(wù)規(guī)模較小。2000年以后,開辦保理業(yè)務(wù)的銀行不斷增多,業(yè)務(wù)量大幅增長(zhǎng),并開始辦理國(guó)內(nèi)保理業(yè)務(wù)。到目前為止,我國(guó)已有近20家銀行開辦保理業(yè)務(wù),其中加入國(guó)際保理商聯(lián)合會(huì)(FCI)的有18家。根據(jù)FCI資料,2000年我國(guó)內(nèi)地的保理業(yè)務(wù)合計(jì)為212億歐元.2006年為143億歐元.2008年逾550億歐元,一躍成為FCI出口雙保理業(yè)務(wù)量全球排名第一的地區(qū)。
我國(guó)保理業(yè)務(wù)的發(fā)展?jié)摿θ匀惠^大。據(jù)世界銀行統(tǒng)計(jì)發(fā)現(xiàn),全球保理業(yè)務(wù)量與GDP之比約為2.93%,在保理業(yè)務(wù)相對(duì)發(fā)達(dá)的國(guó)家和地區(qū),保理業(yè)務(wù)量可占GDP的6%以上,英國(guó)、意大利、中國(guó)臺(tái)灣甚至達(dá)到了15%。2008年,我國(guó)內(nèi)地的保理業(yè)務(wù)量只占我國(guó)GDP的1.78%,表明其仍有廣闊的發(fā)展空間。
保理業(yè)務(wù)在促進(jìn)我國(guó)經(jīng)濟(jì)發(fā)展中發(fā)揮了重要的作用。首先保理有利于企業(yè)管理應(yīng)收賬款風(fēng)險(xiǎn)。在賒銷方式下,賣方銷售貨物時(shí)要承擔(dān)較大的風(fēng)險(xiǎn),賣方在貨物發(fā)運(yùn)后,能否順利按期取得貨款,完全取決于買方的信用和支付能力。在保理業(yè)務(wù)中,買方發(fā)生信用風(fēng)險(xiǎn)無(wú)力支付或無(wú)理拖欠貨款時(shí),保理商將承擔(dān)擔(dān)保付款責(zé)任,保理商將按協(xié)議約定的時(shí)間向賣方無(wú)條件支付貨款,且對(duì)賣方無(wú)追索權(quán)。這樣就可以幫助企業(yè)管理賒銷方式下應(yīng)收賬款的商業(yè)風(fēng)險(xiǎn)。其次,保理業(yè)務(wù)有助于企業(yè)獲得銀行融資,加快資金周轉(zhuǎn)。在保理業(yè)務(wù)中,賣方可以在貨物裝船后立即將發(fā)票,匯票、提單等有關(guān)單據(jù)提交給保理商,由保理商買斷全部或部分的應(yīng)收賬款。保理商來(lái)承擔(dān)買方的信用風(fēng)險(xiǎn),賣方融資銀行在購(gòu)買應(yīng)收賬款時(shí)著重審查應(yīng)收賬款的質(zhì)量和歷史履約記錄等.而不過(guò)多地審查企業(yè)本身的資金實(shí)力,通常也不需要企業(yè)提供額外的擔(dān)?;虻盅?,有助于緩解企業(yè)資金周轉(zhuǎn)的壓力。再次,保理業(yè)務(wù)有利于企業(yè)提高市場(chǎng)競(jìng)爭(zhēng)力。自20世紀(jì)80年代以來(lái),貨物買賣市場(chǎng)格局發(fā)生了巨大的變化,逐步由賣方市場(chǎng)轉(zhuǎn)為買方市場(chǎng),產(chǎn)品質(zhì)量和價(jià)格競(jìng)爭(zhēng)的余地越來(lái)越小,賣方之間的競(jìng)爭(zhēng)逐步由品質(zhì)、價(jià)格的競(jìng)爭(zhēng)轉(zhuǎn)為銷售條件方面的競(jìng)爭(zhēng)。絕大多數(shù)的買方不愿再繼續(xù)使用信用證收付貨款方式,轉(zhuǎn)而要求賣方接受賒銷的商業(yè)信用付款方式。在保理業(yè)務(wù)中.賣方應(yīng)收賬款的收款風(fēng)險(xiǎn)由保理商來(lái)承擔(dān),保理商定期催收管理應(yīng)收賬款,有效地幫助賣方采用賒銷的貿(mào)易方式來(lái)開拓市場(chǎng),獲取利潤(rùn)。最后.保理業(yè)務(wù)有利于中小企業(yè)的發(fā)展。中小企業(yè)在我國(guó)國(guó)民經(jīng)濟(jì)中發(fā)揮著重要的作用,但中小企業(yè)信息的內(nèi)部化和不透明使中小企業(yè)尋找貸款和外源性資金時(shí)無(wú)法向銀行提供令人信服的信息,以證明其償還貸款的能力,所以中小企業(yè)普遍面臨融資難的困境。保理業(yè)務(wù)主要依據(jù)貿(mào)易雙方綜合財(cái)務(wù)狀況、應(yīng)收賬款的歷史履約記錄,付款記錄和違約記錄等來(lái)判定買賣雙方的信用風(fēng)險(xiǎn)水平,對(duì)抵質(zhì)押等擔(dān)保條件要求較少,因此保理業(yè)務(wù)更適合于難以提供抵押品或保證人的中小企業(yè)的貿(mào)易融資需求。同時(shí),中小企業(yè)可以通過(guò)保理融資改善財(cái)務(wù)報(bào)表,企業(yè)的應(yīng)收賬款和銀行貸款在財(cái)務(wù)報(bào)表上都表現(xiàn)為負(fù)債,而通過(guò)保理融通資金不但不增加負(fù)債。反而表現(xiàn)為應(yīng)收賬款減少、現(xiàn)金流增加。
二、商業(yè)銀行可以設(shè)立專業(yè)保理公司來(lái)提供保理服務(wù)
(一)保理公司模式是國(guó)際上保理業(yè)務(wù)運(yùn)營(yíng)的主流模式
在保理業(yè)務(wù)的發(fā)展歷程中,商業(yè)銀行一般選擇以下模式之一來(lái)運(yùn)營(yíng)保理業(yè)務(wù):
1.成立附屬的保理公司;
2.成立銀行內(nèi)部的保理部門;
3.由銀行與非銀行金融機(jī)構(gòu)合資成立保理公司。
在國(guó)際上.附屬子公司模式是商業(yè)銀行運(yùn)營(yíng)保理業(yè)務(wù)的主流模式。例如,美國(guó)富國(guó)銀行旗下的富國(guó)貿(mào)易資本公司(WellsFargoTradeCapital),日本瑞穗銀行旗下瑞穗保理公司(MizuhoFactorsLtd).法國(guó)巴黎銀行旗下的巴黎銀行保理公司(BNPParibasFactorSA)等。
我國(guó)內(nèi)地提供保理服務(wù)的銀行有中行、交行等大型商業(yè)銀行、招商.民生等中小股份制商業(yè)銀行、進(jìn)出口銀行等政策性銀行、還有匯豐(中國(guó))、渣打(中國(guó))等外資法人銀行。其中,有18家銀行加入了國(guó)際保理商聯(lián)合會(huì)(FCf),保理業(yè)務(wù)運(yùn)營(yíng)模式均采用銀行內(nèi)成立保理部門或團(tuán)隊(duì)模式進(jìn)行保理業(yè)務(wù)運(yùn)作.無(wú)一家采用保理公司模式,和歐美等國(guó)家的情況相比,我國(guó)保理業(yè)務(wù)運(yùn)營(yíng)模式較為單一。
(二)商業(yè)銀行設(shè)立保理公司有利于銀行和保理業(yè)務(wù)的共同發(fā)展
商業(yè)銀行設(shè)立保理公司后,可通過(guò)保理公司的發(fā)展讓商業(yè)銀行分享更多的收益。保理業(yè)務(wù)作為一項(xiàng)中介服務(wù),能獲得較高的服務(wù)傭金。保理公司可按照其提供的買方信用風(fēng)險(xiǎn)擔(dān)保、催收、資信審核、提供融資等逐項(xiàng)或合并收取保理手續(xù)費(fèi),通常為發(fā)票金額的05%一2%,同時(shí),在提供融資時(shí)還收取融資利息。近年來(lái),我國(guó)經(jīng)濟(jì)連續(xù)多年快速增長(zhǎng),外貿(mào)進(jìn)出口在經(jīng)歷了金融危機(jī)后也逐步恢復(fù)增長(zhǎng),預(yù)計(jì)2009年我國(guó)已取代德國(guó)成為全球第一出口大國(guó),這些都給我國(guó)保理業(yè)的快速發(fā)展創(chuàng)造了良好的市場(chǎng)條件。專業(yè)保理公司可以通過(guò)提供豐富的保理產(chǎn)品和多層次的金融服務(wù),更好地滿足企業(yè)的需求,保理公司在分享市場(chǎng)發(fā)展的收益時(shí)也給母銀行帶來(lái)更多的利潤(rùn)。
商業(yè)銀行采用保理公司模式有利于建立符合保理業(yè)務(wù)特點(diǎn)的風(fēng)險(xiǎn)控制體系。保理業(yè)務(wù)的風(fēng)險(xiǎn)控制側(cè)重于產(chǎn)品特點(diǎn)、貿(mào)易背景、履約記錄、違約概率等貿(mào)易行為的分析,而較少側(cè)重于企業(yè)的資金實(shí)力,抵押擔(dān)保情況等??梢哉f(shuō),保理業(yè)務(wù)的風(fēng)險(xiǎn)管理不同于傳統(tǒng)的銀行借貸業(yè)務(wù)管理,而是兼顧了信用保險(xiǎn)公司和銀行兩種風(fēng)險(xiǎn)管理的模式。設(shè)立保理公司,可以建立符合保理業(yè)務(wù)特點(diǎn)的風(fēng)險(xiǎn)控制體系,采取適當(dāng)積極的業(yè)務(wù)發(fā)展策略,同時(shí)可以將風(fēng)險(xiǎn)限制在公司本身范圍內(nèi),避免向銀行傳遞。
商業(yè)銀行采用保理公司模式有利于保理專業(yè)服務(wù)團(tuán)隊(duì)的建設(shè)。保理業(yè)務(wù)為企業(yè)提供的是包括結(jié)算、擔(dān)保.信用評(píng)估、銷售賬款管理、客戶關(guān)系管理、風(fēng)險(xiǎn)管理甚至保險(xiǎn)等多方面的服務(wù)組合,這種服務(wù)組合需要保理商擁有一支包括前臺(tái)營(yíng)銷、業(yè)務(wù)處理、后臺(tái)技術(shù)支持在內(nèi)的專業(yè)化團(tuán)隊(duì),并建立進(jìn)行業(yè)務(wù)處理和風(fēng)險(xiǎn)控制的專業(yè)化電子平臺(tái)。保理公司的建立有利于銀行打破目前內(nèi)部的條線管理模式,打造專門的服務(wù)團(tuán)隊(duì)和服務(wù)平臺(tái),從而以更高的效率,更專業(yè)的水準(zhǔn)為企業(yè)提供服務(wù)。
(三)我國(guó)商業(yè)銀行具有設(shè)立保理公司的有利條件
我國(guó)大中型商業(yè)銀行綜合經(jīng)營(yíng)和運(yùn)作子公司的經(jīng)驗(yàn)較為豐富。中國(guó)地區(qū)有多家商業(yè)銀行已經(jīng)設(shè)立了多家子公司,有保險(xiǎn)、信托.基金管理公司、租賃等子公司。隨著這些公司的設(shè)立和運(yùn)營(yíng),商業(yè)銀行已積累了高度市場(chǎng)化條件下開展綜合經(jīng)營(yíng)的各項(xiàng)管理和運(yùn)作經(jīng)驗(yàn)。
商業(yè)銀行公司治理和內(nèi)控機(jī)制不斷完善。商業(yè)銀行一向重視公司治理和內(nèi)控建設(shè),特別是部分商業(yè)銀行在香港和上海上市,更進(jìn)一步強(qiáng)化了對(duì)信用風(fēng)險(xiǎn)、市場(chǎng)風(fēng)險(xiǎn)和操作風(fēng)險(xiǎn)的研究和管理。目前,商業(yè)銀行的公司治理日趨完善,風(fēng)險(xiǎn)控制意識(shí)和管理能力不斷提高,為今后保理公司建立良好的公司治理結(jié)構(gòu)奠定了堅(jiān)實(shí)的基礎(chǔ)。
商業(yè)銀行信息披露充分。商業(yè)銀行普遍重視信息披露工作。商業(yè)銀行需要遵循國(guó)內(nèi)監(jiān)管機(jī)構(gòu)的監(jiān)管要求定期披露資料,部分上市的商業(yè)銀行還根據(jù)證交所的《上市規(guī)則》披露各類信息。商業(yè)銀行普遍堅(jiān)持定期對(duì)外披露財(cái)務(wù)信息,不隱瞞各類風(fēng)險(xiǎn)因素,并通過(guò)形式多樣的投資者關(guān)系管理活動(dòng),主動(dòng)將公司重大信息告訴投資者。良好的信息披露制度和透明度強(qiáng)化了外部監(jiān)督和監(jiān)管,有利于商業(yè)銀行設(shè)立保理公司的風(fēng)險(xiǎn)防范和健康發(fā)展。
三、保理公司的公司戰(zhàn)略、競(jìng)爭(zhēng)優(yōu)勢(shì)和風(fēng)險(xiǎn)控制
(一)保理公司的公司戰(zhàn)略
我國(guó)商業(yè)銀行保理公司的戰(zhàn)略目標(biāo)應(yīng)該是能夠?yàn)槠髽I(yè)提供多層次保理服務(wù)、有盈利能力、可持續(xù)發(fā)展的專業(yè)保理公司。
保理公司在創(chuàng)立初期可以學(xué)習(xí)、借鑒國(guó)外專業(yè)保理公司運(yùn)營(yíng)模式,結(jié)合商業(yè)銀行積累的保理營(yíng)運(yùn)經(jīng)驗(yàn),以穩(wěn)健經(jīng)營(yíng)和開拓創(chuàng)新并舉來(lái)開拓市場(chǎng),側(cè)重產(chǎn)品開發(fā),與專業(yè)機(jī)構(gòu)開展合作,通過(guò)細(xì)分客戶來(lái)確定目標(biāo)市場(chǎng).全面提升服務(wù)質(zhì)量,追求在特定市場(chǎng)上的領(lǐng)先和創(chuàng)新,樹立公司品牌。
保理公司提供的保理服務(wù)主要有三類:國(guó)際雙保理、國(guó)際單保理和國(guó)內(nèi)保理。保理公司的服務(wù)對(duì)象可主要定位于為中小企業(yè)提供保理服務(wù),并兼顧大型企業(yè)的保理服務(wù)需求。
中小企業(yè)公司數(shù)量多,規(guī)模較小,交易對(duì)手相對(duì)固定,企業(yè)運(yùn)營(yíng)和賬款管理能力較差,風(fēng)險(xiǎn)評(píng)級(jí)相對(duì)較低,資金壓力較大,難以獲得銀行授信,需要包括資信調(diào)查、賬款管理、信用擔(dān)保、資金融通在內(nèi)的一系列服務(wù)。從保理業(yè)務(wù)自身特點(diǎn)來(lái)看,中小企業(yè)將是保理業(yè)務(wù)最主要的目標(biāo)客戶群體。
大型企業(yè)一般規(guī)模較大,易于取得銀行授信,交易對(duì)手較多,賬款管理水平較高,主要需要保理服務(wù)滿足其進(jìn)行風(fēng)險(xiǎn)管理和買斷應(yīng)收賬款的要求,通過(guò)保理來(lái)調(diào)整其現(xiàn)金流量和資產(chǎn)負(fù)債。
(二)保理公司的競(jìng)爭(zhēng)優(yōu)勢(shì)
商業(yè)銀行設(shè)立的保理公司在公司實(shí)力、人力資源、客戶基礎(chǔ)和同業(yè)合作渠道等方面有著很多的有利條件。首先,商業(yè)銀行設(shè)立的保理公司一般為商業(yè)銀行ioo%控股或絕對(duì)控股,股東實(shí)力雄厚。商業(yè)銀行為設(shè)立保理公司一般均要投入相當(dāng)數(shù)量的資本金來(lái)滿足業(yè)務(wù)發(fā)展的需要。其次,商業(yè)銀行在銀行業(yè)務(wù)領(lǐng)域和保理業(yè)務(wù)領(lǐng)域從事業(yè)務(wù)多年,積累了一大批懂金融、懂保理業(yè)務(wù)的專業(yè)人才,再次,我國(guó)主要的商業(yè)銀行經(jīng)過(guò)10多年來(lái)的業(yè)務(wù)運(yùn)營(yíng)和開拓,已形成了廣泛的保理業(yè)務(wù)客戶基礎(chǔ),同時(shí)商業(yè)銀行雄厚的公司客戶也為保理公司構(gòu)建了更為深厚的基礎(chǔ)。最后,我國(guó)商業(yè)銀行通過(guò)加入國(guó)際保理商聯(lián)合會(huì)已建立起了全球合作的網(wǎng)絡(luò)。商業(yè)銀行豐富的業(yè)務(wù)經(jīng)驗(yàn)和廣泛的同業(yè)合作網(wǎng)絡(luò)使未來(lái)的保理公司能夠?yàn)榭蛻舻膰?guó)際和國(guó)內(nèi)貿(mào)易提供全面支持。
(三)保理公司運(yùn)營(yíng)中的風(fēng)險(xiǎn)控制
保理公司在運(yùn)營(yíng)中會(huì)面臨各種風(fēng)險(xiǎn),其中主要的有以下幾方面:一是買方信用風(fēng)險(xiǎn)。如果保理公司高估了買方的資信狀況,對(duì)履約情況作出錯(cuò)誤判斷,就需要承擔(dān)因提供了買方保理額度而履行墊付資金的風(fēng)險(xiǎn)。二是賣方履約風(fēng)險(xiǎn)。保理公司在進(jìn)行應(yīng)收賬款融資時(shí)一般不要求賣方再提供額外的擔(dān)保。如保理公司買入應(yīng)收賬款后,發(fā)現(xiàn)賣方所售商品存在質(zhì)量問題,或賣方存在未按期交貨等合同違約情況,買方保理商就不再承擔(dān)付款擔(dān)保責(zé)任,保理公司保理融資款項(xiàng)就會(huì)有損失的風(fēng)險(xiǎn)。三是應(yīng)收賬款的合法性風(fēng)險(xiǎn)。應(yīng)收賬款本身的合法性,不僅是債權(quán)合法轉(zhuǎn)讓的基礎(chǔ),而且是保理公司依法實(shí)現(xiàn)收款權(quán)的前提。一旦應(yīng)收賬款本身不具合法性,保理商的收款權(quán)也因前手權(quán)利缺失而無(wú)法享有收款權(quán)。四是買方保理商的信用風(fēng)險(xiǎn)。在買方保理商本身資金實(shí)力有限的情況下,保理公司作為賣方保理商將有可能無(wú)法從買方保理商處獲取足額擔(dān)保付款。存在買方保理商破產(chǎn),形成保理公司資金損失的可能性。
篇3
一、問題的提出
長(zhǎng)期以來(lái),企業(yè)忽視出資者權(quán)益的維護(hù),利益過(guò)分向經(jīng)營(yíng)者和職工傾斜,資本遭受嚴(yán)重侵蝕,資產(chǎn)流失驚人。長(zhǎng)此以往,企業(yè)將難以為繼。對(duì)此,許多學(xué)者進(jìn)行了深入研究,并取得突破性進(jìn)展。尤其是財(cái)務(wù)分層管理框架以及出資者財(cái)務(wù)論和經(jīng)營(yíng)者財(cái)務(wù)論的提出,為上述問題的解決及企業(yè)財(cái)務(wù)管理體制的完善提供了新的思路和廣闊的制度空間。推動(dòng)出資者財(cái)務(wù)和經(jīng)營(yíng)者財(cái)務(wù)理論在實(shí)踐中的具體應(yīng)用,對(duì)于實(shí)現(xiàn)財(cái)務(wù)根本職能,保證財(cái)務(wù)改革的正確方向,推動(dòng)現(xiàn)代企業(yè)制度的建立,具有重大的現(xiàn)實(shí)意義。然而,財(cái)務(wù)管理分層框架強(qiáng)調(diào)不同立場(chǎng)(出資者和經(jīng)營(yíng)者)的財(cái)務(wù)目標(biāo)和權(quán)責(zé)利關(guān)系,把企業(yè)財(cái)務(wù)分解開來(lái),這對(duì)于企業(yè)財(cái)務(wù)管理模式和有效的財(cái)務(wù)運(yùn)行機(jī)制的建立產(chǎn)生了許多困難。因此,能否把出資者財(cái)務(wù)目標(biāo)內(nèi)化為經(jīng)營(yíng)者財(cái)務(wù)的有效約束,出資者如何通過(guò)經(jīng)營(yíng)者財(cái)務(wù)達(dá)到其財(cái)務(wù)目標(biāo),以及經(jīng)營(yíng)者如何在出資者的財(cái)務(wù)約束下經(jīng)營(yíng),成為財(cái)務(wù)改革的關(guān)鍵。本文試圖對(duì)此作一探討,以求拋磚引玉。
二、維護(hù)出資者權(quán)益是現(xiàn)代企業(yè)財(cái)務(wù)的基石
眾所周知,公司制是現(xiàn)代企業(yè)制度的主要形式,我們不妨選取公司制企業(yè)作為分析樣本。在公司法人治理結(jié)構(gòu)中,通過(guò)多層次的關(guān)系,從激勵(lì)與監(jiān)督、權(quán)責(zé)利對(duì)等、信息的交流等方面,形成一個(gè)相互制約、有效降低成本、提高決策效率的組織體系。那么,股東(出資者)如何行使其所有權(quán)?如何保證股東目標(biāo)的實(shí)現(xiàn)?在實(shí)現(xiàn)股東目標(biāo)的過(guò)程中,董事會(huì)將通過(guò)何種機(jī)制來(lái)保證經(jīng)營(yíng)者目標(biāo)不偏離股東目標(biāo)?如何使得經(jīng)營(yíng)者有充分的激勵(lì)機(jī)制來(lái)發(fā)揮其人力資本優(yōu)勢(shì),同時(shí)保證對(duì)經(jīng)營(yíng)者的有效監(jiān)督?這些問題的解決是建立現(xiàn)代企業(yè)財(cái)務(wù)的關(guān)鍵。財(cái)力分層管理框架以及出資者財(cái)務(wù)論和經(jīng)營(yíng)者財(cái)務(wù)論對(duì)這些問題提出了很好的解決思路,但是對(duì)于一個(gè)企業(yè)來(lái)說(shuō),出資者和經(jīng)營(yíng)者不能建立兩套制度而各行其是,他們必須通過(guò)有效的財(cái)務(wù)管理模式的建立,以促進(jìn)出資者財(cái)務(wù)目標(biāo)和經(jīng)營(yíng)者財(cái)務(wù)目標(biāo)的同時(shí)實(shí)現(xiàn)?;蛘哒f(shuō),建立一種有效的財(cái)務(wù)管理模型,這種財(cái)務(wù)管理模式必須能夠把出資者財(cái)務(wù)目標(biāo)內(nèi)化為經(jīng)營(yíng)者的目標(biāo),并保證這些目標(biāo)的順利實(shí)現(xiàn)。
所謂模式的建立,其實(shí)質(zhì)是有關(guān)制度的建立,建立有效的財(cái)務(wù)管理模式,就是要建立一套保證出資者與經(jīng)營(yíng)者共同實(shí)現(xiàn)其財(cái)務(wù)目標(biāo)的制度,而要建立這套制度,必須首先找到出資者財(cái)務(wù)和經(jīng)營(yíng)者財(cái)務(wù)所共同依賴的基石。出資者出資,是為了實(shí)現(xiàn)出資增值。經(jīng)營(yíng)者之所以能夠經(jīng)營(yíng)出資者出資,是因?yàn)橐婪ㄊ孪瘸兄Z對(duì)出資者的財(cái)產(chǎn)責(zé)任,即保證出資的保值增值。因此,出資者財(cái)務(wù)和經(jīng)營(yíng)者財(cái)務(wù)統(tǒng)一出資者出資的保值增值,而增值又以保值為基礎(chǔ)。所以維護(hù)出資者權(quán)益,實(shí)現(xiàn)出資的保值增值,是有效的企業(yè)財(cái)務(wù)管理模式建立的基石,是企業(yè)財(cái)務(wù)的首要任務(wù)和職能,對(duì)于建立產(chǎn)權(quán)明晰、權(quán)責(zé)分明、政企分開、管理科學(xué)的現(xiàn)代企業(yè)制度,具有至關(guān)重要的意義。所謂出資者權(quán)益通常指“企業(yè)所有者對(duì)企業(yè)凈資產(chǎn)的要求權(quán)或所有權(quán)”,即出資者出資所代表的權(quán)益。維護(hù)出資者權(quán)益是現(xiàn)代企業(yè)財(cái)務(wù)的首要任務(wù)和職能,是現(xiàn)代企業(yè)財(cái)務(wù)的基石;基于出資者權(quán)益維護(hù)的企業(yè)財(cái)務(wù)管理模式,才是適應(yīng)現(xiàn)代企業(yè)制度的財(cái)務(wù)模式,是保證出資者財(cái)務(wù)目標(biāo)和經(jīng)營(yíng)者財(cái)務(wù)目標(biāo)共同實(shí)現(xiàn)的載體;有效地保障出資者權(quán)益,是真正建立起現(xiàn)代企業(yè)制度的首要標(biāo)志。
三、基于出資者權(quán)益維護(hù)的財(cái)務(wù)管理模式及其特征
基于出資者權(quán)益維護(hù)的財(cái)務(wù)管理模式,本文稱之為出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式。所謂出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式,是指企業(yè)財(cái)力提供的信息和生成信息的過(guò)程必須建立在出資者權(quán)益維護(hù)的基礎(chǔ)上,或者說(shuō)是以出資者權(quán)益維護(hù)作為整個(gè)財(cái)務(wù)會(huì)計(jì)系統(tǒng)運(yùn)行的主線和指導(dǎo)。其精神實(shí)質(zhì)在于:在市場(chǎng)經(jīng)濟(jì)條件下,企業(yè)作為一個(gè)“受托責(zé)任”的法人財(cái)產(chǎn)實(shí)體,經(jīng)營(yíng)者是在為完成出資者所賦予的“受托責(zé)任”而工作,這樣出資者投入本金的維護(hù)、經(jīng)營(yíng)過(guò)程的風(fēng)險(xiǎn)控制以及通過(guò)利潤(rùn)來(lái)增長(zhǎng)出資者權(quán)益,就構(gòu)成了企業(yè)財(cái)務(wù)管理的目標(biāo),即實(shí)現(xiàn)出資者權(quán)益的最大化。甚至整個(gè)企業(yè)的管理都是圍繞“股東財(cái)富最大化(出資者權(quán)益最大化)”而展開。也就是說(shuō),企業(yè)的經(jīng)營(yíng)管理,就是“維持良好的財(cái)務(wù)狀況,實(shí)現(xiàn)收益性和流動(dòng)性的統(tǒng)一,注重企業(yè)的持續(xù)發(fā)展壯大,來(lái)保證實(shí)現(xiàn)出資者權(quán)益的最大化”。要做到這一點(diǎn),企業(yè)在獲得凈收益前,其出資者權(quán)益必須得到充分的維護(hù)和保持,即保全出資者是確定利潤(rùn)的前提。
出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式有以下基本特征:
(一)服從或服務(wù)于資本運(yùn)營(yíng)目標(biāo)是出資者維護(hù)型的財(cái)務(wù)管理模式的根本任務(wù)。從經(jīng)濟(jì)學(xué)意義上看,資本運(yùn)營(yíng)泛指以資本增值為目的的經(jīng)營(yíng)活動(dòng),與單純生產(chǎn)型和生產(chǎn)經(jīng)營(yíng)型對(duì)比,資本運(yùn)營(yíng)的基本特點(diǎn)是圍繞資本保值增值而進(jìn)行經(jīng)營(yíng)管理,把資本收益作為管理的核心,以財(cái)務(wù)管理為導(dǎo)向,生產(chǎn)經(jīng)營(yíng)管理服從資本收益目標(biāo)。因此,企業(yè)經(jīng)營(yíng)管理的重點(diǎn)是資本存量管理、資本增量管理、資本配置管理等,供、產(chǎn)、銷管理及一般的籌資、投資管理要從屬于資本保值增值的資本運(yùn)營(yíng)目標(biāo)。財(cái)務(wù)管理也應(yīng)以資本的保值增值為目標(biāo),出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式正是以資本運(yùn)營(yíng)目標(biāo)作為根本任務(wù)的。
(二)保全出資者權(quán)益是確定收益(利潤(rùn))的前提。企業(yè)經(jīng)營(yíng)的目標(biāo)歸根結(jié)底是為了創(chuàng)造收益(利潤(rùn)),財(cái)務(wù)管理不僅要為企業(yè)創(chuàng)造盡可能多的收益服務(wù),而且必須能夠正確地計(jì)量收益。要正確地計(jì)量收益,必須以保全出資者權(quán)益為前提,劃清本利的界限。然而在現(xiàn)實(shí)操作中,由于物價(jià)變動(dòng)、經(jīng)濟(jì)生活的不確定性、主觀因素以及其他原因,往往使出資者權(quán)益不能得到有效的維護(hù),從而導(dǎo)致現(xiàn)實(shí)存在的諸多問題,甚至陷于惡性循環(huán),嚴(yán)重阻礙了財(cái)務(wù)管理目標(biāo)的實(shí)現(xiàn)。出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式,要求采取一切可能的措施,保證出資者權(quán)益得以有效維護(hù),保證收益計(jì)量的科學(xué)、準(zhǔn)確,從而保證財(cái)務(wù)管理職能的真正實(shí)現(xiàn)。
(三)以嚴(yán)格的管理制度作為該模式有效運(yùn)轉(zhuǎn)的保證?,F(xiàn)代企業(yè)制度下,所有權(quán)與經(jīng)營(yíng)權(quán)發(fā)生分離。兩權(quán)分離往往存在激勵(lì)不相容、信息不對(duì)稱、責(zé)任不對(duì)等等問題,尤其我國(guó)現(xiàn)階段尚未真正建立起現(xiàn)代企業(yè)制度,這些問題表現(xiàn)的更為突出。資產(chǎn)經(jīng)營(yíng)者以出資者的出資從事生產(chǎn)經(jīng)營(yíng)活動(dòng),出資者投放資本的目的是謀求資本收益最大化,而這必須通過(guò)資產(chǎn)經(jīng)營(yíng)者的生產(chǎn)經(jīng)營(yíng)活動(dòng)才能達(dá)成。但事實(shí)上,資產(chǎn)經(jīng)營(yíng)者很可能損害出資者權(quán)益,如將資產(chǎn)據(jù)為己有或拱手送人,導(dǎo)致出資者資產(chǎn)流失?;蛘呓?jīng)營(yíng)不負(fù)責(zé)任,導(dǎo)致低效或無(wú)效經(jīng)營(yíng),使出資者資產(chǎn)發(fā)生損失。為此,出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式以建立有效的激勵(lì)機(jī)制和嚴(yán)格的監(jiān)督約束機(jī)制作為保障,從而形成了該模式的重要特征之一。
四、實(shí)行出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式是我國(guó)企業(yè)的現(xiàn)實(shí)選擇
正如前文所述,在現(xiàn)代企業(yè)制度下,企業(yè)是一個(gè)擁有法人財(cái)產(chǎn)權(quán)的經(jīng)濟(jì)實(shí)體,決定了我國(guó)企業(yè)要樹立市場(chǎng)觀念,謹(jǐn)慎經(jīng)營(yíng),努力維護(hù)出資者權(quán)益,保證企業(yè)的長(zhǎng)期生存和發(fā)展能力;目前嚴(yán)重困擾我國(guó)企業(yè)發(fā)展的各種現(xiàn)實(shí)問題,迫使我國(guó)企業(yè)必須采用出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式。
首先,現(xiàn)代企業(yè)制度已經(jīng)賦予了企業(yè)自主經(jīng)營(yíng)、自我發(fā)展、自擔(dān)風(fēng)險(xiǎn)的管理機(jī)制,企業(yè)經(jīng)營(yíng)的目標(biāo)必須從單純的利益最大化走向出資者權(quán)益最大化(資產(chǎn)保值增值),企業(yè)的出資者權(quán)益將成為制約企業(yè)的根本動(dòng)力,企業(yè)經(jīng)營(yíng)者的任免和是非功過(guò)的評(píng)價(jià)主要由出資者來(lái)進(jìn)行,企業(yè)經(jīng)營(yíng)的最終目標(biāo)將是出資者權(quán)益的維護(hù)和增長(zhǎng)。我國(guó)已經(jīng)開始推行以“國(guó)有資產(chǎn)保值增值率”為主要指標(biāo)的考核指標(biāo)體系。這就為出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式的實(shí)施奠定了宏觀基礎(chǔ)。
其次,出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式,不僅是建立現(xiàn)代企業(yè)制度的需要,同時(shí)它反映了與企業(yè)有利害關(guān)系各方共同利益的要求。企業(yè)作為一個(gè)獨(dú)立的經(jīng)濟(jì)實(shí)體,其生存和發(fā)展只能取決于自身再生產(chǎn)能力的維持,否則只能走向萎縮乃至破產(chǎn),再生產(chǎn)能力的維持強(qiáng)烈要求出資者權(quán)益的保全;企業(yè)管理當(dāng)局同樣關(guān)注出資者權(quán)益維護(hù)問題,因?yàn)樵诂F(xiàn)代企業(yè)制度下,企業(yè)出資者與經(jīng)營(yíng)者之間規(guī)范的委托關(guān)系,使得企業(yè)管理當(dāng)局的管理能力、榮譽(yù)與應(yīng)得報(bào)酬將維系于企業(yè)生存與發(fā)展,這就促使他們重視出資者權(quán)益維護(hù),以便確保自身的長(zhǎng)遠(yuǎn)利益;現(xiàn)代企業(yè)制度下,企業(yè)出資者投資辦企業(yè),其根本目的在于擴(kuò)大所擁有的財(cái)富,而其中最為起碼的要求則是保證其出資的安全與完整,因而他們是其權(quán)益維護(hù)的最大支持者;債權(quán)人向企業(yè)提供信用,勢(shì)必要求企業(yè)擁有足夠的償債能力,足夠的償債能力源自于企業(yè)足夠的出資者權(quán)益;國(guó)家(政府)更要求出資者權(quán)益維護(hù),企業(yè)全面堅(jiān)持和貫徹出資者權(quán)益維護(hù)原則,保證其自身的長(zhǎng)期生存與發(fā)展能力,這樣國(guó)家將在諸多方面受益,因?yàn)槠髽I(yè)確保了長(zhǎng)期生存與發(fā)展能力,自然就為國(guó)民經(jīng)濟(jì)的持續(xù)穩(wěn)定與繁榮打下了堅(jiān)實(shí)的基礎(chǔ),而且為國(guó)家中長(zhǎng)期發(fā)展培植了資源,有助于解決就業(yè)問題。
五、出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式構(gòu)造
(一)樹立牢固的資本運(yùn)營(yíng)觀念,保證資本保值增值的正確考核。借鑒我國(guó)國(guó)有資資本保值增值考核指標(biāo)體系,對(duì)企業(yè)資本保值增值進(jìn)行考核。我國(guó)國(guó)有資本主要考核指標(biāo)如下:
國(guó)有資本保值增值率=期末所有者權(quán)益/期初所有者權(quán)益×100
如果國(guó)有資產(chǎn)保值增值率>=1,則實(shí)現(xiàn)了國(guó)有資本的保值增值;
如果國(guó)有資本保值增值率<1,則意味著國(guó)有資本受到侵蝕。
可以看出,考察國(guó)有資本的保值增值,采用期初、期末所有者權(quán)益對(duì)比的方法,說(shuō)明考察資本保值增值,重點(diǎn)在于考察出資者權(quán)益的增減。因此,建立出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式,首先就要樹立這種資本運(yùn)營(yíng)觀念,強(qiáng)調(diào)出資者權(quán)益的維護(hù)和保持,進(jìn)行科學(xué)的資本運(yùn)營(yíng),保證資本保值增殖目標(biāo)的真正實(shí)現(xiàn)。
(二)建立科學(xué)的收益(利潤(rùn))觀念,建立健全定期資產(chǎn)評(píng)估制度。前已指出,出資者權(quán)益在會(huì)計(jì)賬冊(cè)中以資產(chǎn)負(fù)債表上資產(chǎn)總額和負(fù)債總額的差數(shù)來(lái)表現(xiàn)。資產(chǎn)負(fù)債表借方的資產(chǎn)可以看作“正資產(chǎn)”,貸方負(fù)債可以看作“負(fù)資產(chǎn)”,即擔(dān)負(fù)的經(jīng)濟(jì)義務(wù)或責(zé)任,出資者權(quán)益則以凈資產(chǎn)表現(xiàn)。各類企業(yè)的出資者,其持有的利益不是資產(chǎn)總額,而是凈資產(chǎn)的期末余額。出資者權(quán)益維護(hù)理論創(chuàng)立伊始便與收益密切相關(guān)。收益,它代表的是某一主體在一定期間內(nèi)經(jīng)營(yíng)活動(dòng)的凈成果。從會(huì)計(jì)文獻(xiàn)來(lái)看,一般都將收益(利潤(rùn))定義為收入和費(fèi)用之間的差額。但在界定其具體內(nèi)容時(shí),存在兩種不同的觀點(diǎn),一是本期營(yíng)業(yè)觀,將當(dāng)期的收入減去為實(shí)現(xiàn)這些收入所發(fā)生的費(fèi)用(成本)即為收益。用公式表示如下:
AI[t2]=R[t2]—C[t]
其中,AI[t2]表示第二期的會(huì)計(jì)收益;
R[t2]表示第二期的收入;
C[t]表示第二期的費(fèi)用(成本)。
另一觀點(diǎn)是總括收益觀,即期末凈資產(chǎn)減去期初凈資產(chǎn)的差額。公式為:
AI[t2]-NA[t2]—NA[t1]+D[t2]
其中,NA[t2]表示第二期期末的凈資產(chǎn);
NA[t1]表示第二期期末的凈資產(chǎn);
D[t2]表示第二期的資本分配(股利)。
按照出資者權(quán)益維護(hù)理論的要求,收益的定義應(yīng)當(dāng)采用總括收益觀,即收益應(yīng)被定義成企業(yè)凈資產(chǎn)的增值,換言之,只有在凈資產(chǎn)保值基礎(chǔ)上的增值才能被看成是真正的收益。這一定義較之本期營(yíng)業(yè)觀下的“以收抵支的差額”或“一定時(shí)期內(nèi)經(jīng)營(yíng)成果的貨幣表現(xiàn)”的說(shuō)法當(dāng)然要科學(xué)的多,它真正揭示了收益的本質(zhì),同時(shí)也為財(cái)務(wù)會(huì)計(jì)是確認(rèn)和計(jì)量收入、費(fèi)用、資產(chǎn)、負(fù)債指明了方向。建立出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式,堅(jiān)持總括收益觀實(shí)乃必要。其實(shí),相比而言,說(shuō)總括收益觀更為科學(xué),還因?yàn)樗哂懈鼜V泛的應(yīng)用前景,如它能更好地用于金融資產(chǎn)的計(jì)量。因此,應(yīng)建立健全定期資產(chǎn)評(píng)估制度。在評(píng)估中應(yīng)以資產(chǎn)的現(xiàn)時(shí)成本為計(jì)量標(biāo)準(zhǔn),特別應(yīng)重視以資抵債后的資產(chǎn)凈值,并以此計(jì)算當(dāng)期收益,超過(guò)這一程度的利潤(rùn)分配意味著對(duì)出資者權(quán)益的侵耗,應(yīng)采取果斷措施加以制止。
(三)全面貫徹資本保全原則。物價(jià)變動(dòng)是市場(chǎng)經(jīng)濟(jì)的伴隨現(xiàn)象,持續(xù)劇烈的物價(jià)變動(dòng)使出資者權(quán)益的保全面臨著嚴(yán)峻的考驗(yàn)。出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式要求全面貫徹資本保全理論。在該種模式下,出資者權(quán)益的保全是確定收益的前提。任何一項(xiàng)權(quán)益都有資產(chǎn)相對(duì)應(yīng),出資者權(quán)益用凈資產(chǎn)表示,凈資產(chǎn)的計(jì)量即為出資者權(quán)益的計(jì)量。構(gòu)成會(huì)計(jì)計(jì)量模式的因素有三:計(jì)量對(duì)象、計(jì)量屬性和計(jì)量單位。計(jì)量因素的各種組合產(chǎn)生了不同的會(huì)計(jì)計(jì)量模式。不同的計(jì)量模式,出資者權(quán)益的量度和收益的確定都有區(qū)別,因而就產(chǎn)生了保全出資者權(quán)益的幾種觀點(diǎn),主要包括出資者權(quán)益的貨幣資本保全觀、出資者權(quán)益的穩(wěn)值貨幣保全觀和出資者權(quán)益的實(shí)物保全觀三種,各種出資者權(quán)益保全觀都規(guī)定了各自的資本保全要求。要正確分析各種出資者權(quán)益保全觀的優(yōu)缺點(diǎn),根據(jù)實(shí)際情況選用合理的方法保全出資者權(quán)益,防止補(bǔ)償不足,全面實(shí)現(xiàn)資本保全。具體地說(shuō),物價(jià)變動(dòng)輕微時(shí)期,財(cái)務(wù)核算的原則和方法的選擇應(yīng)有所偏重,以便基本解決成本的補(bǔ)償問題;當(dāng)物價(jià)變動(dòng)達(dá)到一定幅度之后,應(yīng)該綜合采用出資者權(quán)益保全措施,以便追求全面的資本維護(hù)。
(四)創(chuàng)造條件,促進(jìn)謹(jǐn)慎性原則充分應(yīng)用的。出資者權(quán)益維護(hù)型的財(cái)務(wù)管理模式,要求企業(yè)在獲得凈利前必須使其資本得到充分維護(hù),體現(xiàn)在財(cái)務(wù)運(yùn)作中,就要求必須在認(rèn)真遵守權(quán)責(zé)發(fā)生制和配比原則的同時(shí),全面推行謹(jǐn)慎性原則。謹(jǐn)慎性原則,又稱穩(wěn)健性原則,是指企業(yè)為了克服市場(chǎng)經(jīng)濟(jì)固有的不確定性給企業(yè)的生產(chǎn)經(jīng)營(yíng)帶來(lái)的種種風(fēng)險(xiǎn),當(dāng)某一經(jīng)濟(jì)事項(xiàng)在會(huì)計(jì)上有兩種或兩種以上的方法可供選擇,并且每一種方法都具有相同的理論上和邏輯上的正確性時(shí),通常選擇避免高估資產(chǎn)和收益與低估負(fù)債的會(huì)計(jì)方法,謹(jǐn)慎性原則是會(huì)計(jì)適應(yīng)經(jīng)濟(jì)環(huán)境發(fā)展的結(jié)果。1992—1993年的我國(guó)會(huì)計(jì)改革中部分地引入了謹(jǐn)慎性原則,開始允許采用存貨的后進(jìn)先出法、應(yīng)收賬款壞賬準(zhǔn)備、固定資產(chǎn)加速折舊等方法來(lái)強(qiáng)化資本維護(hù),確為我國(guó)會(huì)計(jì)的一大進(jìn)步。但是我國(guó)會(huì)計(jì)準(zhǔn)則和現(xiàn)行會(huì)計(jì)制度中謹(jǐn)慎性原則的應(yīng)用程度還偏低,距離出資者權(quán)益維護(hù)的要求和客觀需要還存在不足。筆者認(rèn)為,應(yīng)進(jìn)一步創(chuàng)造條件,充分應(yīng)用謹(jǐn)慎性原則,并建議采取以下具體措施:(1)對(duì)有價(jià)證券和存貨采用“成本與市價(jià)孰低”規(guī)則進(jìn)行計(jì)價(jià);(2)將快速折舊法和直線折舊法均作為企業(yè)選擇折舊方法的備選方案,并盡可能縮短折舊年限;(3)允許企業(yè)根據(jù)自身經(jīng)營(yíng)特點(diǎn)采用“賬齡分析法”計(jì)提壞賬準(zhǔn)備;(4)遞延資產(chǎn)與無(wú)形資產(chǎn)的攤銷應(yīng)盡可能縮短攤銷年限;(5)對(duì)企業(yè)發(fā)生的產(chǎn)品維修擔(dān)保、法律訴訟等或有負(fù)債進(jìn)行揭示;(6)審慎地確定支出補(bǔ)償內(nèi)容與額度、合理劃分期間費(fèi)用與制造成本;(7)收入的確認(rèn)要嚴(yán)格核查其應(yīng)具備的各項(xiàng)條件或標(biāo)準(zhǔn)。
篇4
本系統(tǒng)主要完成對(duì)圖書倉(cāng)庫(kù)的庫(kù)存管理,包括圖書入庫(kù)、出庫(kù)、庫(kù)存,員工信息,供應(yīng)商信息以及密碼管理等六個(gè)方面。系統(tǒng)可以完成對(duì)各類信息的瀏覽、查詢、添加、刪除、修改、報(bào)表等功能。
系統(tǒng)的核心是入庫(kù)、庫(kù)存和出庫(kù)三者之間的聯(lián)系,每一個(gè)表的修改都將聯(lián)動(dòng)的影響其它的表,當(dāng)完成入庫(kù)或出庫(kù)操作時(shí)系統(tǒng)會(huì)自動(dòng)地完成庫(kù)存的修改。查詢功能也是系統(tǒng)的核心之一,在系統(tǒng)中即有單條件查詢和多條件查詢,也有精確查詢和模糊查詢,系統(tǒng)不僅有靜態(tài)的條件查詢,也有動(dòng)態(tài)生成的條件查詢,其目的都是為了方便用戶使用。系統(tǒng)有完整的用戶添加、刪除和密碼修改功能,并具備報(bào)表打印功能。
系統(tǒng)采用Microsoft Office中的Access 2000來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù),并使用當(dāng)前優(yōu)秀的開發(fā)工具—Delphi 6.0 ,它有著最為靈活的數(shù)據(jù)庫(kù)結(jié)構(gòu),對(duì)數(shù)據(jù)庫(kù)應(yīng)用有著良好的支持。
論文主要介紹了本課題的開發(fā)背景,所要完成的功能和開發(fā)的過(guò)程。重點(diǎn)的說(shuō)明了系統(tǒng)設(shè)計(jì)的重點(diǎn)、設(shè)計(jì)思想、難點(diǎn)技術(shù)和解決方案。
關(guān)鍵字:數(shù)據(jù)庫(kù),SQL語(yǔ)言,Delph 6,數(shù)據(jù)庫(kù)組件,倉(cāng)庫(kù)管理
目 錄
第一章 引言 ……………………………………………………………………………1
1.1 課題來(lái)源 ……………………………………………………………………1
1.2 開發(fā)工具的選擇 ……………………………………………………………2
1.3 所做的主要工作 ……………………………………………………………3
第二章 數(shù)據(jù)庫(kù)概論 ……………………………………………………………………4
2.1 數(shù)據(jù)庫(kù)的發(fā)展 ………………………………………………………………4
2.1.1 數(shù)據(jù)庫(kù)的發(fā)展 …………………………………………………………4
2.1.2 數(shù)據(jù)庫(kù)階段的特點(diǎn) ……………………………………………………5
2.1.3 數(shù)據(jù)庫(kù)技術(shù) ……………………………………………………………6
2.2 數(shù)據(jù)庫(kù)理論基礎(chǔ) ……………………………………………………………7
2.2.1 數(shù)據(jù)庫(kù)模型 ……………………………………………………………7
2.2.2 數(shù)據(jù)庫(kù)體系結(jié)構(gòu)
……………………………………………………10
2.2.3 數(shù)據(jù)的獨(dú)立性 ………………………………………………………11
2.2.4 范式 …………………………………………………………………11
2.3 SQL語(yǔ)言基礎(chǔ) ……………………………………………………………13
2.3.1 SQL簡(jiǎn)介 ……………………………………………………………13
2.3.2 SQL查詢
……………………………………………………………13
2.3.3 SQL數(shù)據(jù)更新
………………………………………………………14
第三章數(shù)據(jù)庫(kù)開發(fā)工具 ……………………………………………………………16
3.1 Delphi 6.0 簡(jiǎn)介 ……………………………………………………………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語(yǔ)言在Delphi中的應(yīng)用
………………………………………19
3.3 Access 簡(jiǎn)介
………………………………………………………………21
第四章 系統(tǒng)總體設(shè)計(jì) ………………………………………………………………23
4.1 系統(tǒng)需求分析
……………………………………………………………23
4.2 系統(tǒng)概要設(shè)計(jì)
……………………………………………………………25
4.2.1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)
………………………………………………………25
4.2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
…………………………………………………………27
4.2.2.1 ER圖設(shè)計(jì) ……………………………………………………27
4.2.2.2 數(shù)據(jù)庫(kù)表格設(shè)計(jì)………………………………………………29
4.3系統(tǒng)詳細(xì)設(shè)計(jì)………………………………………………………………34
第五章 系統(tǒng)應(yīng)用程序設(shè)計(jì) …………………………………………………………37
5.1 系統(tǒng)窗體模塊組成…………………………………………………………37
5.2 數(shù)據(jù)模塊窗體設(shè)置…………………………………………………………38
5.3 主窗體功能模塊的實(shí)現(xiàn)……………………………………………………39
5.4 入庫(kù)、出庫(kù)窗體模塊的實(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 用戶注冊(cè)窗體模塊的實(shí)現(xiàn)
…………………………………………55
5.7.4 用戶注銷窗體模塊的實(shí)現(xiàn)
…………………………………………57
結(jié)束語(yǔ) …………………………………………………………………………………59
致謝 ……………………………………………………………………………………60
參考文獻(xiàn) ………………………………………………………………………………61
第一章
引 言
§1.1 課題來(lái)源
隨著社會(huì)經(jīng)濟(jì)的迅速發(fā)展和科學(xué)技術(shù)的全面進(jìn)步,計(jì)算機(jī)事業(yè)的飛速發(fā)展,以計(jì)算機(jī)與通信技術(shù)為基礎(chǔ)的信息系統(tǒng)正處于蓬勃發(fā)展的時(shí)期。隨著經(jīng)濟(jì)文化水平的顯著提高,人們對(duì)生活質(zhì)量及工作環(huán)境的要求也越來(lái)越高。書籍做為人類的精神食糧,在現(xiàn)代社會(huì)中越來(lái)越受到重視,大量的書籍出現(xiàn)在市場(chǎng)上,人們有了各種各樣不同的選擇。與此同時(shí),為了管理大量的圖書,圖書倉(cāng)庫(kù)也大量的出現(xiàn),倉(cāng)庫(kù)的管理問題也就提上了日程。隨著圖書的大量增加,其管理難度也越來(lái)越大,如何優(yōu)化倉(cāng)庫(kù)的日常管理也就成為了一個(gè)大眾化的課題。
在計(jì)算機(jī)飛速發(fā)展的今天,將計(jì)算機(jī)這一信息處理利器應(yīng)用于倉(cāng)庫(kù)的日常管理已是勢(shì)必所然,而且這也將為倉(cāng)庫(kù)管理帶來(lái)前所未有的改變,它可以帶來(lái)意想不到的效益,同時(shí)也會(huì)為企業(yè)的飛速發(fā)展提供無(wú)限潛力。采用計(jì)算機(jī)管理信息系統(tǒng)已成為倉(cāng)庫(kù)管理科學(xué)化和現(xiàn)代化的重要標(biāo)志,它給企業(yè)管理來(lái)了明顯的經(jīng)濟(jì)效益和社會(huì)效益。主要體現(xiàn)在:
極大提高了倉(cāng)庫(kù)工作人員的工作效率,大大減少了以往入出存流程繁瑣,雜亂,周期長(zhǎng)的弊端。
基于倉(cāng)庫(kù)管理的全面自動(dòng)化,可以減少入庫(kù)管理、出庫(kù)管理及庫(kù)存管理中的漏洞,可以節(jié)約不少管理開支,增加企業(yè)收入。
倉(cāng)庫(kù)的管理的操作自動(dòng)化和信息的電子化,全面提高了倉(cāng)庫(kù)的管理水平。
隨著我國(guó)改革開放的不斷深入,經(jīng)濟(jì)飛速的發(fā)展,企業(yè)要想生存、發(fā)展,要想在激烈的市場(chǎng)競(jìng)爭(zhēng)中立于不敗之地,沒有現(xiàn)代化的管理是萬(wàn)萬(wàn)不行的,倉(cāng)庫(kù)管理的全面自動(dòng)化、信息化則是其中極其重要的部分。為了加快倉(cāng)庫(kù)管理自動(dòng)化的步伐,提高倉(cāng)庫(kù)的管理業(yè)務(wù)處理效率,建立倉(cāng)庫(kù)管理系統(tǒng)已變得十分心要。
入庫(kù)、庫(kù)存、出庫(kù)還是現(xiàn)在企業(yè)圖書倉(cāng)庫(kù)管理的常規(guī)基本模式,雖然,最近又出現(xiàn)了很多新的管理模式,如:基于零庫(kù)存思想的沃爾瑪特管理方式,但這些新的思想在中國(guó)大部分企業(yè)的管理中還是難以實(shí)現(xiàn)的。所以如何設(shè)計(jì)好倉(cāng)庫(kù)管理系統(tǒng),盡可能地減少倉(cāng)庫(kù)管理的重復(fù)性和低效性就成為當(dāng)前最為重要的問題。圖書倉(cāng)庫(kù)管理的核心是入庫(kù)、庫(kù)存和出庫(kù)之間的聯(lián)系,如何處理好三者之間的關(guān)系是系統(tǒng)最為關(guān)鍵的部分。另外,員工信息和供應(yīng)商信息管理也是倉(cāng)庫(kù)管理中一個(gè)必不可少的部分,它提供著與入庫(kù)和出庫(kù)相關(guān)的地一些信息,使得整個(gè)系統(tǒng)更加完整,更加實(shí)用。
通過(guò)對(duì)倉(cāng)庫(kù)管理日常工作的詳細(xì)調(diào)查,搜集了大量的資料,從系統(tǒng)結(jié)構(gòu)的組織,功能的實(shí)現(xiàn),技術(shù)的要求以及可行性等多方面進(jìn)行考慮,認(rèn)為本課題是一個(gè)適應(yīng)現(xiàn)今圖書倉(cāng)庫(kù)管理需求的計(jì)算機(jī)信息管理系統(tǒng),具有一定的實(shí)際開發(fā)價(jià)值和使用價(jià)值。
§1.2 開發(fā)工具的選擇
自Java誕生以來(lái),隨著Internet技術(shù)的普及和應(yīng)用需求的變化,以第四代語(yǔ)言為主的應(yīng)用開發(fā)產(chǎn)品發(fā)生了較大的變化,它們不僅已成為人們開發(fā)應(yīng)用的開發(fā)工具,而且很多產(chǎn)品已發(fā)展成為一種強(qiáng)有力的應(yīng)用開發(fā)環(huán)境。這些新型的開發(fā)工具通常以一種集成軟件包的形式提供給開發(fā)人員,被稱為Studio(工作室)或Suite(程序組)。例如,微軟的Visual Studio 6.0,Borland公司的Delphi 6.0等數(shù)據(jù)庫(kù)輔助開發(fā)工具。
現(xiàn)在,市場(chǎng)上可以選購(gòu)的應(yīng)用開發(fā)產(chǎn)品很多,流行的也有數(shù)十種。目前在我國(guó)市場(chǎng)上最為流行、使用最多、最為先進(jìn)的可用作企業(yè)級(jí)開發(fā)工具的產(chǎn)品有:
Microsoft公司的Visual Basic 6.0版
Microsoft公司的Visual C++6.0版
Borland公司的Delphi 6.0版
在目前市場(chǎng)上這些眾多的程序開發(fā)工具中,有些強(qiáng)調(diào)程語(yǔ)言的彈性與執(zhí)行效率;有些則偏重于可視化程序開發(fā)工具所帶來(lái)的便利性與效率的得高,各有各的優(yōu)點(diǎn)和特色,也滿足了不同用戶的需求。然而,語(yǔ)言的彈性和工具的便利性是密不可分的,只有便利的工具,卻沒有彈性的語(yǔ)言作支持,許多特殊化的處理動(dòng)作必需要耗費(fèi)數(shù)倍的工夫來(lái)處理,使得原來(lái)所標(biāo)榜的效率提高的優(yōu)點(diǎn)失去了作用;相反,如果只強(qiáng)調(diào)程語(yǔ)言的彈性,卻沒有便利的工具作配合,會(huì)使一些即使非常簡(jiǎn)單的界面處理動(dòng)作,也會(huì)嚴(yán)重地浪費(fèi)程序設(shè)計(jì)師的寶貴時(shí)間。
而Delphi是一個(gè)非常理想選擇。Delphi 6 是操作系統(tǒng)中快速應(yīng)用開發(fā)環(huán)境的最新版本。它也是當(dāng)前Windows平臺(tái)上第一個(gè)全面支持最新Web服務(wù)的快速開發(fā)工具。無(wú)論是企業(yè)級(jí)用戶,還是個(gè)人開發(fā)者,都能夠利用Delphi 6 輕松、快捷地構(gòu)建新一代電子商務(wù)應(yīng)用。Delphi 6 是惟一支持所有新出現(xiàn)的工業(yè)標(biāo)準(zhǔn)的RAD環(huán)境,包括XML(擴(kuò)展標(biāo)記語(yǔ)言)/XSL(可擴(kuò)展樣式語(yǔ)言),SOAP(簡(jiǎn)單對(duì)象存取協(xié)議)和WSDL(Web服務(wù)器描述語(yǔ)言)等。
Delphi 6 是可視化的快速應(yīng)用程序開發(fā)語(yǔ)言,它提供了可視化的集成開發(fā)環(huán)境,這一環(huán)境為應(yīng)用程序設(shè)計(jì)人員提供了一系列靈活而先進(jìn)的工具,可以廣泛地用于種類應(yīng)用程序設(shè)計(jì)。在Delphi 6 的集成開發(fā)環(huán)境中,用戶可以設(shè)計(jì)程序代碼、運(yùn)行程序、進(jìn)行程序錯(cuò)誤的調(diào)試等,可視化的開發(fā)方法降低了應(yīng)用程序開發(fā)的難度。Delphi的基礎(chǔ)編程語(yǔ)言是具有面向?qū)ο筇匦缘腜ascal語(yǔ)言,即Object Pascal 。Object Pascal具有代碼穩(wěn)定、可讀性好、編譯速度快等優(yōu)點(diǎn),并將面向?qū)ο蟮母拍钜浦驳搅薖ascal語(yǔ)言中,使這種基礎(chǔ)語(yǔ)言有了新的發(fā)展空間。
使用Delphi 6.0 ,我們幾乎可以作任何事情,還可以撰寫種各種類型的應(yīng)用程序,動(dòng)態(tài)鏈接庫(kù)(DLL)、CON、或CORBA對(duì)象,CGI/ISAPI程序,Microsoft Back Office應(yīng)用程序。程序的規(guī)模小到簡(jiǎn)單的個(gè)人數(shù)據(jù)庫(kù)應(yīng)用,大到復(fù)雜的企業(yè)的多層次分布式系統(tǒng),都可以使用Delphi進(jìn)行開發(fā),其友好的集成開發(fā)界面,可視化的雙向開發(fā)模式,良好的數(shù)據(jù)庫(kù)應(yīng)用支持高效的程序開發(fā)和程序運(yùn)行,備受廣大程序開發(fā)人員的好評(píng)。尤其是Delphi對(duì)數(shù)據(jù)庫(kù)應(yīng)用的強(qiáng)大支持,大大提高了數(shù)據(jù)庫(kù)應(yīng)用軟件開發(fā)的效率,縮短了開發(fā)周期,深受廣大數(shù)據(jù)庫(kù)應(yīng)用程序設(shè)計(jì)人員的喜愛。Delphi為數(shù)據(jù)庫(kù)應(yīng)用開發(fā)人員提供了豐富的數(shù)據(jù)庫(kù)開發(fā)組件,使數(shù)據(jù)庫(kù)應(yīng)用開發(fā)功能更強(qiáng)大,控制更靈活,編譯后的程序運(yùn)行速度更快。
§1.3 本文所做工作
引言部分介紹了本系統(tǒng)的課題來(lái)源以及對(duì)數(shù)據(jù)庫(kù)開發(fā)工具的選擇。
第二章介紹了數(shù)據(jù)庫(kù)的發(fā)展,關(guān)系數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)體系結(jié)構(gòu),并系統(tǒng)介紹了SQL語(yǔ)言,為設(shè)計(jì)和理解應(yīng)用程序做了鋪墊。
第三章系統(tǒng)介紹了Delphi 6.0及其部分控件,SQL語(yǔ)言在Delphi 6.0中的應(yīng)用,以及Access等。
第四章是本文的主體,按照軟件工程的要求,從需求分析開始,經(jīng)過(guò)概要設(shè)計(jì)最后到詳細(xì)設(shè)計(jì),完成對(duì)整個(gè)系統(tǒng)的設(shè)計(jì)。
第五章根據(jù)第四章的設(shè)計(jì)結(jié)果利用Access 2000和Delphi 6.0進(jìn)行了具體的窗體和應(yīng)用程序設(shè)計(jì)。
總結(jié)部分介紹了設(shè)計(jì)體會(huì)和編程體會(huì),并指出了系統(tǒng)設(shè)計(jì)中的不足和改進(jìn)的方向
轉(zhuǎn)貼于 第二章
數(shù)據(jù)庫(kù)概論
§2.1
數(shù)據(jù)庫(kù)的發(fā)展
數(shù)據(jù)庫(kù)處理在信息系統(tǒng)的研究中一直是非常重要的主題,然而,近年來(lái),隨著World Wide Web(WWW)的猛增及Internet技術(shù)的迅速發(fā)展,使得數(shù)據(jù)庫(kù)技術(shù)之時(shí)成為最熱門技術(shù)之一。數(shù)據(jù)庫(kù)技術(shù)能使Internet應(yīng)用超越具有早期應(yīng)用特點(diǎn)的簡(jiǎn)單的。同時(shí),Internet技術(shù)提供了一種向用戶數(shù)據(jù)庫(kù)內(nèi)容的標(biāo)準(zhǔn)化的訪問方法。這些技術(shù)沒有脫離經(jīng)典數(shù)據(jù)庫(kù)技術(shù)的要求。它們只是加重了數(shù)據(jù)庫(kù)技術(shù)的重要性。
數(shù)據(jù)庫(kù)的設(shè)計(jì)和開發(fā)及包括藝術(shù)有包括工程。理解用戶的需求,然后,把它們轉(zhuǎn)變?yōu)橛行У臄?shù)據(jù)庫(kù)設(shè)計(jì)是一個(gè)藝術(shù)過(guò)程。把設(shè)計(jì)轉(zhuǎn)變?yōu)閷?shí)際的數(shù)據(jù)庫(kù),并且這些數(shù)據(jù)庫(kù)帶有功能完備、高效能的應(yīng)用,是一個(gè)工程過(guò)程。
數(shù)據(jù)庫(kù)的目的是幫助人們跟蹤事務(wù)。經(jīng)典的數(shù)據(jù)庫(kù)應(yīng)用涉及諸如訂單、顧客、工作、員工、學(xué)生、電話之類的項(xiàng),或其它數(shù)據(jù)量較大、需要密起關(guān)注的事務(wù)。最近,由于數(shù)據(jù)庫(kù)的普及,數(shù)據(jù)庫(kù)技術(shù)已經(jīng)被應(yīng)用到了新的領(lǐng)域,諸如用于Internet的數(shù)據(jù)庫(kù)或用于公司內(nèi)聯(lián)網(wǎng)的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)也被越來(lái)越多地應(yīng)用于生成和維護(hù)多媒體應(yīng)用程序上。
計(jì)算機(jī)的數(shù)據(jù)處理應(yīng)用,首先要把大量的信息以數(shù)據(jù)形式存放在存儲(chǔ)器中。存儲(chǔ)器的容量、存儲(chǔ)速率直接影響到數(shù)據(jù)管理技術(shù)的發(fā)展。從1956年生產(chǎn)出第一臺(tái)計(jì)算機(jī)到現(xiàn)在,存儲(chǔ)器的發(fā)展,為數(shù)據(jù)庫(kù)技術(shù)提供了良好的物質(zhì)基礎(chǔ)。
使用計(jì)算機(jī)以后,數(shù)據(jù)處理的速度和規(guī)模,無(wú)論是相對(duì)于手工方式,還是機(jī)械方式,都有無(wú)可比擬的優(yōu)勢(shì)。通常在數(shù)據(jù)處理中,計(jì)算是比較簡(jiǎn)單的而數(shù)據(jù)的管理卻比較復(fù)雜。數(shù)據(jù)管理是指數(shù)據(jù)的收集、整理、組織、存儲(chǔ)、維護(hù)、檢索、傳送等操作,這部分操作是數(shù)據(jù)處理業(yè)務(wù)的基本環(huán)節(jié),而且是任何數(shù)據(jù)處理業(yè)務(wù)中必不可少的共有部分。數(shù)據(jù)管理技術(shù)的優(yōu)劣,將直接影響數(shù)據(jù)處理的效率。
2.1.1 數(shù)據(jù)庫(kù)的發(fā)展
數(shù)據(jù)管理技術(shù)的發(fā)展,與硬件(主要是外存)、軟件、計(jì)算機(jī)應(yīng)用的范圍有密切的聯(lián)系。數(shù)據(jù)管理技術(shù)的發(fā)展經(jīng)過(guò)三個(gè)階段:人工管理階段、文件系統(tǒng)階段和數(shù)據(jù)庫(kù)階段。
人工管理階段和文件系統(tǒng)階段都有著相當(dāng)多的缺陷,諸如數(shù)據(jù)冗余性 ,數(shù)據(jù)不一致性以及數(shù)據(jù)聯(lián)系弱等等。也正是由于這些原因,促使人們研究新的數(shù)據(jù)管理技術(shù),從而產(chǎn)生了數(shù)據(jù)庫(kù)技術(shù)。
20世紀(jì)60年代末發(fā)生的三件大事,層次模型IMS系統(tǒng)的推出、關(guān)于網(wǎng)狀模型DBTG報(bào)告的發(fā)表以及關(guān)于關(guān)系模型論文的連續(xù)發(fā)表標(biāo)志著數(shù)據(jù)管理技術(shù)進(jìn)入數(shù)據(jù)庫(kù)階段。進(jìn)入70年代以后,數(shù)據(jù)庫(kù)技術(shù)得到迅速發(fā)展,開發(fā)了許多有效的產(chǎn)品并投入運(yùn)行。數(shù)據(jù)庫(kù)系統(tǒng)克服了文件系統(tǒng)的缺陷,提供了對(duì)數(shù)據(jù)更高級(jí)更有效的管理。
當(dāng)進(jìn)入數(shù)據(jù)庫(kù)階段后,隨著數(shù)據(jù)管理規(guī)模一再擴(kuò)大,數(shù)據(jù)量急劇增加,為了提高效率,開始時(shí),人們只是對(duì)文件系統(tǒng)加以擴(kuò)充,在應(yīng)用文件中建立了許多輔助索引,形成倒排文件系統(tǒng)。但這并不能最終解決問題。在20世紀(jì)60年代末,磁盤技術(shù)取得重要進(jìn)展,具有數(shù)百兆容量和快速存取的磁盤陸續(xù)進(jìn)入市場(chǎng),成本也不高,為數(shù)據(jù)庫(kù)技術(shù)的產(chǎn)生提供了良好的物質(zhì)條件。
2.1.2 數(shù)據(jù)庫(kù)階段的特點(diǎn)
(1)減少數(shù)據(jù)的重復(fù)(Redundancy can be reduced)
當(dāng)在一個(gè)非數(shù)據(jù)庫(kù)系統(tǒng)當(dāng)中,每一個(gè)應(yīng)用程序都有屬于他們自己的文件,由于無(wú)法有系統(tǒng)建立的數(shù)據(jù),因此常常會(huì)造成存儲(chǔ)數(shù)據(jù)的重復(fù)與浪費(fèi)。例如:在一家公司當(dāng)中,人事管理程序與工資管理程序或許都會(huì)使用到職員與部門的信息或文件,而我們可以運(yùn)用數(shù)據(jù)庫(kù)的方法,把這兩個(gè)文件整理起來(lái),以減少多余的數(shù)據(jù),過(guò)度地占用存儲(chǔ)空間。
(2)避免數(shù)據(jù)的不一致(Inconsistency can avoid)
本項(xiàng)的特色,可以說(shuō)是延伸前項(xiàng)的一個(gè)特點(diǎn),要說(shuō)明這樣的一個(gè)現(xiàn)象,我們可以從下面這個(gè)實(shí)例來(lái)看:若是在同一家公司當(dāng)中,職員甲在策劃部門工作,且職員甲的記錄同時(shí)被存放在數(shù)據(jù)庫(kù)的兩個(gè)地方,而數(shù)據(jù)庫(kù)管理系統(tǒng)卻沒有對(duì)這樣重要的情況加以控制,當(dāng)其中一條數(shù)據(jù)庫(kù)被修改時(shí),便會(huì)造成數(shù)據(jù)的不一致,但是,對(duì)于一個(gè)健全的數(shù)據(jù)庫(kù)管理系統(tǒng)而言,將會(huì)對(duì)這樣的情況加以控制,但有時(shí)并不需要刻意消除這種情形,應(yīng)當(dāng)視該數(shù)據(jù)庫(kù)的需求與效率來(lái)決定。
(3)數(shù)據(jù)共享(Data shared)
對(duì)于數(shù)據(jù)共享的意義,并不是只有針對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)的應(yīng)用程序,可以使用數(shù)據(jù)庫(kù)中的數(shù)據(jù),對(duì)于其他撰寫好的應(yīng)用程序,同樣可以對(duì)相同數(shù)據(jù)庫(kù)當(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ù)庫(kù)管理系統(tǒng),對(duì)數(shù)據(jù)做出統(tǒng)籌性的管理,對(duì)于數(shù)據(jù)的格式與一些存儲(chǔ)上的標(biāo)準(zhǔn)進(jìn)行控制,如此一來(lái),對(duì)于不同的環(huán)境的數(shù)據(jù)交換(Data Interchange)上將有很大的幫助,也能提高數(shù)據(jù)處理的效率。
(5)實(shí)踐安全性的管理(Security restriction can be applied)
通過(guò)對(duì)數(shù)據(jù)庫(kù)完整的權(quán)限控制,數(shù)據(jù)庫(kù)管理者可以確認(rèn)所有可供用戶存取數(shù)據(jù)的合法途徑渠道,并且可以事先對(duì)一些較重要或關(guān)鍵性的數(shù)據(jù)進(jìn)行安全檢查,以確保數(shù)據(jù)存取時(shí),能夠?qū)⑷魏尾划?dāng)損毀的情形降至最低。
(6)完整性的維護(hù)(Integrity can be maintained)
所謂完整性的問題,就是要確認(rèn)某條數(shù)據(jù)在數(shù)據(jù)庫(kù)當(dāng)中,是正確無(wú)誤的。正如(2)所述,若是無(wú)法控制數(shù)據(jù)的不一致性,便會(huì)產(chǎn)生完整性不足的問題,所以,我們會(huì)發(fā)現(xiàn),當(dāng)數(shù)據(jù)重復(fù)性高的時(shí)候,數(shù)據(jù)不完整的情形也會(huì)增加,當(dāng)然,若是數(shù)據(jù)庫(kù)的功能完整,將會(huì)大大地提高數(shù)據(jù)完整性,也會(huì)增加數(shù)據(jù)庫(kù)的維護(hù)能力與維護(hù)簡(jiǎn)便性。
(7)需求沖突會(huì)獲得平衡(Conflicting requirements can be balance)
在一個(gè)較大型的企業(yè)當(dāng)中,用戶不同的需求,往往會(huì)造成系統(tǒng)或數(shù)據(jù)庫(kù)在設(shè)計(jì)上的困擾,但是一個(gè)合適的數(shù)據(jù)庫(kù)系統(tǒng),可以通過(guò)數(shù)據(jù)庫(kù)管理員的管理,將會(huì)有效地整理各方面的信息,對(duì)于一些較重要的應(yīng)用程序,可以適時(shí)地提供較快速的數(shù)據(jù)存取方法與格式,以平衡多個(gè)用戶在需求上的沖突。
上述七個(gè)方面構(gòu)成了數(shù)據(jù)庫(kù)系統(tǒng)的主要特征。這個(gè)階段的程序和數(shù)據(jù)間的聯(lián)系可用下圖表示: 2.1.3 數(shù)據(jù)庫(kù)技術(shù)
從文件系統(tǒng)發(fā)展到數(shù)據(jù)庫(kù)系統(tǒng)是信息處理領(lǐng)域的一個(gè)重大變化。在文件系統(tǒng)階段,人們關(guān)注的中心問題是系統(tǒng)功能的設(shè)計(jì),因而程序設(shè)計(jì)處于主導(dǎo)地位,數(shù)據(jù)只起著服從程序需要的作用。在數(shù)據(jù)庫(kù)方式下,信息處理觀念已為新體系所取代,數(shù)據(jù)占據(jù)了中心位置。數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)成為信息系統(tǒng)首先關(guān)心的問題,而利用這些數(shù)據(jù)的應(yīng)用程序設(shè)計(jì)則退居到以既定的數(shù)據(jù)結(jié)構(gòu)為基礎(chǔ)的外圍地位。
目前世界上已有數(shù)百萬(wàn)個(gè)數(shù)據(jù)庫(kù)系統(tǒng)在運(yùn)行,其應(yīng)用已經(jīng)深入到人類社會(huì)生活的各個(gè)領(lǐng)域,從企業(yè)管理、銀行業(yè)務(wù)、資源分配、經(jīng)濟(jì)預(yù)測(cè)一直到信息檢索、檔案管理、普查統(tǒng)計(jì)等。并在通信網(wǎng)絡(luò)基礎(chǔ)上,建立了許多國(guó)際性的聯(lián)機(jī)檢索系統(tǒng)。我國(guó)20世紀(jì)90年代初在全國(guó)范圍內(nèi)裝備了12個(gè)以數(shù)據(jù)庫(kù)技術(shù)為基礎(chǔ)的大型計(jì)算機(jī)系統(tǒng),這些系分布在郵電、計(jì)委、銀行、電力、鐵路、氣象、民航、情報(bào)、公安、軍事、航天和財(cái)稅等行業(yè)。
數(shù)據(jù)庫(kù)技術(shù)還在不斷的發(fā)展,并且不斷地與其它計(jì)算機(jī)技術(shù)相互滲透。數(shù)據(jù)庫(kù)技術(shù)與網(wǎng)絡(luò)通信技術(shù)相結(jié)合,產(chǎn)生了分布式數(shù)據(jù)庫(kù)系統(tǒng)。數(shù)據(jù)庫(kù)技術(shù)與面向?qū)ο蠹夹g(shù)相結(jié)合,產(chǎn)生了面向?qū)ο髷?shù)據(jù)庫(kù)系統(tǒng)。
在數(shù)據(jù)庫(kù)技術(shù)中有四個(gè)名詞,其概念應(yīng)該分清。
(1)數(shù)據(jù)庫(kù)(database,DB):DB是統(tǒng)一管理的相關(guān)數(shù)據(jù)的集合。DB能為各種用戶共享,具有最小冗余度,數(shù)據(jù)間聯(lián)系密切,而又有較高的數(shù)據(jù)獨(dú)立性。
(2)數(shù)據(jù)庫(kù)管理系統(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ù)庫(kù)系統(tǒng)(Database System,DBS):DBS是實(shí)現(xiàn)有組織地、動(dòng)態(tài)地存儲(chǔ)大量關(guān)聯(lián)數(shù)據(jù),方便多用戶訪問的計(jì)算機(jī)軟件、硬件和數(shù)據(jù)資源組成的系統(tǒng),即采用了數(shù)據(jù)庫(kù)技術(shù)的計(jì)算機(jī)系統(tǒng)。
(4)數(shù)據(jù)庫(kù)技術(shù):這是一門研究數(shù)據(jù)庫(kù)的結(jié)構(gòu)、存儲(chǔ)、管理和使用的軟件學(xué)科。數(shù)據(jù)庫(kù)技術(shù)是操作系統(tǒng)的文件系統(tǒng)基礎(chǔ)上發(fā)展起來(lái)的。而DBMS本身要在操作系統(tǒng)的支持下才能工作。數(shù)據(jù)庫(kù)不僅用到數(shù)據(jù)結(jié)構(gòu)的知識(shí),而且豐富了數(shù)據(jù)結(jié)構(gòu)的內(nèi)容。在關(guān)系數(shù)據(jù)庫(kù)中要用到集合論、數(shù)理邏輯的理論。因此,數(shù)據(jù)庫(kù)技術(shù)是一門綜合性較強(qiáng)的學(xué)科。
§2.2數(shù)據(jù)庫(kù)理論基礎(chǔ)
2.2.1 數(shù)據(jù)庫(kù)模型
從20世紀(jì)50年代中期開始,計(jì)算機(jī)的應(yīng)用由科學(xué)研究部門逐步擴(kuò)展到企業(yè)、行政部門。至60年代,數(shù)據(jù)處理成為計(jì)算機(jī)的主要應(yīng)用。數(shù)據(jù)庫(kù)技術(shù)作為數(shù)據(jù)管理技術(shù),是計(jì)算機(jī)軟件領(lǐng)域的一個(gè)重要分支,產(chǎn)生于60年代末?,F(xiàn)已形成相當(dāng)規(guī)模的理論體系和實(shí)用技術(shù)。
模型是對(duì)現(xiàn)實(shí)世界的抽象。在數(shù)據(jù)庫(kù)技術(shù)中,我們用模型的概念描述數(shù)據(jù)庫(kù)的結(jié)構(gòu)與語(yǔ)義,對(duì)現(xiàn)實(shí)世界進(jìn)行抽象,表示實(shí)體類型及實(shí)體間聯(lián)系的模型稱為“數(shù)據(jù)模型” 。
目前廣泛作用的數(shù)據(jù)模型可分為兩種類型。
一種是獨(dú)立于計(jì)算機(jī)系統(tǒng)的模型,完全不涉及信息在系統(tǒng)中的表示,只是用來(lái)描述某個(gè)特定組織所關(guān)心的信息結(jié)構(gòu),這類模型稱為“概念數(shù)據(jù)模型” 。要領(lǐng)模型用于建立信息世界的數(shù)據(jù)模型,強(qiáng)調(diào)其語(yǔ)義表達(dá)功能,應(yīng)該概念簡(jiǎn)單、清晰,易于用戶理解,它是現(xiàn)實(shí)世界的第一層抽象,是用戶和數(shù)據(jù)庫(kù)設(shè)計(jì)人員之間進(jìn)行交流的工具。這一其中著名的模型是“實(shí)體聯(lián)系模型” 。
另一種數(shù)據(jù)模型是直接面向數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),它是現(xiàn)實(shí)世界的第二層抽象。 這類模型涉及到計(jì)算機(jī)系統(tǒng)和數(shù)據(jù)庫(kù)管理系統(tǒng),又稱為“結(jié)構(gòu)數(shù)據(jù)模型” 。例如,層次、網(wǎng)狀、關(guān)系、面向?qū)ο蟮饶P汀_@類模型有嚴(yán)格的形式化定義,以便于在計(jì)算機(jī)系統(tǒng)中實(shí)現(xiàn)。
(1)層次模型。用樹型結(jié)構(gòu)表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型。樹的結(jié)點(diǎn)是記錄類型,每個(gè)非根結(jié)點(diǎn)有且只有一個(gè)父結(jié)點(diǎn)。上一層記錄類型和下一層記錄類型間聯(lián)系是1∶N聯(lián)系。
層次模型的特點(diǎn)是記錄之間的聯(lián)系通過(guò)指針實(shí)現(xiàn),查詢效率較高。但層次模型有兩個(gè)缺點(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報(bào)告提出的數(shù)據(jù)模型是網(wǎng)狀模型的主要代表。有向圖中的結(jié)點(diǎn)是記錄類型,有向邊表示從箭尾一端的記錄類型到箭頭一端的記錄類型間聯(lián)系是1∶N聯(lián)系。
網(wǎng)狀模型的特點(diǎn):記錄之間聯(lián)系通過(guò)指針實(shí)現(xiàn),M∶N聯(lián)系也容易實(shí)現(xiàn)(每個(gè)M∶N聯(lián)系可拆成兩個(gè)1∶N聯(lián)系),查詢效率較高。網(wǎng)狀模型的缺點(diǎn)是編寫應(yīng)用程序比較復(fù)雜,程序員必須熟悉數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)。由于層次系統(tǒng)和網(wǎng)狀系統(tǒng)的應(yīng)用程序編制比較復(fù)雜,因此,從20世紀(jì)80年代中期起,其市場(chǎng)已被關(guān)系系統(tǒng)所取代。但是使用這兩種模型建立起的許多數(shù)據(jù)庫(kù)仍然在正常運(yùn)轉(zhuǎn),只是在外層加了個(gè)關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的接口。網(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)系模型是由若干個(gè)關(guān)系模式組成的集合。關(guān)系模式相當(dāng)于前面提到的記錄類型,它的實(shí)例稱為關(guān)系,每個(gè)關(guān)系實(shí)際上是一張二維表格。
關(guān)系模型和層次、網(wǎng)狀模型的最大判別是用關(guān)鍵碼而不是用指針導(dǎo)航數(shù)據(jù),表格簡(jiǎn)單用戶易懂,編程時(shí)并不涉及存儲(chǔ)結(jié)構(gòu),訪問技術(shù)等細(xì)節(jié)。關(guān)系模型是數(shù)學(xué)化模型。SQL語(yǔ)言是關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)化語(yǔ)言,已得到了廣泛的應(yīng)用。20世紀(jì)70年代對(duì)關(guān)系數(shù)據(jù)庫(kù)的研究主要集中在理論和實(shí)驗(yàn)系統(tǒng)的開發(fā)方面。80年代初才形成產(chǎn)品,但很快得到廣泛的應(yīng)用和普及,并最終取代了層次、網(wǎng)狀數(shù)據(jù)庫(kù)產(chǎn)品?,F(xiàn)在市場(chǎng)上典型的關(guān)系DBMS產(chǎn)品有DB2、ORACLE、SYBASE、INFORMIX和微機(jī)型產(chǎn)品Foxpro、Access等。
關(guān)系模型和網(wǎng)狀、層次模型的最大區(qū)別是:關(guān)系模型用表格數(shù)據(jù)而不是通過(guò)指針鏈來(lái)表示和實(shí)現(xiàn)實(shí)體間聯(lián)系。關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單、易懂。只需用簡(jiǎn)單的查詢語(yǔ)句就可對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。
關(guān)系模型是數(shù)學(xué)化的模型,可把表格看成一個(gè)集合,因此集合論、數(shù)理邏輯等知識(shí)可引入到關(guān)系模型中來(lái)。關(guān)系模型已是一個(gè)成熟的有前途的模型,已得到廣泛應(yīng)用。
(4)面向?qū)ο竽P?。目前,關(guān)系數(shù)據(jù)庫(kù)的使用已相當(dāng)普遍,但是,現(xiàn)實(shí)世界中仍然存在著許多含有復(fù)雜數(shù)據(jù)結(jié)構(gòu)的應(yīng)用領(lǐng)域,例如,CAD數(shù)據(jù)、圖形數(shù)據(jù)等,而關(guān)系模型在這方面的處理能力就顯得力不從心。因此,人們需要更高級(jí)的數(shù)據(jù)庫(kù)技術(shù)來(lái)表達(dá)這類信息。面向?qū)ο蟮母拍钭钤绯霈F(xiàn)在程序設(shè)計(jì)語(yǔ)言中,隨后迅速滲透到計(jì)算機(jī)領(lǐng)域的每一個(gè)分支。面向?qū)ο髷?shù)據(jù)庫(kù)是面向?qū)ο蟾拍钆c數(shù)據(jù)庫(kù)技術(shù)相結(jié)合的產(chǎn)物。
面向?qū)ο竽P湍芡暾孛枋霈F(xiàn)實(shí)世界的數(shù)據(jù)結(jié)構(gòu),具有豐富的表達(dá)能力,但模型相對(duì)較復(fù)雜,涉及的知識(shí)面也廣,因此面向?qū)ο髷?shù)據(jù)庫(kù)尚未達(dá)到關(guān)系數(shù)據(jù)庫(kù)那樣的普及程度。
2.2.2 數(shù)據(jù)庫(kù)體系結(jié)構(gòu)
數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)分三級(jí):內(nèi)部級(jí)(internal),概念級(jí)(conceptual)和外部級(jí)(external)。這個(gè)三級(jí)結(jié)構(gòu)有時(shí)也稱為“三級(jí)模式結(jié)構(gòu)”,或“數(shù)據(jù)抽象的三個(gè)級(jí)別”,最早是在1971年通過(guò)的DBTG報(bào)告中提出,后來(lái)收入在1975年的美國(guó)ANSI/SPARC報(bào)告中。雖然現(xiàn)在DBMS的產(chǎn)品多種多樣,在不同的操作系統(tǒng)支持下工作,但是大多數(shù)系統(tǒng)在總的體系結(jié)構(gòu)上都具有三級(jí)模式的結(jié)構(gòu)特征。從某個(gè)角度看到的數(shù)據(jù)特性稱為“數(shù)據(jù)視圖”(data view)。
外部級(jí)最接近用戶,是單個(gè)用戶所能看到的數(shù)據(jù)特性。單個(gè)用戶使用的數(shù)據(jù)視圖的描述稱為“外模式”。
概念級(jí)涉及到所有用戶的數(shù)據(jù)定義,是全局的數(shù)據(jù)視圖。全局?jǐn)?shù)據(jù)視圖的描述稱為“概念模式”。
內(nèi)部級(jí)最接近于物理存儲(chǔ)設(shè)備,涉及到實(shí)際數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)。物理存儲(chǔ)數(shù)據(jù)視圖的描述稱為“內(nèi)模式”。
數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)是數(shù)據(jù)的三個(gè)抽象級(jí)別。它把數(shù)據(jù)的具體組織留給DBMS去做,用戶只要抽象地處理數(shù)據(jù),而不必關(guān)心數(shù)據(jù)在計(jì)算機(jī)中的表示和存儲(chǔ),這樣就減輕了用戶使用系統(tǒng)的負(fù)擔(dān)。
三級(jí)結(jié)構(gòu)之間往往差別很大,為了實(shí)現(xiàn)這三個(gè)抽象級(jí)別的聯(lián)系和轉(zhuǎn)換,DBMS在三級(jí)結(jié)構(gòu)之間提供兩個(gè)層次的映象(mappings):外模式/模式映象,模式/內(nèi)模式映象。此處模式是概念模式的簡(jiǎn)稱。
2.2.3 數(shù)據(jù)的獨(dú)立性
由于數(shù)據(jù)庫(kù)系統(tǒng)采用三級(jí)模式結(jié)構(gòu),因此系統(tǒng)具有數(shù)據(jù)獨(dú)立性的特點(diǎn)。在數(shù)據(jù)庫(kù)技術(shù)中,數(shù)據(jù)獨(dú)立性是指應(yīng)用程序和數(shù)據(jù)之間相互獨(dú)立,不受影響。數(shù)據(jù)獨(dú)立性分成物理數(shù)據(jù)獨(dú)立性和邏輯數(shù)據(jù)獨(dú)立性兩級(jí)。
(1)物理數(shù)據(jù)獨(dú)立性
如果數(shù)據(jù)庫(kù)的內(nèi)模式要進(jìn)行修改,即數(shù)據(jù)庫(kù)的存儲(chǔ)設(shè)備和存儲(chǔ)方法有所變化,那么模式/內(nèi)模式映象也要進(jìn)行相當(dāng)?shù)男薷?,使概念模式盡可能保持不變。也就是對(duì)內(nèi)模式的修改盡量不影響概念模式,當(dāng)然,對(duì)于外模式和應(yīng)用程序的影響更小,這樣,我們稱數(shù)據(jù)庫(kù)達(dá)到了物理數(shù)據(jù)獨(dú)立性。
(2)邏輯數(shù)據(jù)獨(dú)立性
如果數(shù)據(jù)庫(kù)的概念模式要進(jìn)行修改,譬如增加記錄類型或增加數(shù)據(jù)項(xiàng),那么外模式/模式映象也要進(jìn)行相應(yīng)的修改,使外模式盡可能保持不變。也就是對(duì)概念模式的修改盡量不影響外模式和應(yīng)用程序,這樣,我們稱數(shù)據(jù)庫(kù)達(dá)到了邏輯數(shù)據(jù)獨(dú)立性。
現(xiàn)有關(guān)系系統(tǒng)產(chǎn)品均提供了較高的物理獨(dú)立性,而對(duì)邏輯獨(dú)立性的支持尚有欠缺,例如,對(duì)外模式的數(shù)據(jù)更新受到限制等。
2.2.4 范式
建立起一個(gè)良好的數(shù)據(jù)指標(biāo)體系,是建立數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)的最重要的一環(huán)。一個(gè)良好的數(shù)據(jù)指標(biāo)體系是建立DB的必要條件,但不是充分條件。我們完全可以認(rèn)為所建指標(biāo)體系中的一個(gè)指標(biāo)類就是關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)基本表,而這個(gè)指標(biāo)類下面的一個(gè)個(gè)具體指標(biāo)就是這個(gè)基本表中的一個(gè)字段。但如果直接按照這種方式建庫(kù)顯然還不能算最佳。對(duì)于指標(biāo)體系中數(shù)據(jù)的結(jié)構(gòu)在建庫(kù)前還必須進(jìn)行規(guī)范化的重新組織。
在數(shù)據(jù)的規(guī)范化表達(dá)中,一般將一組相互關(guān)聯(lián)的數(shù)據(jù)稱為一個(gè)關(guān)系(relation),而在這個(gè)關(guān)系下的每個(gè)數(shù)據(jù)指標(biāo)項(xiàng)則被稱為數(shù)據(jù)元素(data element),這種關(guān)系落實(shí)到具體數(shù)據(jù)庫(kù)上就是基本表,而數(shù)據(jù)元素就是基本表中的一個(gè)字段(field)。規(guī)范化表達(dá)還規(guī)定在每一個(gè)基本表中必須定義一個(gè)數(shù)據(jù)元素為關(guān)鍵字(key),它可以唯一地標(biāo)識(shí)出該表中其它相關(guān)的數(shù)據(jù)元素。在規(guī)范化理論中表是二維的,它有如下四個(gè)性質(zhì):
在表中的任意一列上,數(shù)據(jù)項(xiàng)應(yīng)屬于同一個(gè)屬性(如圖中每一列都存放著不同合同記錄的同一屬性數(shù)據(jù))。
表中所有行都是不相同的,不允許有重復(fù)組項(xiàng)出現(xiàn)(如圖中每一行都是一個(gè)不同的合同記錄)。
在表中,行的順序無(wú)關(guān)緊要(如圖中每行存的都是合同記錄,至于先放哪一個(gè)合同都沒關(guān)系)。
在表中,列的順序無(wú)關(guān)緊要,但不能重復(fù)(如圖中合同號(hào)和合同名誰(shuí)先誰(shuí)后都沒關(guān)系,但二者不可重復(fù)或同名)。
在對(duì)表的形式進(jìn)行了規(guī)范化定義后,數(shù)據(jù)結(jié)構(gòu)還有五種規(guī)范化定義,定名為規(guī)范化模式,稱為范式。在這五種范式中,一般只用前三種,對(duì)于常用系統(tǒng)就足夠了。而且這五種范式是“向上兼容”的,即滿足第五范式的數(shù)據(jù)結(jié)構(gòu)自動(dòng)滿足一、二、三、四范式,滿足第四范式的數(shù)據(jù)結(jié)構(gòu)自動(dòng)滿足第一、二、三范式,……,依此類推。
第一范式(first normal form,簡(jiǎn)稱1st NF)就是指在同一表中沒有重復(fù)項(xiàng)出現(xiàn),如果有則應(yīng)將重復(fù)項(xiàng)去掉。這個(gè)去掉重復(fù)項(xiàng)的過(guò)程就稱之為規(guī)范化處理。在本文所討論的開發(fā)方法里,1st NF實(shí)際上是沒有什么意義的。因?yàn)槲覀儼匆?guī)范化建立的指標(biāo)體系和表的過(guò)程都自動(dòng)保證了所有表都滿足1st NF。
第二范式(second normal form,簡(jiǎn)稱 2nd NF)是指每個(gè)表必須有一個(gè)(而且僅一個(gè))數(shù)據(jù)元素為主關(guān)鍵字(primary key),其它數(shù)據(jù)元素與主關(guān)鍵字一一對(duì)應(yīng)。例如,在圖l9.7中如果我們將合同號(hào)定義為主關(guān)鍵字(其它數(shù)據(jù)元素中的記錄數(shù)據(jù)都有可能重名,故不能作為主關(guān)鍵字),故只要知道了一個(gè)合同記錄的合同號(hào),就可以唯一地在同一行中找到該合同的任何一項(xiàng)具體信息。通常我們稱這種關(guān)系為函數(shù)依賴(functional depEndence)關(guān)系。即表中其它數(shù)據(jù)元素都依賴于主關(guān)鍵字,或稱該數(shù)據(jù)元素唯一地被主關(guān)鍵字所標(biāo)識(shí)。
第三范式(third normal form,簡(jiǎn)稱 3rd NF)就是指表中的所有數(shù)據(jù)元素不但要能夠唯一地被主關(guān)鍵字所標(biāo)識(shí),而且它們之間還必須相互獨(dú)立,不存在其它的函數(shù)關(guān)系。也就是說(shuō)對(duì)于一個(gè)滿足了 2nd NF的數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),表中有可能存在某些數(shù)據(jù)元素依賴于其它非關(guān)鍵宇數(shù)據(jù)元素的現(xiàn)象,必須加以消除。
為防止數(shù)據(jù)庫(kù)出現(xiàn)更新異常、插入異常、刪除異常、數(shù)據(jù)冗余太大等現(xiàn)象,關(guān)系型數(shù)據(jù)庫(kù)要盡量按關(guān)系規(guī)范化要求進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)。
§2.3 SQL語(yǔ)言基礎(chǔ)
2.3.1 SQL簡(jiǎn)介
用戶對(duì)數(shù)據(jù)庫(kù)的使用,是通過(guò)數(shù)據(jù)庫(kù)管理系統(tǒng)提供的語(yǔ)言來(lái)實(shí)現(xiàn)的。不同的數(shù)據(jù)庫(kù)管理系統(tǒng)提供不同的數(shù)據(jù)庫(kù)語(yǔ)言。關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)幾乎都提供關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言——SQL。
SQL 的全稱是Structured Query Language,即結(jié)構(gòu)化查詢語(yǔ)言。SQL語(yǔ)句可以從關(guān)系數(shù)據(jù)庫(kù)中獲得數(shù)據(jù),也可以建立數(shù)據(jù)庫(kù)、增加數(shù)據(jù)、修改數(shù)據(jù)。1986年ANSI采用SQL語(yǔ)言作為關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的標(biāo)準(zhǔn)語(yǔ)言,后被國(guó)際化標(biāo)準(zhǔn)組織(ISO)采納為國(guó)際標(biāo)準(zhǔn)。SQL語(yǔ)言使用方便、功能豐富、簡(jiǎn)潔易學(xué),是操作數(shù)據(jù)庫(kù)的工業(yè)標(biāo)準(zhǔn)語(yǔ)言,得到廣泛地應(yīng)用。例如關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品DB2、ORACLE等都實(shí)現(xiàn)了SQL語(yǔ)言。同時(shí),其它數(shù)據(jù)庫(kù)產(chǎn)品廠家也紛紛推出各自的支持SQL的軟件或者與SQL的接口軟件。這樣SQL語(yǔ)言很快被整個(gè)計(jì)算機(jī)界認(rèn)可。
SQL語(yǔ)言是一種非過(guò)程化語(yǔ)言,它一次處理一個(gè)記錄集合,對(duì)數(shù)據(jù)提供自動(dòng)導(dǎo)航。SQL語(yǔ)言允許用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,而不對(duì)單個(gè)記錄進(jìn)行操作。SQL語(yǔ)言不要求用戶指定數(shù)據(jù)的存取方法,而是使用查詢優(yōu)化器,由系統(tǒng)決定對(duì)指定數(shù)據(jù)存取的最快速手段。當(dāng)設(shè)計(jì)者在關(guān)系表上定義了索引時(shí),系統(tǒng)會(huì)自動(dòng)利用索引進(jìn)行快速檢索,用戶不需知道表上是否有索引或者有什么類型的索引等細(xì)節(jié)。
SQL語(yǔ)言可以完成許多功能,例如:
查詢數(shù)據(jù)
在數(shù)據(jù)庫(kù)表格中插入、修改和刪除記錄
建立、修改和刪除數(shù)據(jù)對(duì)象
控制對(duì)數(shù)據(jù)和數(shù)據(jù)對(duì)象的存取
確保數(shù)據(jù)庫(kù)的一致性和完整性等
2.3.2 SQL查詢
數(shù)據(jù)查詢是關(guān)系運(yùn)算理論在SQL語(yǔ)言中的主要體現(xiàn),SELECT 語(yǔ)句是SQL查詢的基本語(yǔ)句,當(dāng)我們?cè)趯?duì)一個(gè)數(shù)據(jù)庫(kù)進(jìn)各種各樣的操作時(shí),使用的最多的就是數(shù)據(jù)查詢,在以SQL為基礎(chǔ)的關(guān)系數(shù)據(jù)庫(kù)中,使用的最多的就是SELECT查詢語(yǔ)句。
SELECT語(yǔ)句的完整句法如下:
SELECT 目標(biāo)表的列名或列表達(dá)式序列
FROM 基本表和(或)視圖序列
[WHERE 行條件表達(dá)式]
[GROUP BY 列名序列]
[HAVING 組條件表達(dá)式]
[ORDER BY列名 [ASC│DEAC]…]
我在SELECT語(yǔ)句中還使用了大量的保留字和通配符以進(jìn)行各種各樣的條件查詢。在系統(tǒng)中有大量的查詢按鈕,其使用了大量的查詢語(yǔ)句,而且這些查詢語(yǔ)句大部分使用的是模糊查詢,所以大量的使用了模式匹配符LIKE(判斷值是否與指定的字符通配格式相符)。在包含LIKE的查詢語(yǔ)句中可以使用兩個(gè)通配符:%(百分號(hào)):與零個(gè)或多個(gè)字符組成的字符串匹配;_(下劃線):與單個(gè)字符匹配。系統(tǒng)中的條件判斷往往包含多個(gè)條件,這時(shí)就需要使用邏輯運(yùn)算符NOT、AND、OR(用于多條件的邏輯連接),謂詞ALL以及保留字DISTINCT等等。做為SELECT語(yǔ)句還有很多的使用方法,這里就不再敘述。
2.3.3 SQL數(shù)據(jù)更新
使用數(shù)據(jù)庫(kù)的目的是為了有效地管理數(shù)據(jù),而數(shù)據(jù)的插入、刪除和修改則是必不可少的一個(gè)功能。在本系統(tǒng)中就大量地使用了數(shù)據(jù)插入、刪除和修改這三種操作,現(xiàn)做一個(gè)簡(jiǎn)單地介紹。
數(shù)據(jù)插入
往數(shù)據(jù)庫(kù)的基本表中插入數(shù)據(jù)使用的是INSERT語(yǔ)句,其方式有兩種:一種是元組值的插入,另一種是查詢結(jié)果的插入。在本系統(tǒng)中使用的是前一種方式,其句法如下:
INSERT INTO 基本表名(列表名)VALUES(元組值)
數(shù)據(jù)刪除
往數(shù)據(jù)庫(kù)的基本表中刪除數(shù)據(jù)使用的是DELETE語(yǔ)句,其句法如下:
DELETE FROM 基本表名 [WHERE 條件表達(dá)式]
在些作一點(diǎn)說(shuō)明,刪除語(yǔ)句實(shí)際上是“SELECT * FROM 基本表名 [WHERE 條件表達(dá)式]”和DELETE操作的結(jié)合,每找到一個(gè)元組,就把它刪除。此外,DELETE語(yǔ)句只能從一個(gè)基本表中刪除元組,WHERE子句中條件可以嵌套,也可以是來(lái)自幾個(gè)基本表的復(fù)合條件。
數(shù)據(jù)修改
當(dāng)需要修改基本表中元組的某些列值時(shí),可以用UPDATE語(yǔ)句實(shí)現(xiàn),其句法如下:
UPDATE基本表名
SET列名=值表達(dá)式[,列名=值表達(dá)式…]
[WHERE條件表達(dá)式]
在Delphi中使用SQL語(yǔ)句是很方便的,一般來(lái)說(shuō),都是通過(guò)TQuery組件來(lái)使用SQL語(yǔ)言的。有一點(diǎn)要進(jìn)行說(shuō)明,雖然通過(guò)TQuery組件來(lái)使用SQL語(yǔ)言很方便,但考慮到自己對(duì)不同組件的理解程度、個(gè)人習(xí)慣以及其它各個(gè)方面,在本系統(tǒng)中我采用的是ADO組件來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。最簡(jiǎn)單的方法比如在TADOQuery組件的SQL屬性中就可以鍵入SQL語(yǔ)句,至于詳細(xì)的使用方法在后面進(jìn)行介紹。
轉(zhuǎn)貼于 第三章
數(shù)據(jù)庫(kù)開發(fā)工具
§3.1 Delphi 6.0 簡(jiǎn)介
Delphi類可以粗略地分成兩部分:一部分是組件類,這些組件類通常以某種方式出現(xiàn)在組件面板上,當(dāng)用戶從組件面板上點(diǎn)取一個(gè)類的圖標(biāo)后,在程序中就自動(dòng)生成了該類的對(duì)象(非可視組件除外);另一部分是功能類,這此功能類的對(duì)象通常出現(xiàn)在程序代碼中,起著不可代替的作用,但是這些功能類在組件面板上是找不到的。在Delphi中,每一個(gè)類的祖先都是Tobject類,整個(gè)類的層次結(jié)構(gòu)就像一棵倒掛的樹,在最頂層的樹根即為Tobject類。這樣,按照面向?qū)ο缶幊痰幕舅枷?,就使得用戶可用Tobject類這個(gè)類型代替任何其它類的數(shù)據(jù)類型。實(shí)際上在Delphi的類庫(kù)中,Tobject類派生出了為數(shù)相當(dāng)眾多的子類,它們形成了一個(gè)龐大的體系,通常情況下,如果不自行開發(fā)組件,就不必了解整個(gè)類的體系結(jié)構(gòu),只用到類層次樹的葉結(jié)點(diǎn)就足夠了。
凡是做過(guò)程序開發(fā)的人都知道從來(lái)沒有單純的數(shù)據(jù)應(yīng)用程序,也就是說(shuō),數(shù)據(jù)庫(kù)應(yīng)用程序必須和用戶界面(可以是圖形界面,也可以是命令接口)元素相結(jié)合,只講界面或只講數(shù)據(jù)庫(kù)本身都構(gòu)不成數(shù)據(jù)庫(kù)應(yīng)用程序,因而用Delphi 6.0開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序就隱含著界面開發(fā)。Delphi6中的VCL組件可用圖3-1來(lái)說(shuō)明。組件在Delphi程序的開發(fā)中是最顯眼的角色。大家知道,在編寫程序時(shí)一般都開始于在組件面板上選擇組件并定義組件間的相互作用。但也有一些組件不在組件面板上,例如Tform和Tapplication(典型的非可視組件)。組件是Tcomponents派生出來(lái)的子類,可以流的形式存放在DFM文件中,具有事件和Publish屬性。
窗口組件類是窗口化的可視化組件類,在Delphi的類庫(kù)中占有最大的份額。在實(shí)際編程中,窗口組件類的對(duì)象都有句柄,可以接受輸入焦點(diǎn)和包含其它組件。
圖形組件與窗口組件并列,是另一大類組件。圖形組件不是基于窗口的,因而不能有窗口句柄,不能接受輸入焦點(diǎn)和包含其它組件。從圖8-43中可以看出,圖形組件的基類是TgraphicControl,在實(shí)際編程中,它們必須寄生于它們的宿主——窗口組件類的對(duì)象,由它們的擁有者負(fù)責(zé)其顯示,而且它們還能觸發(fā)一些和鼠標(biāo)活動(dòng)相關(guān)的事件。圖形控件最典型的例子是Tlabel和TspeedButton。由此可以看出圖形組件的功能很弱,有讀者會(huì)問圖形組件的用處何在呢?其實(shí)使用圖形組件的最大好處在于節(jié)省資源,正是因?yàn)樗鼈兊墓δ茌^弱,所以使用的系統(tǒng)資源就要少。在一個(gè)應(yīng)用程序中,如果能在不影響其功能的前提下合理大量地使用圖形組件,將會(huì)大減少程序?qū)ο到y(tǒng)資源的消耗。
非可視組件是與可視組件相并列的另一類組件,非可視組件在程序運(yùn)行中是不可見的(除各種對(duì)話框組件之外,事實(shí)上有人認(rèn)為對(duì)話框組件不能歸入非可視組件,應(yīng)該是另一種介于可視與非可視之間的組件)。
§3.2 Delphi 6.0 控件
用Delphi6開發(fā)數(shù)據(jù)庫(kù)應(yīng)用,重點(diǎn)是和各種數(shù)據(jù)庫(kù)組件打交道,當(dāng)然也要使用其它的一些組件,現(xiàn)在就我在系統(tǒng)設(shè)計(jì)中所使用的重要組件給與簡(jiǎn)單介紹。
3.2.1 ADO數(shù)據(jù)訪問組件
ADO數(shù)據(jù)對(duì)象(Active Data Objects)實(shí)際是一種提供訪問各種數(shù)據(jù)類型的鏈接機(jī)制。ADO設(shè)計(jì)為一種極簡(jiǎn)單的格式,通過(guò)ODBC的方法同數(shù)據(jù)庫(kù)接口中,可以使用任何一種ODBC數(shù)據(jù)源,即不止適合于SQL Server、Oracle、Access等數(shù)據(jù)庫(kù)應(yīng)用程序,也適合于Excel表格、文本文件、圖形文件和無(wú)格式的數(shù)據(jù)文件。ADO是基于OLE-DB之上的技術(shù),因此ADO通過(guò)其內(nèi)部的屬性和方法提供統(tǒng)一的數(shù)據(jù)訪問接口方法。ADO使您的客戶端應(yīng)用程序能夠通過(guò)OLE DB提供訪問和操作在數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)。ADO支持用于建立C/S和Web的應(yīng)用程序的主要功能。其主要優(yōu)點(diǎn)是易于使用、高速度、低內(nèi)存支出和占用磁盤空間較少。ADO同時(shí)具有遠(yuǎn)程數(shù)據(jù)服務(wù)(RDS)功能,通過(guò)RDS可以在一次往返過(guò)程中實(shí)現(xiàn)將數(shù)據(jù)從服務(wù)器移動(dòng)到客戶端應(yīng)用程序和Web頁(yè)、在客戶端對(duì)數(shù)據(jù)進(jìn)行處然后將更新結(jié)果返回服務(wù)器的操作。
Delphi 6.0繼續(xù)對(duì)Microsoft的ADO訪問能力的支持。這種能力是通過(guò)一組新組件實(shí)現(xiàn)的,這些組件是在企業(yè)版的ADO組件頁(yè)中,在組件面版的ADO頁(yè)上可以找到這些組件。利用在前面章節(jié)提到的TdataSet抽象類,ADO組件可以不通過(guò)BDE而直接實(shí)現(xiàn)ADO連接。這意味著只需要很少的代碼就可以實(shí)現(xiàn)該連接并且性能得到提高。
利用ADO數(shù)據(jù)訪問組件,可以只使用ADO結(jié)構(gòu)與數(shù)據(jù)庫(kù)取得聯(lián)系并對(duì)其中的數(shù)據(jù)進(jìn)行操作,而在這些過(guò)程中完全不需要使用BDE。大多數(shù)的ADO連接和數(shù)據(jù)集組件都是與基于BDE的連接和數(shù)據(jù)集組件相類似的。TADOConnection組件與基于BDE的應(yīng)用程序中的Tdatabase組件類似。TADOTable與Ttable,TADOQuery與Tquery,以及TADOStoreProc和TstoredProc之間都具有這種類似的對(duì)應(yīng)關(guān)系。使用這些ADO組件的方式與我們常使用的數(shù)據(jù)訪問組件(基于BDE)都有許多相同之處。TTADODataSet沒有直接的BDE對(duì)應(yīng)組件,但它提供了許多與Ttable和Tquery相同的功能。同樣,TADOCommand也沒有相對(duì)應(yīng)的BDE組件,它是在Delphi/ADO環(huán)境中完成特定功能的組件。Delphi 6.0通過(guò)ADO數(shù)據(jù)集訪問組件,可以不借助BDE數(shù)據(jù)引擎而是通過(guò)微軟的OLEDB來(lái)訪問更為廣泛的數(shù)據(jù)庫(kù)中的數(shù)據(jù)。ADO數(shù)據(jù)集訪問組件與常用的數(shù)據(jù)訪問組件是并列的關(guān)系。
在系統(tǒng)中我主要使用的是ADOTablet和ADOQuery兩個(gè)組件。
3.2.2 數(shù)據(jù)控制類DataControl
數(shù)據(jù)控制類負(fù)責(zé)數(shù)據(jù)庫(kù)數(shù)據(jù)的顯示,并把用戶對(duì)數(shù)據(jù)的修改傳回。這里的絕大多數(shù)組件,如DBText, DBEdit, DBMemo, DBImage, DBListBox, DBComboBox, DBCheckBox, DBRadioGroup, DBLookupListBox, DBLookupCombox, DBCtrGrid的功能和對(duì)應(yīng)的非數(shù)據(jù)感知組件相同,如TEdit框,TRadioGroups單選按鈕組等,只不過(guò)在顯示數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí)要用而已。
在系統(tǒng)中主要使用數(shù)據(jù)網(wǎng)格控件DBGrid和數(shù)據(jù)庫(kù)導(dǎo)航器控件DBNavigator。
3.2.3 數(shù)據(jù)訪問類DataAccess
數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中數(shù)據(jù)訪問是一個(gè)首要問題,包括單用戶和 C/S系統(tǒng),都必須聯(lián)系一些數(shù)據(jù)庫(kù)和數(shù)據(jù)表文件。Delphi 6 提供了專門用于數(shù)據(jù)訪問的基類控件。主要包括數(shù)據(jù)源控件DataSource、客戶數(shù)據(jù)集控件ClientDataSet、數(shù)據(jù)集提供器控件DataSetProvider等等。
Tdatabase:當(dāng)一個(gè)基于BDE的數(shù)據(jù)庫(kù)應(yīng)用程序需要一個(gè)永久數(shù)據(jù)庫(kù)連接時(shí),需要定制向一個(gè)數(shù)據(jù)庫(kù)服務(wù)器的連接時(shí),需要事務(wù)控制和特殊的數(shù)據(jù)庫(kù)別名時(shí)就得用到Tdatabase對(duì)象。特別是當(dāng)連接到一個(gè)遠(yuǎn)程的SQL數(shù)據(jù)庫(kù)服務(wù)器時(shí),如果要利用BDE進(jìn)行數(shù)據(jù)庫(kù)事務(wù)處理,那么,TDatabase對(duì)象的威力就體現(xiàn)出來(lái)了。在一個(gè)應(yīng)用程序中為每一個(gè)數(shù)據(jù)庫(kù)連接顯示的聲明Tdatabase對(duì)象要根據(jù)需要而定,不是必需的。對(duì)一個(gè)數(shù)據(jù)庫(kù)連接,如果沒有顯示的聲明并實(shí)例化TDatabase對(duì)象,系統(tǒng)就會(huì)產(chǎn)生一個(gè)帶有默認(rèn)屬性的TDatabase對(duì)象。
TdataSource對(duì)象用于在DataSet對(duì)象(包括Tquery,TstoredProc,Ttable等)和數(shù)據(jù)感知組件之間提供一個(gè)連接的紐帶,以便在窗體上顯示數(shù)據(jù)庫(kù)中的數(shù)據(jù),在數(shù)據(jù)庫(kù)中導(dǎo)航定位與編輯數(shù)據(jù)集中的數(shù)據(jù)。如果一個(gè)DataSet對(duì)象中的數(shù)據(jù)想在數(shù)據(jù)感知組件中顯示和修改,它就必須和TdataSource對(duì)象相聯(lián)系。同樣,一個(gè)數(shù)據(jù)感知組件如果想和數(shù)據(jù)源相聯(lián)系以便顯示和操縱數(shù)據(jù),就必須以TDataSource對(duì)象為中介。
用Delphi6作數(shù)據(jù)庫(kù)應(yīng)用開發(fā)概括來(lái)說(shuō)如下:先利用數(shù)據(jù)存取組件和實(shí)際的數(shù)據(jù)庫(kù)建立連接,并用Tsession對(duì)象和Tdatabase對(duì)象管理這些連接。然后以Tdatasource對(duì)象為中介,用數(shù)據(jù)感知組件向用戶顯示數(shù)據(jù)庫(kù)的內(nèi)容并接受用戶的查詢和修改等操作。
3.2.4 SQL語(yǔ)言在Delphi中的應(yīng)用
在Delphi中使用SQL語(yǔ)言非常方便,一般來(lái)說(shuō),都是通過(guò)Tquery組件來(lái)使用SQL語(yǔ)言的。可以在TQuery組件的SQL屬性中設(shè)置SQL語(yǔ)句。設(shè)計(jì)程序時(shí),在該組件的屬性對(duì)話框中選擇SQL屬性,單擊帶省略號(hào)的按鈕,就可以打開String List Editor對(duì)話框,然后我們就可以在對(duì)話框中添加SQL語(yǔ)句。還可以使用Delphi的SQL Builder來(lái)自動(dòng)生成SQL語(yǔ)句,這樣可以避免手工編寫SQL而可能造成的語(yǔ)法錯(cuò)誤。
靜態(tài)SQL語(yǔ)句在程序設(shè)計(jì)時(shí)便已固定下來(lái),它不包含任何參數(shù)和變量。
動(dòng)態(tài)SQL語(yǔ)句,也被稱作參數(shù)化的語(yǔ)句,在其中間包含著表示字段名或表名的參數(shù),例如下面的語(yǔ)句是一條動(dòng)態(tài)SQL語(yǔ)句:
Select * From Students Where StudentCode =: StudentCode;
其中的變量StudentCode便是一個(gè)參數(shù)變量,它由一個(gè)冒號(hào)引導(dǎo),在程序運(yùn)行過(guò)程中,必須要為該參數(shù)賦值,該條SQL語(yǔ)句才能正確執(zhí)行,每次運(yùn)行應(yīng)用程序時(shí)可以為該參數(shù)變量賦予不同的值。為參數(shù)賦值有三種方法:
①根據(jù)參數(shù)在SQL語(yǔ)句中出現(xiàn)的順序,設(shè)置TQuery部件的Params屬性值為參數(shù)賦值。
②直接根據(jù)SQL語(yǔ)句中各參數(shù)的名字,調(diào)用ParamByName方法來(lái)為各參數(shù)賦值。
③將TQuery部件的DataSource屬性設(shè)置為另一個(gè)數(shù)據(jù)源,這樣將另一個(gè)數(shù)據(jù)源中與當(dāng)前TQuery部件的SQL語(yǔ)句中的參數(shù)名相匹配的字段值賦給其對(duì)應(yīng)的參數(shù)。利用這種方法也能實(shí)現(xiàn)所謂的連接查詢,創(chuàng)建主要—明細(xì)型數(shù)據(jù)庫(kù)應(yīng)用。
在程序運(yùn)行過(guò)程中,要想設(shè)置TQuery部件的SQL屬性,必須首先調(diào)用Close方法,關(guān)閉TQuery部件,然后再調(diào)用Clear方法清除SQL屬性中現(xiàn)存的SQL命令語(yǔ)句, 最后再調(diào)用Add方法為SQL屬性設(shè)置新的SQL命令語(yǔ)句。例如:
Query1.Close {關(guān)閉Query1)
Query1.SQL.Clear {清除SQL屬性中的SQL命令語(yǔ)句}
Query1.SQL.Add(‘Select * From Students‘);
Query1.SQL.Add(‘ Where Name ="Lucy" ‘);
在為TQuery部件設(shè)置SQL屬性時(shí)調(diào)用Close方法總是很安全的,如果TQuery部件已經(jīng)被關(guān)閉了,調(diào)用Close方法時(shí)不會(huì)產(chǎn)生任何影響。在應(yīng)用程序中為SQL屬性設(shè)置新的SQL 命令語(yǔ)句時(shí),必須要調(diào)用Clear方法以清除SQL屬性中現(xiàn)存的SQL命令語(yǔ)句,如果不調(diào)用Clear方法,便調(diào)用Add方法向SQL屬性中設(shè)置SQL命令語(yǔ)句,那么新設(shè)置的SQL命令語(yǔ)句會(huì)追加在現(xiàn)存SQL命令語(yǔ)句后面, 在程序運(yùn)行時(shí)常常會(huì)出現(xiàn)出乎意料的查詢結(jié)果甚至程序無(wú)法運(yùn)行下去。
在這里要特別注意的,一般情況下TQuery部件的SQL屬性只能包含一條完整的SQL語(yǔ)句,它不允許被設(shè)置成多條SQL語(yǔ)句。當(dāng)然有些數(shù)據(jù)庫(kù)服務(wù)器也支持在TQuery部件的SQL屬性中設(shè)置多條SQL語(yǔ)句,只要數(shù)據(jù)庫(kù)服務(wù)器允許這樣,我們?cè)诰幊虝r(shí)可以為 SQL 屬性設(shè)置多條SQL語(yǔ)句。
在為TQuery部件設(shè)置完SQL屬性的屬性值之后,也即編寫好適當(dāng)?shù)腟QL程序之后,可以有多種方式來(lái)執(zhí)行SQL程序。
在設(shè)計(jì)過(guò)程中,設(shè)置完TQuery部件的SQL屬性之后將其Active屬性的值置為True, 這樣便可以執(zhí)行SQL屬性中的SQL程序,如果應(yīng)用中有與TQuery部件相連的數(shù)據(jù)瀏覽部件( 如TDDGrid TDBEdit等)那么在這些數(shù)據(jù)瀏覽部件中會(huì)顯示SQL程序的執(zhí)行結(jié)果。
在應(yīng)用程序運(yùn)行過(guò)程中,通過(guò)程序調(diào)用TQuery部件的Open方法或ExecSQL 方法可以執(zhí)行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。Open方法只能用來(lái)執(zhí)行SQL語(yǔ)言的查詢語(yǔ)句(Select命令), 并返回一個(gè)查詢結(jié)果集,而ExecSQL方法還可以用來(lái)執(zhí)行其它常用的SQL語(yǔ)句(如INSERT, UPDATE, DELETE等命令),例如:
Query1.Open (這樣會(huì)返回一個(gè)查詢結(jié)果集)
如果調(diào)用Open方法,而沒有查詢結(jié)果時(shí),會(huì)出錯(cuò)。此時(shí)應(yīng)該調(diào)用ExecSQL 方法來(lái)代替Open方法。如:
Query1.ExecSQL (沒有返回結(jié)果)
當(dāng)然在設(shè)計(jì)應(yīng)用程序時(shí),程序設(shè)計(jì)人員是無(wú)法確定TQuery部件中的SQL 語(yǔ)句是否會(huì)返回一個(gè)查詢結(jié)果的。對(duì)于這種情況應(yīng)當(dāng)用Try…Except模塊來(lái)設(shè)計(jì)程序。在 Try 部分調(diào)用Open方法,而在Except部分調(diào)用ExceSQL方法,這樣才能保證程序的正確運(yùn)行。
Delphi中用ADOQuery來(lái)使用SQL語(yǔ)句同樣十分方便。在ADOQuery組件中首先通過(guò)ConnectionString屬性值來(lái)聯(lián)接數(shù)據(jù)源,然后就通過(guò)雙擊SQL…屬性值來(lái)寫入SQL語(yǔ)句。在Delphi中調(diào)用數(shù)據(jù)庫(kù),就可以調(diào)用ADOQuery組件,通過(guò)修改其中的SQL…屬性中的SQL語(yǔ)句來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各項(xiàng)操作。
值得注意的是,ADOQuery組件只有在激活的情況下才可以被正確地使用,這樣就提出了一個(gè)問題,也就是說(shuō),在每次修改ADOQuery組件的SQL…屬性時(shí)都必須先行進(jìn)行關(guān)閉,待清除掉SQL…中所有的SQL語(yǔ)句后才可以添加新的SQL語(yǔ)句。而且,在每一次修改完成以后,還應(yīng)該記得重新將ADOQuery激活。其它的使用方法與TTQuery有許多的相似之處。
§3.3 Access 簡(jiǎn)介
建立一個(gè)數(shù)據(jù)庫(kù)我們有多種選擇,現(xiàn)在市場(chǎng)上有各種各樣的數(shù)據(jù)庫(kù),而且每一種數(shù)據(jù)庫(kù)都有其自身的特點(diǎn),不能說(shuō)哪一種更好,只能在其中尋找一種能更好地適應(yīng)系統(tǒng)需求、更好地滿足用戶的要求以及適應(yīng)開發(fā)人員的習(xí)慣。在本系統(tǒng)中,做為圖書倉(cāng)庫(kù)管理系統(tǒng)是一個(gè)比較小的應(yīng)用系統(tǒng),它所產(chǎn)生和處理的數(shù)據(jù)量也比較小。因此,沒有必要使用像SQL Server和Oracle這樣的大型數(shù)據(jù)庫(kù)。我首先想到的數(shù)據(jù)庫(kù)是Borland公司的Paradox數(shù)據(jù)庫(kù)。另外,Microsoft Office中的Access數(shù)據(jù)庫(kù)在計(jì)算機(jī)上的應(yīng)用比較普及,是開發(fā)小型數(shù)據(jù)庫(kù)系統(tǒng)的比較理想的選擇,所以,在本系統(tǒng)中我選擇了Access數(shù)據(jù)庫(kù)。
Access做為一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng),它被集成在Microsoft Office中。Access數(shù)據(jù)庫(kù)處理的基本結(jié)構(gòu),采取關(guān)系型數(shù)據(jù)庫(kù)模式。與其他的數(shù)據(jù)庫(kù)系統(tǒng)相比,Access更加簡(jiǎn)單易學(xué),一個(gè)普通的計(jì)算機(jī)用戶可以很快地掌握它。Access 2000的功能十分強(qiáng)大,利用它可以方便地實(shí)現(xiàn)對(duì)信息保存、維護(hù)、查詢、統(tǒng)計(jì)、打印、交流、,而且它可以十分方便地與Office其他組件交流數(shù)據(jù),這些功能對(duì)一個(gè)一般用戶而言已經(jīng)足夠了。
轉(zhuǎn)貼于 第四章 系統(tǒng)總體設(shè)計(jì)
軟件系統(tǒng)的總體設(shè)計(jì)大約要經(jīng)歷可行性分析和項(xiàng)目開發(fā)計(jì)劃,需求分析,概要設(shè)計(jì),詳細(xì)設(shè)計(jì),編碼,測(cè)試以及維護(hù)等七個(gè)階段??尚行苑治龊晚?xiàng)目開發(fā)計(jì)劃在前面已經(jīng)敘述,下面所要做的是進(jìn)行軟件需求分析,概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)。編碼過(guò)程將在下一節(jié)論述,而測(cè)試和維護(hù)過(guò)程不在本文敘及。
§4.1 系統(tǒng)需求分析
在經(jīng)過(guò)前一階段的分析之后,我確定了我的開發(fā)課題為圖書倉(cāng)庫(kù)管理?,F(xiàn)在所要做的是要準(zhǔn)確定義系統(tǒng)必須做什么以及系統(tǒng)必須具備的功能。
軟件需求分析中我采用結(jié)構(gòu)化分析方法(Structured Analysis,簡(jiǎn)稱SA),SA是面向數(shù)據(jù)流進(jìn)行需求分析的方法,像所有的軟件分析方法(如面向?qū)ο蠓治龇椒āDEF方法等等)一樣,SA也是一種建?;顒?dòng),它使用簡(jiǎn)單易讀的符號(hào),根據(jù)軟件內(nèi)部數(shù)據(jù)傳遞、變換的關(guān)系,自頂向下逐層分解,描繪滿足功能要求的軟件模型。
在系統(tǒng)中我采用數(shù)據(jù)流圖(DFD)這種半形式化的描述方式表達(dá)需求。它是一種功能模型,以圖形的方式描繪數(shù)據(jù)在系統(tǒng)中流動(dòng)和處理的過(guò)程,只反映系統(tǒng)必須完成的邏輯功能。它有四種基本圖形符號(hào):
:箭頭,表示數(shù)據(jù)流;
〇:圓或橢圓,表示加工;
:雙杠,表示數(shù)據(jù)存儲(chǔ);
:方框,表示數(shù)據(jù)的源點(diǎn)或終點(diǎn)。
為了表達(dá)較為復(fù)雜問題的數(shù)據(jù)處理過(guò)程,用一張數(shù)據(jù)流圖是不夠的,要按照問題的層次結(jié)構(gòu)進(jìn)行逐步分解,并以一套分層的數(shù)據(jù)流圖反映這種結(jié)構(gòu)關(guān)系。在這里我一共使用了三層數(shù)據(jù)流圖,即頂層圖,0層圖和1層圖(也是底層圖)。
在多層數(shù)據(jù)流圖中,頂層流圖僅包含一個(gè)加工,它代表被開發(fā)系統(tǒng),它的輸入流是該系統(tǒng)的輸入數(shù)據(jù)了,輸出流是該系統(tǒng)的輸出數(shù)據(jù);底層流圖是指其加工不需要再做分解的數(shù)據(jù)流圖,中間層流圖表示對(duì)其上層父圖的細(xì)化,它的每一步加工可能繼續(xù)細(xì)化成子圖。
經(jīng)過(guò)對(duì)系統(tǒng)的分析首先得到系統(tǒng)的頂層DFD,如下: 一步細(xì)化得到系統(tǒng)的0層DFD,如下:
再進(jìn)一步細(xì)化每一個(gè)數(shù)據(jù)加工功能,得到系統(tǒng)的1層DFD圖。
在這里只給出有關(guān)入庫(kù)管理和出庫(kù)管理的1層數(shù)據(jù)流圖,它們是系統(tǒng)的關(guān)鍵部分,也是主要的部分。通過(guò)以上對(duì)數(shù)據(jù)流圖的分析之后,我們已大體地了解了系統(tǒng)的功能和目標(biāo),接下來(lái)所要做的就是系統(tǒng)功能模塊的劃分和數(shù)據(jù)庫(kù)的設(shè)計(jì),也就是系統(tǒng)的概要設(shè)計(jì)。
§4.2 系統(tǒng)概要設(shè)計(jì)
在軟件需求分析階段,搞清楚了軟件“做什么”的問題,形成了目標(biāo)系統(tǒng)的邏輯模型?,F(xiàn)在我們所要做的就是要把軟件“做什么”的邏輯模型變換為“怎么做”的物理模型,即著手實(shí)現(xiàn)軟件的需求。首先,我們需要描述的是系統(tǒng)的總的體系結(jié)構(gòu)。
4.2.1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)
系統(tǒng)的概要設(shè)計(jì)中最重要的就是系統(tǒng)的模塊化。模塊化是指解決一個(gè)復(fù)雜問題時(shí)自項(xiàng)向下逐層把軟件系統(tǒng)劃分成若干個(gè)模塊的過(guò)程。每個(gè)模塊完成一個(gè)特定的功能,所有的模塊按某種方法組織起來(lái),成為一個(gè)整體,完成整個(gè)系統(tǒng)所要求的功能。
將系統(tǒng)劃分為多個(gè)模塊是為了降低軟件系統(tǒng)的復(fù)雜性,提高可讀性、可維護(hù)性,但模塊的劃分不能是任意的,應(yīng)盡量保持其獨(dú)立性。也就是說(shuō),每個(gè)模塊只完成系統(tǒng)要求的獨(dú)立的子功能,并且與其他模塊的聯(lián)系最少且接口簡(jiǎn)單,即盡量做到高內(nèi)聚低耦合,提高模塊的獨(dú)立性,為設(shè)計(jì)高質(zhì)量的軟件結(jié)構(gòu)奠定基礎(chǔ)。
在系統(tǒng)的概要設(shè)計(jì)中我采用結(jié)構(gòu)化設(shè)計(jì)(Structure Design,簡(jiǎn)稱SD),SD以需求分析階段產(chǎn)生的數(shù)據(jù)流圖DFD為基礎(chǔ),按一定的步驟映射成軟件結(jié)構(gòu)。我首先將整個(gè)系統(tǒng)化分為幾個(gè)小問題,小模塊,在系統(tǒng)中,我設(shè)計(jì)了用戶管理、庫(kù)存管理、入庫(kù)管理、出庫(kù)管理、員工管理和供應(yīng)商管理6個(gè)小模塊。然后,進(jìn)一步細(xì)分模塊,添加細(xì)節(jié)。比如,用戶管理我又將其分為用戶注冊(cè)、用戶注銷、密碼修改;庫(kù)存管理分為庫(kù)存記錄查詢、庫(kù)存記錄修改、庫(kù)存記錄打印等等。
以下就是系統(tǒng)的結(jié)構(gòu)圖:(在這里為了表達(dá)方便我將結(jié)構(gòu)圖分開來(lái)表達(dá)。)
在得到系統(tǒng)的第一層功能模塊圖后,經(jīng)過(guò)進(jìn)一步地細(xì)化,得一系統(tǒng)的子功能模塊圖:
4.2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
在信息世界中,信息從客觀事物出發(fā)流經(jīng)數(shù)據(jù)庫(kù),通過(guò)決策機(jī)構(gòu)最后又回到客觀世界,信息的這一循環(huán)經(jīng)歷了三個(gè)領(lǐng)域:信息世界,數(shù)據(jù)世界,現(xiàn)實(shí)世界。現(xiàn)實(shí)世界的事物反映到人的頭腦中,人的大腦對(duì)它有個(gè)認(rèn)識(shí)過(guò)程,經(jīng)過(guò)分析(選擇、命名、分類等)進(jìn)入信息世界。這些信息再進(jìn)一步加工、編碼,然后進(jìn)數(shù)據(jù)世界,而軟件系統(tǒng)的開發(fā)工作需要考慮這兩個(gè)方面的問題,也就是要考慮系統(tǒng)開發(fā)所需要的數(shù)據(jù),以及如何對(duì)這些數(shù)據(jù)進(jìn)行操作。這兩個(gè)問題貫穿了整個(gè)軟件系統(tǒng)的開發(fā)過(guò)程,這也就是數(shù)據(jù)庫(kù)的設(shè)計(jì)問題,軟件設(shè)計(jì)的一個(gè)核心。
4.2.2.1 ER圖設(shè)計(jì)
在系統(tǒng)設(shè)計(jì)的開始,我首先考慮的是如何用數(shù)據(jù)模型來(lái)數(shù)據(jù)庫(kù)的結(jié)構(gòu)與語(yǔ)義,以對(duì)現(xiàn)實(shí)世界進(jìn)行抽象。目前廣泛使用的數(shù)據(jù)模型可分為兩種類型,一種是獨(dú)立于計(jì)算機(jī)系統(tǒng)的“概念數(shù)據(jù)模型”,如“實(shí)體聯(lián)系模型”;另一種是直接面向數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)的“結(jié)構(gòu)數(shù)據(jù)模型”。在本系統(tǒng)中我采用“實(shí)體聯(lián)系模型”(ER模型)來(lái)描述數(shù)據(jù)庫(kù)的結(jié)構(gòu)與語(yǔ)義,以對(duì)現(xiàn)實(shí)世界進(jìn)行第一次抽象。ER模型直接從現(xiàn)實(shí)世界抽象出實(shí)體類型及實(shí)體間聯(lián)系,然后用ER圖來(lái)表示數(shù)據(jù)模型。它有兩個(gè)明顯的優(yōu)點(diǎn):接近于人的思維,容易理解;與計(jì)算機(jī)無(wú)關(guān),用戶容易接受。但ER模型只能說(shuō)明實(shí)體間語(yǔ)義的聯(lián)系,不能進(jìn)一步說(shuō)明詳細(xì)的數(shù)據(jù)結(jié)構(gòu),它只是數(shù)據(jù)庫(kù)設(shè)計(jì)的第一步。
ER圖是直觀表示概念模型的工具,它有四個(gè)基本成分:
矩形框,表示實(shí)體類型(考慮問題的對(duì)象)。
菱形框,表示聯(lián)系類型(實(shí)體間的聯(lián)系)。
橢圓形框,表示實(shí)體類型和聯(lián)系類型的屬性。對(duì)于關(guān)鍵碼的屬性,在屬性名下劃一橫線。
直線,聯(lián)系類型與其涉及的實(shí)體類型之間以直線連接。
本系統(tǒng)為圖書倉(cāng)庫(kù)管理,主要管理圖書的入庫(kù)、出庫(kù)以及庫(kù)存等事項(xiàng)。倉(cāng)庫(kù)根據(jù)需要可以查詢圖書供應(yīng)商的信息,同時(shí)還需要了解在入庫(kù)和出庫(kù)中員工的參與情況。依據(jù)倉(cāng)庫(kù)管理的實(shí)際情況,考慮了多方面的因素以后,確定系統(tǒng)的ER圖如下:
(為了表達(dá)的方便,在這里我沒有在一張圖上表達(dá)出所有的關(guān)系,而是用一張總體ER圖,和幾張實(shí)體屬性關(guān)系圖來(lái)表達(dá)數(shù)據(jù)庫(kù)的結(jié)構(gòu)。)
在該數(shù)據(jù)庫(kù)中,我設(shè)計(jì)了三個(gè)實(shí)體,分別是庫(kù)存、員工和供應(yīng)商以及兩個(gè)聯(lián)系類型入庫(kù)和出庫(kù)。在本系統(tǒng)中庫(kù)存是核心,也是基本,沒有了庫(kù)存其它的也就沒有什么意義了。員工記錄的添加是考慮到責(zé)任問題,也就是說(shuō),在倉(cāng)庫(kù)管理的實(shí)際運(yùn)用中,出現(xiàn)了責(zé)任不清的現(xiàn)象,特別是由于倉(cāng)庫(kù)的進(jìn)出圖書數(shù)量都比較大時(shí)產(chǎn)生了一系列問題,所以在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),我特別考慮到這一點(diǎn),加入了員工記錄這一實(shí)體。供應(yīng)商信息的添加主要出于對(duì)圖書來(lái)源問題的思考。通過(guò)添加供應(yīng)商信息可以比較清楚地了解圖書的進(jìn)貨渠道,從圖書的質(zhì)量到供應(yīng)商的信譽(yù)都可以進(jìn)行了解,同時(shí)可以為以后的圖書進(jìn)購(gòu)提供一定有用的信息。
入庫(kù)聯(lián)系類型將庫(kù)存信息、供應(yīng)商信息和員工信息聯(lián)系在一起,可以方便地實(shí)現(xiàn)三個(gè)實(shí)體之間的聯(lián)接,而出庫(kù)聯(lián)系類型則將庫(kù)存信息和員工信息較好地聯(lián)接起,同時(shí)這兩個(gè)聯(lián)系類型又都具有各自特有的屬性。
下面就是各實(shí)體及聯(lián)系類型的屬性圖:(帶#號(hào)的屬性為關(guān)鍵字段)4.2.2.2 數(shù)據(jù)庫(kù)表格設(shè)計(jì)
在完成系統(tǒng)的ER圖之后,需要將ER模型轉(zhuǎn)化為關(guān)系模型,也就是說(shuō),要設(shè)計(jì)出數(shù)據(jù)庫(kù)所需要的表格。在這里,我選用的是關(guān)系數(shù)據(jù)庫(kù)。因?yàn)殛P(guān)系數(shù)據(jù)庫(kù)中的二維表格可以很清楚地描述數(shù)據(jù)之間的聯(lián)系。
在這里不得不提到一個(gè)概念——范式。其實(shí)在上一節(jié)的ER圖設(shè)計(jì)中,已經(jīng)運(yùn)用了范式的思想,不僅如此,在數(shù)據(jù)庫(kù)的表格設(shè)計(jì)中更離不開范式的思想,它是數(shù)據(jù)庫(kù)設(shè)計(jì)的基礎(chǔ),如果不注意這個(gè)問題將會(huì)導(dǎo)致一系列問題的出現(xiàn)。
我在系統(tǒng)中定義的表格都嚴(yán)格地按照范式的思想和要求去完成,數(shù)據(jù)庫(kù)中的所有表格都達(dá)到了三范式的要求。根據(jù)系統(tǒng)ER圖,針對(duì)本系統(tǒng)的特點(diǎn),在對(duì)所搜集的數(shù)據(jù)進(jìn)行規(guī)范化之后,定義了如下六張表格,分別是庫(kù)存信息表,入庫(kù)信息表,出庫(kù)信息表,員工信息表,供應(yīng)商信息表和密碼信息表。通過(guò)對(duì)這六張表格的操作可以較好地完成系統(tǒng)設(shè)計(jì)的各項(xiàng)功能,六張表格之間有著不同程度的聯(lián)系。(說(shuō)明:在以下數(shù)據(jù)表中,K代表主鍵,#代表外鍵,字段值不為空。)
BookRecord 表(庫(kù)存信息表)
字段名稱 數(shù)據(jù)類型 說(shuō)明
K BookID 數(shù)字 圖書編號(hào)
BookName 文本 圖書名
Author 文本 作者
Publisher 文本 出版社
PubDate 日期/時(shí)間 出版日期
Price 貨幣 價(jià)格
BookType 文本 圖書類型
Number1 數(shù)字 庫(kù)存數(shù)量
Addation 文本 備注
圖4.13 庫(kù)存信息表
庫(kù)存信息表主要用于記錄倉(cāng)庫(kù)中現(xiàn)存放的所有圖書的詳細(xì)信息,包括圖書編號(hào)、書名、作者、出版社、圖書類型等有關(guān)圖書的各類信息,它即是該數(shù)據(jù)庫(kù)的主表,也是系統(tǒng)主界面的主要內(nèi)容。
在該表中圖書編號(hào)是主鍵,它按圖書入庫(kù)的先后次序來(lái)編寫,每當(dāng)有圖書入庫(kù),系統(tǒng)自動(dòng)給出圖書編號(hào),這樣我們按圖書編號(hào)來(lái)查找圖書是比較方便的??紤]到編號(hào)比較難于記憶,所以使用了出版社和圖書類型兩個(gè)字段,在系統(tǒng)中我提供了出版社和圖書類型的分類查找,而且全部采用自動(dòng)生成,每當(dāng)系統(tǒng)中有新的出版社類型和圖書類型,彈出菜單會(huì)自動(dòng)添中新類型,這樣就可以比較方便地實(shí)現(xiàn)按出版社和按圖書類型查找。此外,庫(kù)存數(shù)量也是一個(gè)比較關(guān)鍵的字段,該字段是在系統(tǒng)初始化時(shí)就給定的,每當(dāng)有圖書入庫(kù)或出庫(kù)操作,系統(tǒng)就會(huì)自動(dòng)修改圖書的庫(kù)存數(shù)量,以保持?jǐn)?shù)據(jù)的一致性。做為備注有一點(diǎn)說(shuō)明,我的數(shù)據(jù)庫(kù)中備注的數(shù)據(jù)類型是文本,而不是備注類型,主要考慮到該字段的長(zhǎng)度并不大,而且在Delphi中文本數(shù)據(jù)類型的處理也比較方便一點(diǎn)。
Employee 表(員工信息表)
字段名稱 數(shù)據(jù)類型 說(shuō)明
K EmployeeID 數(shù)字 員工編號(hào)
EmployeeName 文本 員工姓名
Sex 文本 性別
BornDate 日期/時(shí)間 出生日期
Grade 文本 職稱
WorkDate 日期/時(shí)間 工作日期
Telephone 文本 聯(lián)系電話
Address 文本 聯(lián)系地址
圖4.14 員工信息表
員工信息表主要用于記錄有關(guān)員工的各類信息,包括姓名、職稱、出生日期、聯(lián)系電話、聯(lián)系地址等。它主要用來(lái)為系統(tǒng)提供員工的有關(guān)信息,因?yàn)樵谙到y(tǒng)中,入庫(kù)和出庫(kù)操作均與員工有著一定的聯(lián)系,在查詢?nèi)霂?kù)信息和出庫(kù)信息時(shí),有時(shí)需要查找有關(guān)此項(xiàng)記錄有關(guān)的員工信息,在系統(tǒng)中我是通過(guò)入庫(kù)記錄與員工記錄(出庫(kù)記錄和員工記錄)之間的聯(lián)接查詢來(lái)完成的。另外,作為一個(gè)倉(cāng)庫(kù)也有必要了解其所屬員工的一些基本情況,以便查詢。
Shopkeeper 表(供應(yīng)商信息表)
字段名稱 數(shù)據(jù)類型 說(shuō)明
K ShopkeeperID 數(shù)字 供應(yīng)商編號(hào)
ShopkeeperName 文本 供應(yīng)商姓名
Address 文本 地址
PostNo 數(shù)字 郵編
OfficePhone 文本 辦公電話
HomePhone 文本 住宅電話
Email 文本 E-mail
PayType 文本 付款方式
圖4.15 供應(yīng)商信息表
供應(yīng)商信息表主要用于記錄有關(guān)供應(yīng)商的各類信息,包括姓名、地址、電話、付款方式等。它主要用來(lái)為系統(tǒng)提供供應(yīng)商的有關(guān)信息,在系統(tǒng)中入庫(kù)記錄是與供應(yīng)商記錄相聯(lián)系的,通過(guò)入庫(kù)記錄可以查找相關(guān)的供應(yīng)商信息。在供應(yīng)商信息中,考慮當(dāng)實(shí)際情況,我特別加入了Email和付款方式這兩個(gè)字段,因?yàn)樵诋?dāng)今信息世界中,多種多樣的通訊方式和多種多樣的付款方式是必然的,是數(shù)據(jù)庫(kù)中必須與以記錄。
InRecord 表(入庫(kù)信息表)
字段名稱 數(shù)據(jù)類型 說(shuō)明
K InID 數(shù)字 入庫(kù)編號(hào)
# BookID 數(shù)字 圖書編號(hào)
# EmployeeID 數(shù)字 員工編號(hào)
# ShopkeeperID 數(shù)字 供應(yīng)商編號(hào)
Number 數(shù)字 入庫(kù)數(shù)量
BuyDate 日期/時(shí)間 入庫(kù)日期
圖4.16 入庫(kù)信息表
OutRecord 表(出庫(kù)信息表)
字段名稱 數(shù)據(jù)類型 說(shuō)明
K OutID 數(shù)字 出庫(kù)編號(hào)
# BookID 數(shù)字 圖書編號(hào)
# EmployeeID 數(shù)字 員工編號(hào)
Number2 數(shù)字 出庫(kù)數(shù)量
OutDate 日期/時(shí)間 出庫(kù)日期
圖4.17 出庫(kù)信息表
入庫(kù)信息表主要用于記錄有關(guān)入庫(kù)的詳細(xì)信息,包括入庫(kù)數(shù)量、入庫(kù)日期以及圖書、員工、供應(yīng)商三方的編號(hào),以便查詢。出庫(kù)信息表主要用于記錄有關(guān)出庫(kù)的詳細(xì)信息,包括出庫(kù)數(shù)量、出庫(kù)日期以及圖書、員工的編號(hào)。出庫(kù)信息表和入庫(kù)信息表一樣,其實(shí)它們都屬于聯(lián)系類型,系統(tǒng)通過(guò)這兩個(gè)表可以聯(lián)接上其它的表為用戶提供多種條件的聯(lián)接查詢。值得提出的一點(diǎn)是入庫(kù)記錄和出庫(kù)記錄的添加不僅僅是單表操作,由于它們都與庫(kù)存記錄相聯(lián)系,所以,無(wú)論您是添中入庫(kù)記錄還是添加出庫(kù)記錄,都必須同時(shí)修改庫(kù)存記錄,以保持?jǐn)?shù)據(jù)的一致性,否則將引發(fā)系統(tǒng)出錯(cuò)而這些我都讓其在系統(tǒng)中自動(dòng)完成。無(wú)論您是添加入庫(kù)記錄,還是添加出庫(kù)記錄,系統(tǒng)都將自動(dòng)修改庫(kù)存中圖書的數(shù)量,而且,在您出庫(kù)的數(shù)量大于庫(kù)存數(shù)量時(shí),系統(tǒng)還會(huì)自動(dòng)提示錯(cuò)誤,這樣就可以防止一定錯(cuò)誤的發(fā)生。
在入庫(kù)信息表和出庫(kù)信息表中我還定義了幾個(gè)外鍵,它提供了一種表示幾個(gè)關(guān)系聯(lián)系的方法。比如,系統(tǒng)中通過(guò)在入庫(kù)信息表中定義的外鍵 BookID、EmployeeID和ShopkeeperID可以將庫(kù)存信息表、員工信息表和供應(yīng)商信息表聯(lián)系在一起,從而方便地實(shí)現(xiàn)聯(lián)接查詢,而且,引入外鍵的定義是實(shí)體完整性約束的一個(gè)主要方面。
Key 表(密碼信息表)
字段名稱 數(shù)據(jù)類型 說(shuō)明
K KeyName 文本 用戶姓名
KeyNo 文本 用戶密碼
圖4.18 密碼信息表
密碼信息表主要用于記錄所有的用戶名和用戶密碼。它是在用戶登陸時(shí)用來(lái)確定用戶和密碼的正確性,以防止非法用戶登陸。
通過(guò)以上設(shè)計(jì)已經(jīng)完成了系統(tǒng)的概要設(shè)計(jì),當(dāng)我們有了系統(tǒng)的功能模塊圖和數(shù)據(jù)庫(kù)之后,就需要著手去實(shí)現(xiàn)每一個(gè)模塊,為每一個(gè)功能設(shè)計(jì)程序流程圖,這也就是系統(tǒng)的詳細(xì)設(shè)計(jì)。
§4.3 系統(tǒng)詳細(xì)設(shè)計(jì)
在前面的概要設(shè)計(jì)中,已將系統(tǒng)劃分為多個(gè)模塊,并將它們按照一定的原則組裝起來(lái),同時(shí)確定了每個(gè)功能及模塊之間的外部接口?,F(xiàn)在所要做的就是確定每個(gè)模塊具體執(zhí)行過(guò)程,也可以說(shuō)是“過(guò)程設(shè)計(jì)”。
在處理過(guò)程設(shè)計(jì)時(shí)我采用的是結(jié)構(gòu)化程序設(shè)計(jì)(簡(jiǎn)稱SP)方法。需要指出的是系統(tǒng)的詳細(xì)設(shè)計(jì)并不是指具體的編程序,而是將概要設(shè)計(jì)階段產(chǎn)生的系統(tǒng)功能模塊圖細(xì)化成很容易產(chǎn)生程序的圖紙。因此詳細(xì)設(shè)計(jì)的結(jié)果基本決定了最終程序的質(zhì)量。為軟件的質(zhì)量,延長(zhǎng)軟件的生存期,軟件的可測(cè)試性、可維護(hù)性提供重要的保障。詳細(xì)設(shè)計(jì)的目標(biāo)不僅是邏輯上正確地實(shí)現(xiàn)每個(gè)模塊的功能,還應(yīng)使設(shè)計(jì)出的處理過(guò)程清晰易讀。
由前一階段產(chǎn)生的系統(tǒng)功能模塊圖,我為系統(tǒng)的主要部分設(shè)計(jì)了如下程序流程圖:通過(guò)以上步驟,基本上完成了對(duì)整個(gè)系統(tǒng)的總體設(shè)計(jì),接下來(lái)所要做的就是軟件的編碼工作。系統(tǒng)總體設(shè)計(jì)的好壞直接影響著下一步工作,只有在這一階段設(shè)計(jì)出好的模塊圖和程序流程圖,才能更有利于編碼,產(chǎn)生好的軟件系統(tǒng)。
第五章 系統(tǒng)應(yīng)用程序設(shè)計(jì)
§5.1 系統(tǒng)窗體模塊組成
§5.2 數(shù)據(jù)模塊窗體的設(shè)置
在編寫數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),經(jīng)常要遇到這樣的情況,即好多組件、窗體同時(shí)訪問相同的數(shù)據(jù)源,如果為每一個(gè)組件或者窗體都設(shè)置一個(gè)數(shù)據(jù)源將是十分耗時(shí)的工件,而且要保證這些數(shù)據(jù)源的確是相同的也需花一番功夫。那么,能不能將這些數(shù)據(jù)源集中管理,最好是做成一個(gè)統(tǒng)一的模塊,需要時(shí)就將該模塊引入而不必直接操作數(shù)據(jù)源本身呢?數(shù)據(jù)模塊(DataModule)是解決這個(gè)問題最好的答案。簡(jiǎn)單說(shuō)來(lái),數(shù)據(jù)模塊是用來(lái)集中管理數(shù)據(jù)源的一個(gè)窗體,該窗體可被需要的地方隨時(shí)引入。
圖5.2給出了本程序的數(shù)據(jù)模塊(datamoduleform)窗體圖,除報(bào)表窗體外所有的數(shù)據(jù)存取組件和數(shù)據(jù)源組件都在此數(shù)據(jù)模塊中進(jìn)行了定義。值得一提的是,設(shè)置了數(shù)據(jù)庫(kù)Database組件,該組件引入了系統(tǒng)所需的唯一的數(shù)據(jù)庫(kù)tsxs,Database組件的DatabaseName屬性設(shè)置為tsckgl。tsxs數(shù)據(jù)庫(kù)已在ODBC配置程序中進(jìn)行了設(shè)置。其他的數(shù)據(jù)存取組件都是基于此數(shù)據(jù)庫(kù)組件創(chuàng)建的,這樣做的好處是,當(dāng)數(shù)據(jù)庫(kù)的別名或者其他信息改變之后,只需修改Tdatabase組件的AliasName屬性即可。
另外,在本系統(tǒng)的數(shù)據(jù)模塊窗體圖中,我大多采用的AODQuery組件而沒有采用BDE組,這主要是基于對(duì)ADO組件的了解。在Delphi的學(xué)習(xí)中我對(duì)ADO組件了解的更加清楚,使用也較BDE更為熟練,而且,ADO組件的功能也較BDE更為強(qiáng)大,所以在這里大多采用ADO組件來(lái)進(jìn)行數(shù)據(jù)庫(kù)聯(lián)接。同時(shí)我也使用了BDE組件中的Table,因?yàn)樵谀承r(shí)候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,對(duì)BookRecord表進(jìn)行操作
close;
file://關(guān)閉MainQuery
SQL.Clear;
file://清除SQL屬性中的SQL命令語(yǔ)句
SQL.Add(‘select * from BookRecord where Publisher=:Pub‘); file://添加新的SQL語(yǔ)句
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個(gè)變量以方便實(shí)現(xiàn)模糊查詢
begin
file://主窗口庫(kù)存查詢按鈕事件
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語(yǔ)句來(lái)實(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(‘Author‘).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)于一個(gè)刷新功能
open;
end;end;
end;
**********************************************************************
procedure Tmainform.SpeedButton3Click(Sender: TObject);
begin
file://庫(kù)存表刷新按鈕事件
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://自動(dòng)生成快捷按鈕1的內(nèi)容
with datamoduleform.BookQuery do
begin
file://從數(shù)據(jù)庫(kù)中選擇出版社類型
close;
SQL.Clear;
SQL.Add(‘select distinct Publisher from BookRecord‘);
open;
PopupMenu1:=TPopupMenu.Create(Self); file://自動(dòng)生成快捷菜單
PopupMenu1.AutoHotkeys:=maManual;
file://自定義熱鍵
while Not Eof do
begin
file://根據(jù)出版社內(nèi)容生成菜單子項(xiàng)
PopupItem:=TMenuItem.Create(Self);
PopupItem.Caption:=FieldByName(‘Publisher‘).AsString;
PopupMenu1.Items.Add(PopupItem);
PopupItem.onClick:=Popup1Handler;
file://確定菜單子項(xiàng)的點(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í)自動(dòng)添加數(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)欄顯示時(shí)間
StatusBar1.Panels[2].Text:=DateToStr(Date);
StatusBar1.Panels[4].Text:=TimeToStr(Time);
end;
§5.4 入庫(kù)、出庫(kù)窗體模塊的實(shí)現(xiàn)
圖5.4 系統(tǒng)入庫(kù)管理窗體
圖5.5 系統(tǒng)出庫(kù)管理窗體
procedure Tinoutform.SpeedButton4Click(Sender: TObject);
begin
file://入庫(kù)管理查找按鈕事件
with datamoduleform.BookQuery do
file://入庫(kù)查詢處理
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[‘Author‘];
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[‘Addation‘]NULL
then Edit25.Text:=FieldValues[‘Addation‘]
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://自動(dòng)入庫(kù)編號(hào)的獲取
begin
close;
SQL.Clear;
SQL.Add(‘select * from InRecord where InID>=All(select InID from InRecord)‘);
open;
file://找到入庫(kù)編號(hào)中最大的一個(gè)
Edit26.ReadOnly:=false;
Edit26.Text:=FieldValues[‘InID‘]+1; file://最大的入庫(kù)編號(hào)加1形成新的入庫(kù)編號(hào)
Edit26.ReadOnly:=true;Edit26.Color:=clMenu; file://設(shè)置編號(hào)的不可更改性
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton1Click(Sender: TObject);
var s:integer;
begin
file://入庫(kù)管理添加按鈕事件
if Edit1.TextNULL
then MessageDlg(‘請(qǐng)輸入完整的入庫(kù)信息和圖書信息,然后單擊確定按鈕?!?,
mtInformation,[mbok],0)
else begin
if (Edit2.Text=‘‘) or (Edit3.Text=‘‘) or (Edit4.Text=‘‘) or (Edit5.Text=‘‘)
then begin
MessageDlg(‘請(qǐng)輸入完整的入庫(kù)信息!‘,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://向入庫(kù)信息表中插入記錄
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://計(jì)算入庫(kù)后庫(kù)存圖書數(shù)量
Edit12.Text:=IntToStr(s);
file://將修改后的庫(kù)存圖書數(shù)量顯示
Edit12.ReadOnly:=true;
with datamoduleform.BookQuery do
file://修改庫(kù)存記錄中圖書數(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語(yǔ)句
MessageDlg(‘記錄已成功添加!‘,mtInformation,[mbOK],0);
Edit13.SetFocus;
end;
end;
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton2Click(Sender: TObject);
begin
file://入庫(kù)管理確定按鈕事件
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(‘請(qǐng)輸入所需的全部入庫(kù)信息!‘,mtInformation,[mbok],0);
Edit2.SetFocus;
end
else
begin
with datamoduleform.InQuery do
file://入庫(kù)信息添加
begin
close;
SQL.Clear;
SQL.Add(‘insert into InRecord values(:InID,:BookID,:EmpID,:ShopID,
:Number,:InDate)‘);
file://向入庫(kù)信息表中插入記錄
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://在完成入庫(kù)信息的添加后,修改庫(kù)存記錄
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(‘Author‘).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(‘Addration‘).Value:=Edit25.Text;
execSQL;
end;
MessageDlg(‘記錄添加成功!‘,mtInformation,[mbok],0);
end;
end;
**********************************************************************
procedure Tinoutform.SpeedButton11Click(Sender: TObject);
begin
file://新書入庫(kù)按鈕事件
Edit13.Text:=‘‘;Edit13.Color:=clMenu;
with datamoduleform.InQuery do file://自動(dòng)入庫(kù)編號(hào)的獲取
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://自動(dòng)圖書編號(hào)的獲取
begin
close;
SQL.Clear;
SQL.Add(‘select * from BookRecord where BookID>=All(select BookID from BookRecord)‘);
file://找到庫(kù)存圖書編號(hào)中最大的一個(gè)
open;
Edit1.ReadOnly:=false;
Edit1.Text:=FieldValues[‘BookID‘]+1; file://顯示自動(dòng)生成的圖書編號(hào)
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://出庫(kù)管理確定按鈕事件
if (Edit24.Text=‘‘) or (Edit27.Text=‘‘) or (Edit28.Text=‘‘)
then begin
MessageDlg(‘請(qǐng)輸入完整的出庫(kù)信息!‘,mtInformation,[mbok],0);
Edit24.SetFocus;
end
else begin
if Edit27.Text>Edit21.Text
file://檢查出庫(kù)數(shù)量是否小于庫(kù)存數(shù)量
then begin
MessageDlg(‘庫(kù)存中的圖書數(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://添加出庫(kù)記錄
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://計(jì)算出庫(kù)后庫(kù)存圖書數(shù)量
Edit21.Text:=IntToStr(s);
file://顯示出庫(kù)后庫(kù)存圖書數(shù)量
Edit21.ReadOnly:=True;
with datamoduleform.BookQuery do
begin
file://修改庫(kù)存圖書數(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(‘出庫(kù)記錄添加成功!‘,mtInformation,[mbok],0);
Edit14.Text:=‘‘;Edit14.SetFocus;
end;
end;
end;
§5.5 查詢功能的實(shí)現(xiàn)
查詢功能包括員工信息查詢,供應(yīng)商信息查詢,入庫(kù)信息查詢和出庫(kù)信息查詢。由于每一個(gè)功能的實(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://定義了一個(gè)全局變量,在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(‘登陸名錯(cuò)誤,請(qǐng)重新輸入!‘,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 sEdit2.Text file://判斷登陸密碼是否正確
then begin
MessageDlg(‘登陸密碼錯(cuò)誤,請(qǐng)重新輸入!‘,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(‘請(qǐng)輸入完整的信息?!琺tInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
if Not datamoduleform.KeyTable.Locate(‘KeyNo‘,Edit1.Text,[])
then begin
MessageDlg(‘原密碼輸入錯(cuò)誤,不能修改新密碼!‘,mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end
else begin
if Edit2.TextEdit3.Text
then begin
MessageDlg(‘兩次密碼輸入不同,請(qǐng)重新輸入新密碼!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit2.SetFocus;
end
else begin
file://在數(shù)據(jù)庫(kù)中修改密碼
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 用戶注冊(cè)窗體模塊的實(shí)現(xiàn)
圖5.9 用戶注冊(cè)窗體
procedure Tkey3form.SpeedButton1Click(Sender: TObject);
begin
file://用戶注刪窗口注刪按鈕事件
if (Edit1.Text=‘‘)or(Edit2.Text=‘‘)or(Edit3.Text=‘‘)
then begin
MessageDlg(‘請(qǐng)輸入完整的信息!‘,mtInformation,[mbok],0);
Edit1.SetFocus;
end
else begin
if datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判斷用戶名是否存在,系統(tǒng)不允許用戶名重復(fù)
then begin
MessageDlg(‘用戶名已存在,請(qǐng)輸入新的用戶名和密碼!‘,
mtInformation,[mbok],0);
Edit1.Text:=‘‘;Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit1.SetFocus;
end
else begin
if Edit2.TextEdit3.Text
then begin
MessageDlg(‘您輸入的兩個(gè)密碼不相同,請(qǐng)重新輸入!‘,mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit3.Text:=‘‘;Edit2.SetFocus;
end
else begin
with datamoduleform.KeyQuery do
file://在數(shù)據(jù)庫(kù)中添加該用戶
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(‘請(qǐng)輸入完整的信息!‘,mtInformation,[mbok],0)
else begin
if Not datamoduleform.KeyTable.Locate(‘KeyName‘,Edit1.Text,[])
file://判斷用戶名是否存在,用戶名必須存在,才可以刪除
then begin
MessageDlg(‘您所輸入的用戶名不存在,請(qǐng)重新輸入或按“取消”退出?!?/p>
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 sEdit2.Text file://判斷該用戶名下的密碼是否正確
then begin
MessageDlg(‘您所輸入的密碼不正確,請(qǐng)重新輸入或按“取消”退出。‘,
mtInformation,[mbok],0);
Edit2.Text:=‘‘;Edit2.SetFocus;
end
else begin
file://從數(shù)據(jù)庫(kù)中刪除該用戶
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é)束語(yǔ)
本系統(tǒng)是一個(gè)面向小型圖書企業(yè),具有一定實(shí)用性的數(shù)據(jù)庫(kù)信息管理系統(tǒng)。它主要完成對(duì)圖書倉(cāng)庫(kù)的一系列管理,包括入庫(kù)、出庫(kù)、庫(kù)存以及員工和供應(yīng)商信息管理。本系統(tǒng)采用當(dāng)前流行的面向?qū)ο蟮拈_發(fā)工具—Delphi來(lái)完成整個(gè)系統(tǒng)的設(shè)計(jì),在數(shù)據(jù)庫(kù)的設(shè)計(jì)上利用了Access的便利性和實(shí)用性。
本系統(tǒng)具有相當(dāng)?shù)膶?shí)用功能。在查詢方面,系統(tǒng)實(shí)現(xiàn)了多條件任意字段的模糊查詢,同時(shí)在分類查詢上實(shí)現(xiàn)了動(dòng)態(tài)生成,系統(tǒng)可以自動(dòng)識(shí)別用戶不同的輸入。在圖書入庫(kù)、出庫(kù)和庫(kù)存三者之間建立了良好的鏈接關(guān)系,某一部分地修改均會(huì)自動(dòng)引發(fā)系統(tǒng)對(duì)與其相關(guān)的部分進(jìn)行連鎖修改。在用戶管理方面,系統(tǒng)較好地實(shí)現(xiàn)了用戶注冊(cè),用戶注銷和密碼修改等各項(xiàng)功能。
系統(tǒng)在設(shè)計(jì)過(guò)程中不可避免地遇到了各種各樣的問題,由于整個(gè)系統(tǒng)完全都是由個(gè)人設(shè)計(jì)的,有關(guān)Delphi許多細(xì)節(jié)問題都要靠自己去摸索,加之本人水平有限,并沒有完全地理解Delphi的強(qiáng)大功能,而且還存在著許多不足之處。如:
受開發(fā)條件和開發(fā)時(shí)間的限制,本系統(tǒng)只利用了本地?cái)?shù)據(jù)庫(kù)Access,它同應(yīng)用程序處于同一系統(tǒng)中,能存儲(chǔ)的數(shù)據(jù)量也有一定限制,并沒有發(fā)揮出Delphi其數(shù)據(jù)庫(kù)方面的優(yōu)勢(shì);
報(bào)表打印功能尚不夠全面完善,不能實(shí)現(xiàn)動(dòng)態(tài)報(bào)表;
在一些數(shù)據(jù)輸入時(shí)沒有及時(shí)的進(jìn)行數(shù)據(jù)格式校驗(yàn),不能保證數(shù)據(jù)輸入的絕對(duì)正確性。
由于時(shí)間關(guān)系,系統(tǒng)功能實(shí)現(xiàn)不夠完善,使用不是很方便,比如,沒有實(shí)現(xiàn)多條記錄的連鎖刪除和添加以及數(shù)據(jù)的導(dǎo)入功能。
這些都是需要完善的地方,該系統(tǒng)離實(shí)際使用也還有相當(dāng)?shù)木嚯x,需要我進(jìn)行不斷地補(bǔ)充和完善。
通過(guò)本次畢業(yè)設(shè)計(jì)我學(xué)到了不少新的東西,也發(fā)現(xiàn)了大量的問題,有些在設(shè)計(jì)過(guò)程中已經(jīng)解決,有些還有待今后慢慢學(xué)習(xí)。只要學(xué)習(xí)就會(huì)有更多的問題,有更多的難點(diǎn),但也會(huì)有更多的收獲。
考 文 獻(xiàn)
[1] 鄭榮貴、黃平、谷會(huì)東,Delphi 6.0數(shù)據(jù)庫(kù)開發(fā)與應(yīng)用,中科多媒體電子出版社,2002
[2] 伍俊良,Delphi 6控件應(yīng)用實(shí)例教程,北京希望電子出版社,2002
[3] 盧國(guó)俊,Delphi 6數(shù)據(jù)庫(kù)開發(fā),電子工業(yè)出版社,2002
[4] 邊萌,Delphi 編程起步,機(jī)械工業(yè)出版社,2002
[5] 伍俊良,Delphi 6課程設(shè)計(jì)案例精編,中國(guó)水利水電出版社,2002