计算机世界日报
返回首页 产品报价 实用技巧 国产软件 技术天地 站点精选

计算机世界展览会日报

  综合要闻
  企业&人.com
  产品与技术
  网络与通信
  市场与渠道
  99全文检索

CCW网站

  网络世界
  微电脑世界
  IT经理世界
  CCW展览
  信息服务中心   家用电脑世界

兄弟刊物

  电子与信息化
  今日电子
  中国新闻科技
  电子知识产权
  电子产品世界

网上专递

  Linux园地
  友情链接
  冬涛谈法
Dongtao on Law

98内容总汇



实用技巧

利用VB动态设计多“主细表”应用

民政部信息中心
方云波

---- 在开发人事管理软件的工程中,当我们建立一个职工档案记录时,通常都会遇到设计职工履历表、职工家属情况的问题,我这里介绍一种用“主细表”方法的开发思路。

---- 一. 数据库的建立

---- 一个设计合理的数据库就是管理软件成功的一半。因此我们在开发之初就应该先慎重设计好数据库的结构。笔者在开发人事管理软件时建立一个名为:HR.mdb的数据库,该库包括下面三个表:

职工的自然情况一般是下面这些内容的:(Employee)
职工姓名	性别	出生日期	民族	政治面貌	婚否……

职工履历表的内容一般是下面这些内容的:(Vita)
起始时间  终止时间  所在单位及部门  任职情况……

职工家属情况一般是下面这些内容的:(Relative)
亲人姓名	与本人关系  所在单位及部门  任职情况……

---- 很显然,Employee 与Vita和Relative表之间是“一对多”的关系。即一条Employee记录对应多条Vita和Relative记录,亦即Employee为主表,Vita和Relative为细表。由于在设计ACCESS数据库时每个表必须要有一个主关键字(Primary Key),因此笔者设计了一个“职工ID”字段作为三个表相互连接的字段,同时也作为Employee表的主关键字。而另外两个表的主关键字就采用自动编号(AutoNum)字段了。

---- 二. 建立表之间的连接

---- 数据库设计好之后就可以着手设计各种应用,但程序设计中关键的问题是如何建立“主细表”之间的连接。

---- 建立“主细表”之间的连接有两种方法:

---- 1、 利用VB的数据窗体向导生成“主细表”的连接。

---- 根据向导,可以生成一个主表和一个细表的连接。但是这种方法生成的连接有它的缺陷。首先是它只能生成两个表的连接,对我们上面所说的情况就无能为力了;其次是开发者在为向导提供数据库时,系统把数据库的绝对路径加入了DATA控件,非常不利于程序的分发。 下面介绍笔者使用的一种方法。

---- 2、 动态创建“主细表”的连接

---- 新建一个Form,然后添加三个DATA控件和三个DBGRID控件。三个DATA控件的名称分别为:datPrimaryRS,datSecondaryRS,DatThirdRS;三个DBGRID控件的名称分别为:grdPrimaryRS,grdSecondaryRS,grdDatThirdRS。三个DATA控件Form上既没有指定DatabaseName,也没有指定RecordSource,只是在Form调用时才动态赋值。三个DBGRID控件倒是指定了所对应的DATA控件。下面是Form_Load()函数:

Private Sub Form_Load()
    datPrimaryRS.DatabaseName = App.path & “\HR.mdb”
datPrimaryRS.RecordSource =
 "select * from [Employee] Order by [职工      ID]"
    datSecondaryRS.DatabaseName = App.path & “\HR.mdb
    datThirdRS.DatabaseName = App.path & “\HR.mdb
  '创建主表网格记录集
  datPrimaryRS.Refresh
End Sub

---- 这里只是创建和显示了主表的数据,那么两个细表的数据如何创建和显示呢?从主细表的概念我们知道,我们查看主表的任何一条记录,细表必须同时显示出对应的多条记录。因此我们必须对主表的任何一条记录成为当前记录时触发的事件编码。而该事件就是Reposition。

Private Sub datPrimaryRS_Reposition()
  Screen.MousePointer = vbDefault
    On Error Resume Next
    datSecondaryRS.Refresh
    DatThirdRS.Refresh
  '使网格与主表记录集同步
  datSecondaryRS.RecordSource = "select [职工ID],
[起始日期],[终止日期],[所在单位及部门],[任职情况] 
from [Vita] where [职工ID]=" & datPrimaryRS.Recordset!
[职工ID] & " Order by [起始日期]"
  DatThirdRS.RecordSource = "select [职工ID],[亲人姓名],
[关系],[所在单位及部门],[任职情况] 
from [Relative] where [职工ID]=" & 
datPrimaryRS.Recordset![职工ID] & ""
  datSecondaryRS.Refresh
  DatThirdRS.Refresh
  '为 dynasets 和快照显示当前记录位置
  datPrimaryRS.Caption = "当前记录: " & 
(datPrimaryRS.Recordset.AbsolutePosition + 1)
End Sub

---- 很显然,如果有三个、四个…等多个细表也可以如法炮制。

---- 至此,一个灵活的,表数不限的主细表连接就建立起来了。只要将三个DBGRID的AllowAddNew、AllowDelete和AllowUpdate三个属性设置为TRUE,那么就可以对这些主细表进行各种数据库表作了。

 
免 费 订 阅

实用技巧分类

Office应用
CAD
C、C++
数据库应用
Delphi
Internet应用
Java
Notes应用
操作系统应用
PowerBuilder
VB
Visual Foxpro
其他类
上周 排行榜
如 何 投 稿 ?

编者的话

在日常的工作生活中, 我们对计算机软硬件技术的应用开发肯定有许多的心得体会, 拿来和众人分享:让别人得到他们想要的,使自己找到苦苦寻觅的; 小的点点滴滴,大的工程系统,这里都需要。投稿 的关键在“技巧”二 字,知他人所不知,这样的稿件本栏最最欢迎! 大家公认的 好文章自然会有好的奖励。希望每个人 在这里都有所收获...

r2.gif (980 bytes)
  中国惠普
  3Com中国
  Motorola中国
  CA中国
  Cabletron
  Sony在中国
  西门子WinCC
  爱普生中国
  中国建设银行
  德州仪器(TI)
  问博医药


中国计算机世界出版服务公司版权所有