14.3 創建主要──明細數據庫應用
我們前面在介紹的基於單個數據庫表的數據庫應用程序只能對數據庫表進行簡單的管理,大多數只用來浏覽單個數據庫表中的記錄信息,如果我們想浏覽多個相關的數據庫表中的記錄信息,就必須要創建主要──明細型數據庫應用程序。
在主要──明細型數據庫應用程序中,一個數據庫表作為主要表,其中存放著綜合信息,其他的數據庫表和主要數據庫表相關聯,它們當中存放著更詳細的信息。例如,當數據庫表Customer.DB作為主表,它包含著客戶的綜合信息如編號、姓名、所在公司的名稱等等。而數據庫表Orders.DB中包含著每個客戶的訂貨單的詳細信息,如訂單號、發貨日期、起運日期、發貨目的地等信息,這樣當在Customer.DB表中查看某一位客戶時,利用其中的字段CustNo與Orders.DB表發生聯系,自動地從Orders.DB表中檢索出這位客戶曾經發來的所有訂貨單的詳細信息。主要──明細型數據庫體現了關系數據庫的特點,即獨立的數據庫表之間基於它們共同的字段而發生聯系。在這裡Customer.DB和Orders.DB擁有一個共同的字段CustNo。
14.3.1 一對多關系的主要──明細型數據庫應用程序
主要和明細數據庫表之間存在一對多的關系,意思是說對於主表中的一條記錄,在明細表中有多條記錄與之對應。例如,創建一個主要──明細型數據庫應用程序,其包括兩個表Customer.DB和Orders.DB,它們分別作為主表和明細表,創建好的應用如圖14.5所示,窗體中各部件的屬性設置
表14.2 主要──明細型數據庫應用中各部件的屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 屬 性 屬 性 值 注 釋
──────────────────────────────────
Table1 Active True
(主表) DatabaseName DBDEMOS
TableName CUSTOMER.DB
──────────────────────────────────
DataSource1 DataSet Table1
AutoEdit False
──────────────────────────────────
Table2 Active True
(明細表) DatabaseName DBDEMOS
TableName ORDERS.DB
IndexFieldNames CUSTNO 指定字段CUSTNO作為
Table2中的索引字段
MasterField CUSTNO 指定與主表發生聯系
的字段
MasterSource DataSource1 說明與主表相連接的
數據源即DataSource
──────────────────────────────────
DataSource2 DataSet Table2
AutoEdit False
──────────────────────────────────
DBGrid1 DataSource DataSource1
(對應主表)
──────────────────────────────────
DBGrid2 DataSource DataSource2
(對應明細表)
TableName ORDERS.DB
──────────────────────────────────
DBNavigator1 DataSource DataSource1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一對多關系是非常普遍的關系。即便是簡單的名字/ 地址數據庫都有一對多的關系,因為一個人可能不止一個地址:家庭地址、工作地址、還可能有別墅地址。在本例中,公司的一個客戶常常有多個訂貨單,當我們單擊DBNavigator1中的向前、向後按鈕時,會移動DBGrid1中的記錄指針,而在DBGrid2中會自動顯示與DBGridl 中當前記錄相關的多條記錄,即顯示一個客戶的信息時,同時會顯示該客戶的所有訂貨單的詳細信息。
14.3.2 一對多──多關系的數據庫應用
前面我們介紹了基於兩個表的一對多關系的應用,下面我們介紹怎樣創建一個從三個表中浏覽數據記錄的一對多關系的應用。
例如:一個客戶也許有多張訂貨單,而每一張訂貨單中有多個訂貨項目,這樣我們在Customer.DB表和Orders.DB表之間建立一個主要──明細型關系,同時在orders.DB 表和Items.DB表之間建立一個主要──明細型關系。
窗體中各部件的屬性如表14.3所示
表14.3 一對多──多關系的應用中各部件的屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 屬 性 屬 性 值 注 釋
──────────────────────────────────
Active True
Table1 DatabaseName DBDEMOS
TableName CUSTOMER.DB
──────────────────────────────────
DataSource1 DataSet Table1
AutoEdit False
──────────────────────────────────
Active True
DatabaseName DBDEMOS
Table2 TableName ORDERS.DB
IndexFieldNames CUSTNO
MasterField CUSTNO
MasterSource DataSource1
──────────────────────────────────
DataSource2 DataSet Table2
AutoEdit False
──────────────────────────────────
Active True
DatabaseName DBDEMOS
Table3 TableName ORDERS.DB
IndexFieldNames ORDERNO
MasterField ORDERNO
MasterSource DataSource2
──────────────────────────────────
DataSource3 DataSet Table3
AutoEdit False
──────────────────────────────────
DBGrid1 DataSource DataSource3
──────────────────────────────────
DBNavigator1 DataSource DataSource1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
窗體中其余的部件都是TDBEdit和TLabel部件,它們用於顯示Customer.DB中的字段值和Order.DB中的字段值。在該例子中,總共連接了三個表, Customer. DB 表是主要表,Orders.DB表在窗體中起到了雙重作用,它既是Customer.Db表的明細表,同時又是Items.DB表的主要表,Items.DB表是Orders.DB表的明細表。