?? 033.htm
字號(hào):
<p> 還有一些屬性可以用來定制TDBNavigator部件的外觀和性能,有關(guān)這方面的詳細(xì)信息請參看聯(lián)機(jī)幫助。</p><p align="center">14.3 創(chuàng)建主要──明細(xì)數(shù)據(jù)庫應(yīng)用 </p><p> 我們前面在介紹的基于單個(gè)數(shù)據(jù)庫表的數(shù)據(jù)庫應(yīng)用程序只能對數(shù)據(jù)庫表進(jìn)行簡單的管理,大多數(shù)只用來瀏覽單個(gè)數(shù)據(jù)庫表中的記錄信息,如果我們想瀏覽多個(gè)相關(guān)的數(shù)據(jù)庫表中的記錄信息,就必須要?jiǎng)?chuàng)建主要──明細(xì)型數(shù)據(jù)庫應(yīng)用程序。</p><p> 在主要──明細(xì)型數(shù)據(jù)庫應(yīng)用程序中,一個(gè)數(shù)據(jù)庫表作為主要表,其中存放著綜合信息,其他的數(shù)據(jù)庫表和主要數(shù)據(jù)庫表相關(guān)聯(lián),它們當(dāng)中存放著更詳細(xì)的信息。例如,當(dāng)數(shù)據(jù)庫表Customer.DB作為主表,它包含著客戶的綜合信息如編號(hào)、姓名、所在公司的名稱等等。而數(shù)據(jù)庫表Orders.DB中包含著每個(gè)客戶的訂貨單的詳細(xì)信息,如訂單號(hào)、發(fā)貨日期、起運(yùn)日期、發(fā)貨目的地等信息,這樣當(dāng)在Customer.DB表中查看某一位客戶時(shí),利用其中的字段CustNo與Orders.DB表發(fā)生聯(lián)系,自動(dòng)地從Orders.DB表中檢索出這位客戶曾經(jīng)發(fā)來的所有訂貨單的詳細(xì)信息。主要──明細(xì)型數(shù)據(jù)庫體現(xiàn)了關(guān)系數(shù)據(jù)庫的特點(diǎn),即獨(dú)立的數(shù)據(jù)庫表之間基于它們共同的字段而發(fā)生聯(lián)系。在這里Customer.DB和Orders.DB擁有一個(gè)共同的字段CustNo。</p><p>14.3.1 一對多關(guān)系的主要──明細(xì)型數(shù)據(jù)庫應(yīng)用程序 </p><p> 主要和明細(xì)數(shù)據(jù)庫表之間存在一對多的關(guān)系,意思是說對于主表中的一條記錄,在明細(xì)表中有多條記錄與之對應(yīng)。例如,創(chuàng)建一個(gè)主要──明細(xì)型數(shù)據(jù)庫應(yīng)用程序,其包括兩個(gè)表Customer.DB和Orders.DB,它們分別作為主表和明細(xì)表,創(chuàng)建好的應(yīng)用如圖14.5所示,窗體中各部件的屬性設(shè)置 </p><p>表14.2 主要──明細(xì)型數(shù)據(jù)庫應(yīng)用中各部件的屬性</p><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p><p>部 件 屬 性 屬 性 值 注 釋 </p><p>──────────────────────────────────</p><p>Table1 Active True </p><p>(主表) DatabaseName DBDEMOS </p><p>TableName CUSTOMER.DB </p><p>──────────────────────────────────</p><p>DataSource1 DataSet Table1 </p><p>AutoEdit False </p><p>──────────────────────────────────</p><p>Table2 Active True </p><p>(明細(xì)表) DatabaseName DBDEMOS </p><p>TableName ORDERS.DB </p><p>IndexFieldNames CUSTNO 指定字段CUSTNO作為</p><p>Table2中的索引字段</p><p>MasterField CUSTNO 指定與主表發(fā)生聯(lián)系</p><p>的字段</p><p>MasterSource DataSource1 說明與主表相連接的</p><p>數(shù)據(jù)源即DataSource</p><p>──────────────────────────────────</p><p>DataSource2 DataSet Table2 </p><p>AutoEdit False </p><p>──────────────────────────────────</p><p>DBGrid1 DataSource DataSource1 </p><p>(對應(yīng)主表) </p><p>──────────────────────────────────</p><p>DBGrid2 DataSource DataSource2 </p><p>(對應(yīng)明細(xì)表) </p><p>TableName ORDERS.DB </p><p>──────────────────────────────────</p><p>DBNavigator1 DataSource DataSource1 </p><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p><p> 一對多關(guān)系是非常普遍的關(guān)系。即便是簡單的名字/地址數(shù)據(jù)庫都有一對多的關(guān)系,因?yàn)橐粋€(gè)人可能不止一個(gè)地址:家庭地址、工作地址、還可能有別墅地址。在本例中,公司的一個(gè)客戶常常有多個(gè)訂貨單,當(dāng)我們單擊DBNavigator1中的向前、向后按鈕時(shí),會(huì)移動(dòng)DBGrid1中的記錄指針,而在DBGrid2中會(huì)自動(dòng)顯示與DBGridl中當(dāng)前記錄相關(guān)的多條記錄,即顯示一個(gè)客戶的信息時(shí),同時(shí)會(huì)顯示該客戶的所有訂貨單的詳細(xì)信息。 </p><p>14.3.2 一對多──多關(guān)系的數(shù)據(jù)庫應(yīng)用 </p><p> 前面我們介紹了基于兩個(gè)表的一對多關(guān)系的應(yīng)用,下面我們介紹怎樣創(chuàng)建一個(gè)從三個(gè)表中瀏覽數(shù)據(jù)記錄的一對多關(guān)系的應(yīng)用。</p><p> 例如:一個(gè)客戶也許有多張訂貨單,而每一張訂貨單中有多個(gè)訂貨項(xiàng)目,這樣我們在Customer.DB表和Orders.DB表之間建立一個(gè)主要──明細(xì)型關(guān)系,同時(shí)在orders.DB表和Items.DB表之間建立一個(gè)主要──明細(xì)型關(guān)系。 </p><p>窗體中各部件的屬性如表14.3所示 </p><p>表14.3 一對多──多關(guān)系的應(yīng)用中各部件的屬性</p><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p><p>部 件 屬 性 屬 性 值 注 釋 </p><p>──────────────────────────────────</p><p>Active True </p><p>Table1 DatabaseName DBDEMOS </p><p>TableName CUSTOMER.DB </p><p>──────────────────────────────────</p><p>DataSource1 DataSet Table1 </p><p>AutoEdit False </p><p>──────────────────────────────────</p><p>Active True </p><p>DatabaseName DBDEMOS </p><p>Table2 TableName ORDERS.DB </p><p>IndexFieldNames CUSTNO </p><p>MasterField CUSTNO </p><p>MasterSource DataSource1 </p><p>──────────────────────────────────</p><p>DataSource2 DataSet Table2 </p><p>AutoEdit False </p><p>──────────────────────────────────</p><p>Active True </p><p>DatabaseName DBDEMOS </p><p>Table3 TableName ORDERS.DB </p><p>IndexFieldNames ORDERNO </p><p>MasterField ORDERNO </p><p>MasterSource DataSource2 </p><p>──────────────────────────────────</p><p>DataSource3 DataSet Table3 </p><p>AutoEdit False </p><p>──────────────────────────────────</p><p>DBGrid1 DataSource DataSource3 </p><p>──────────────────────────────────</p><p>DBNavigator1 DataSource DataSource1 </p><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p><p> 窗體中其余的部件都是TDBEdit和TLabel部件,它們用于顯示Customer.DB中的字段值和Order.DB中的字段值。在該例子中,總共連接了三個(gè)表,Customer. DB 表是主要表,Orders.DB表在窗體中起到了雙重作用,它既是Customer.Db表的明細(xì)表,同時(shí)又是Items.DB表的主要表,Items.DB表是Orders.DB表的明細(xì)表。 </p><p align="center">14.4 字段對象的使用 </p><p> Ttable和TQuery部件中有一個(gè)TField類型的屬性Fiedls,F(xiàn)ields是TField類型的對象的列表,TField對象列表是Delphi數(shù)據(jù)庫中較難以理解的一個(gè)對象,它是TTable 部件和TQuary部件的一部分,它們是不能夠選擇到窗體中的獨(dú)立的部件,而且無論是在設(shè)計(jì)階段還是在程序運(yùn)行過程中,它們都沒有可見的圖像。即使到ObjectInspector窗中察看它們也很困難。</p><p> Tfield對象是在打開磁盤上的數(shù)據(jù)庫表時(shí)動(dòng)態(tài)產(chǎn)生的,并在數(shù)據(jù)庫表被關(guān)閉時(shí)自動(dòng)消失,TField對象可以控制表中的每一列是否在數(shù)據(jù)瀏覽部件中顯示以及以何種格式顯示等等。通過字段編輯器(FieldsEditor)我們可以建立永久性的TField 對象列表代替動(dòng)態(tài)的Tfield對象列表供Delphi應(yīng)用程序使用,通過FieldsEditor建立的永久性的字段對象會(huì)自動(dòng)地加入到程序庫單元的TForm類型定義中,它們保存在應(yīng)用程序中,即使數(shù)據(jù)庫表的基本結(jié)構(gòu)發(fā)生了改變,它也是一直保留著,當(dāng)然如果修改后的表中使得原來所定義的字段對象不再存在,Delphi應(yīng)用程序在運(yùn)行過程中會(huì)給出現(xiàn)錯(cuò)誤信息。 </p><p>14.4.1 字段對象的類型 </p><p>字段對象TField對應(yīng)數(shù)據(jù)庫記錄中的各個(gè)字段,因?yàn)閿?shù)據(jù)庫記錄中的字段有多種數(shù)據(jù)類型,因此對記錄字段可能出現(xiàn)的每一種數(shù)據(jù)類型都有一個(gè)獨(dú)立的TField類型與之對應(yīng)。TField的類型如表14.4所示 </p><p>表14.4 字段對象的類型</p><p>━━━━━━━━━━━━━━━━━━━━━━━━━</p><p>字段對象的類型 對應(yīng)的數(shù)據(jù)類型</p><p>─────────────────────────</p><p>TBooleanField 布爾型數(shù)據(jù)</p><p>TCurrentyField 貨幣型數(shù)據(jù)</p><p>TStringField 字符串?dāng)?shù)據(jù)</p><p>TIntegerField 整數(shù)型數(shù)據(jù)</p><p>TBLOB 大二進(jìn)制對象</p><p>━━━━━━━━━━━━━━━━━━━━━━━━━ </p><p> 在大多數(shù)情況下可能使用的是TStringField和TIntegerField類型的字段對象,從編程的角度來看這些TField對象的不同類型是完全相同的,應(yīng)用程序是根本不必關(guān)心TField對象的實(shí)際類型,它們之間的主要區(qū)別在于:它們內(nèi)部保留的以及它們和數(shù)據(jù)庫表之間傳遞的數(shù)據(jù)類型不一樣。</p><p>14.4.2 創(chuàng)建永久性的字段對象 </p><p> 我們知道字段對象在設(shè)計(jì)和運(yùn)行階段都是不可見的,它既可以隨著磁盤上的數(shù)據(jù)庫文件被打開時(shí)動(dòng)態(tài)地生成也可以通過字段編輯器FieldsEditor來創(chuàng)建它。 在應(yīng)用程序中使用Fields Editor可以為數(shù)據(jù)庫表中的字段創(chuàng)建相應(yīng)的永久性的TField對象,TField部件是不可見的部件,但是通過它,我們可以定義數(shù)據(jù)庫表中各字段的顯示屬性和顯示順序以及控制字段的取值范圍等。下面的例子,告訴我們?nèi)绾问褂肍ieldsEditor定義Customer.DB表中的四字段,并在網(wǎng)格中顯示表中的記錄信息。</p><p>操作步驟:</p><p>1、建立一個(gè)基于 customer. DB 表的數(shù)據(jù)庫應(yīng)用窗體,并在窗體中用一個(gè)網(wǎng)格顯示customer.DB中的全部字段,詳細(xì)方法請參見14.1節(jié),建好的窗體如圖14.1所示。</p><p>2、設(shè)置窗體中Table1的Active屬性為True,使網(wǎng)格顯示表中的記錄。</p><p>3、選中Table1并雙擊鼠標(biāo)左鍵,打開字段編輯器Fields Editor,缺省情況下字段列表為空。</p><p>4、單擊鼠標(biāo)右鍵彈出一個(gè)彈出式菜單,然后選擇Add Fields菜單項(xiàng),缺省情況下表Customer.DB中的全部字段被選進(jìn)字段列表框。從字段列表框中選擇你要在網(wǎng)格中顯示的字段,具體做法是:單擊Custno字段,并按住CTR鍵,再單擊Company、Phone、LastInviceDate字段,然后單擊OK按鈕,確認(rèn)被選擇的四個(gè)字段,時(shí)窗體中的DBGrid1中只顯示剛才被選中的四個(gè)字段值,而不再顯示表中其它的字段值。</p><p> </p><hr width="94%"></TD><TD CLASS="tt3" VALIGN="bottom" width="8%" ><strong><A HREF="034.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR><A HREF="032.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR><A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR></strong></TD></TR></table></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -