在开发人事管理软件的工程中,当我们建立一个职工档案记录时,通常都会遇到设计职工履历表、职工家属情况的问题,我这里介绍一种用“主细表”方法的开发思路。
一. 数据库的建立
一个设计合理的数据库就是管理软件成功的一半。因此我们在开发之初就应该先慎重设计好数据库的结构。笔者在开发人事管理软件时建立一个名为: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,那么就可以对这些主细表进行各种数据库表作了。