📄 033.htm
字号:
<p>
我们前面在介绍的基于单个数据库表的数据库应用程序只能对数据库表进行简单的管理,大多数只用来浏览单个数据库表中的记录信息,如果我们想浏览多个相关的数据库表中的记录信息,就必须要创建主要──明细型数据库应用程序。</p>
<p> 在主要──明细型数据库应用程序中,一个数据库表作为主要表,其中存放着综合信息,其他的数据库表和主要数据库表相关联,它们当中存放着更详细的信息。例如,当数据库表Customer.DB作为主表,它包含着客户的综合信息如编号、姓名、
所在公司的名称等等。而数据库表Orders.DB中包含着每个客户的订货单的详细信息,如订单号、
发货日期、起运日期、发货目的地等信息,这样当在Customer.DB表中查看某一位客户时,
利用其中的字段CustNo与Orders.DB表发生联系,自动地从Orders.DB表中检索出这位客户曾经发来的所有订货单的详细信息。主要──明细型数据库体现了关系数据库的特点,即独立的数据库表之间基于它们共同的字段而发生联系。在这里Customer.DB和Orders.DB拥有一个共同的字段CustNo。</p>
<p>14.3.1 一对多关系的主要──明细型数据库应用程序 </p>
<p>
主要和明细数据库表之间存在一对多的关系,意思是说对于主表中的一条记录,在明细表中有多条记录与之对应。例如,创建一个主要──明细型数据库应用程序,其包括两个表Customer.DB和Orders.DB,它们分别作为主表和明细表,创建好的应用如图14.5所示,窗体中各部件的属性设置 </p>
<p>表14.2 主要──明细型数据库应用中各部件的属性</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>(明细表) DatabaseName DBDEMOS </p>
<p>TableName ORDERS.DB </p>
<p>IndexFieldNames CUSTNO 指定字段CUSTNO作为</p>
<p>Table2中的索引字段</p>
<p>MasterField CUSTNO 指定与主表发生联系</p>
<p>的字段</p>
<p>MasterSource DataSource1 说明与主表相连接的</p>
<p>数据源即DataSource</p>
<p>──────────────────────────────────</p>
<p>DataSource2 DataSet Table2 </p>
<p>AutoEdit False </p>
<p>──────────────────────────────────</p>
<p>DBGrid1 DataSource DataSource1 </p>
<p>(对应主表) </p>
<p>──────────────────────────────────</p>
<p>DBGrid2 DataSource DataSource2 </p>
<p>(对应明细表) </p>
<p>TableName ORDERS.DB </p>
<p>──────────────────────────────────</p>
<p>DBNavigator1 DataSource DataSource1 </p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>
一对多关系是非常普遍的关系。即便是简单的名字/
地址数据库都有一对多的关系,因为一个人可能不止一个地址:家庭地址、工作地址、还可能有别墅地址。在本例中,公司的一个客户常常有多个订货单,当我们单击DBNavigator1中的向前、向后按钮时,会移动DBGrid1中的记录指针,而在DBGrid2中会自动显示与DBGridl
中当前记录相关的多条记录,即显示一个客户的信息时,同时会显示该客户的所有订货单的详细信息。 </p>
<p>14.3.2 一对多──多关系的数据库应用 </p>
<p>
前面我们介绍了基于两个表的一对多关系的应用,下面我们介绍怎样创建一个从三个表中浏览数据记录的一对多关系的应用。</p>
<p>
例如:一个客户也许有多张订货单,而每一张订货单中有多个订货项目,这样我们在Customer.DB表和Orders.DB表之间建立一个主要──明细型关系,同时在orders.DB
表和Items.DB表之间建立一个主要──明细型关系。 </p>
<p>窗体中各部件的属性如表14.3所示 </p>
<p>表14.3 一对多──多关系的应用中各部件的属性</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中的字段值。在该例子中,总共连接了三个表,
Customer. DB 表是主要表,Orders.DB表在窗体中起到了双重作用,它既是Customer.Db表的明细表,同时又是Items.DB表的主要表,Items.DB表是Orders.DB表的明细表。 </p>
<p align="center">14.4 字段对象的使用 </p>
<p> Ttable和TQuery部件中有一个TField类型的属性Fiedls,Fields是TField类型的对象的列表,TField对象列表是Delphi数据库中较难以理解的一个对象,它是
TTable 部件和TQuary部件的一部分,它们是不能够选择到窗体中的独立的部件,而且无论是在设计阶段还是在程序运行过程中,它们都没有可见的图像。即使到Object
Inspector窗中察看它们也很困难。</p>
<p> Tfield对象是在打开磁盘上的数据库表时动态产生的,并在数据库表被关闭时自动消失,TField对象可以控制表中的每一列是否在数据浏览部件中显示以及以何种格式显示等等。通过字段编辑器(Fields
Editor)我们可以建立永久性的TField 对象列表代替动态的Tfield对象列表供Delphi应用程序使用,通过Fields
Editor建立的永久性的字段对象会自动地加入到程序库单元的TForm类型定义中
,它们保存在应用程序中,即使数据库表的基本结构发生了改变,它也是一直保留着,当然如果修改后的表中使得原来所定义的字段对象不再存在,Delphi应用程序在运行过程中会给出现错误信息。 </p>
<p>14.4.1 字段对象的类型 </p>
<p>字段对象TField对应数据库记录中的各个字段,因为数据库记录中的字段有多种数据类型,因此对记录字段可能出现的每一种数据类型都有一个独立的TField类型与之对应。TField的类型如表14.4所示 </p>
<p>表14.4 字段对象的类型</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>字段对象的类型 对应的数据类型</p>
<p>─────────────────────────</p>
<p>TBooleanField 布尔型数据</p>
<p>TCurrentyField 货币型数据</p>
<p>TStringField 字符串数据</p>
<p>TIntegerField 整数型数据</p>
<p>TBLOB 大二进制对象</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>
在大多数情况下可能使用的是TStringField和TIntegerField类型的字段对象,
从编程的角度来看这些TField对象的不同类型是完全相同的,应用程序是根本不必关心TField对象的实际类型,它们之间的主要区别在于:它们内部保留的以及它们和数据库表之间传递的数据类型不一样。</p>
<p>14.4.2 创建永久性的字段对象 </p>
<p>
我们知道字段对象在设计和运行阶段都是不可见的,它既可以随着磁盘上的数据库文件被打开时动态地生成也可以通过字段编辑器Fields
Editor来创建它。 在应用程序中使用Fields Editor可以为数据库表中的字段创建相应的永久性的TField对象,TField
部件是不可见的部件,但是通过它,我们可以定义数据库表中各字段的显示属性和显示顺序以及控制字段的取值范围等。下面的例子,告诉我们如何使用Fields
Editor定义Customer.DB表中的四字段,并在网格中显示表中的记录信息。</p>
<p>操作步骤:</p>
<p>1、建立一个基于 customer. DB 表的数据库应用窗体,
并在窗体中用一个网格显示customer.DB中的全部字段,详细方法请参见14.1节,建好的窗体如图14.1所示。</p>
<p>2、设置窗体中Table1的Active属性为True,使网格显示表中的记录。</p>
<p>3、选中Table1并双击鼠标左键,打开字段编辑器Fields Editor,
缺省情况下字段列表为空。</p>
<p>4、单击鼠标右键弹出一个弹出式菜单,然后选择Add Fields菜单项,缺省情况下表Customer.DB中的全部字段被选进字段列表框。
从字段列表框中选择你要在网格中显示的字段,具体做法是:单击Custno字段,并按住CTR键,再单击Company、Phone、LastInviceDate字段,然后单击OK按钮,确认被选择的四个字段,时窗体中的DBGrid1中只显示刚才被选中的四个字段值,而不再显示表中其它的字段值。</p>
<p> </p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" background="bg.gif"><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>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -