一.數(shù)據(jù)庫的建立
一個設(shè)計合理的數(shù)據(jù)庫就是管理軟件成功的一半。因此我們在開發(fā)之初就應(yīng)該先慎重設(shè)計好數(shù)據(jù)庫的結(jié)構(gòu)。筆者在開發(fā)人事管理軟件時建立一個名為:HR.mdb的數(shù)據(jù)庫,該庫包括下面三個表:
職工的自然情況一般是下面這些內(nèi)容的:(Employee)
職工姓名性別出生日期民族政治面貌婚否……
職工履歷表的內(nèi)容一般是下面這些內(nèi)容的:(Vita)
起始時間終止時間所在單位及部門任職情況……
職工家屬情況一般是下面這些內(nèi)容的:(Relative)
親人姓名與本人關(guān)系所在單位及部門任職情況……
很顯然,Employee與Vita和Relative表之間是“一對多”的關(guān)系。即一條Employee記錄對應(yīng)多條Vita和Relative記錄,亦即Employee為主表,Vita和Relative為細表。由于在設(shè)計ACCESS數(shù)據(jù)庫時每個表必須要有一個主關(guān)鍵字(PrimaryKey),因此筆者設(shè)計了一個“職工ID”字段作為三個表相互連接的字段,同時也作為Employee表的主關(guān)鍵字。而另外兩個表的主關(guān)鍵字就采用自動編號(AutoNum)字段了。
二.建立表之間的連接
數(shù)據(jù)庫設(shè)計好之后就可以著手設(shè)計各種應(yīng)用,但程序設(shè)計中關(guān)鍵的問題是如何建立“主細表”之間的連接。
建立“主細表”之間的連接有兩種方法:
1、利用VB的數(shù)據(jù)窗體向?qū)伞爸骷毐怼钡倪B接。
根據(jù)向?qū)В梢陨梢粋€主表和一個細表的連接。但是這種方法生成的連接有它的缺陷。首先是它只能生成兩個表的連接,對我們上面所說的情況就無能為力了;其次是開發(fā)者在為向?qū)峁?shù)據(jù)庫時,系統(tǒng)把數(shù)據(jù)庫的絕對路徑加入了DATA控件,非常不利于程序的分發(fā)。下面介紹筆者使用的一種方法。
2、動態(tài)創(chuàng)建“主細表”的連接
新建一個Form,然后添加三個DATA控件和三個DBGRID控件。三個DATA控件的名稱分別為:datPrimaryRS,datSecondaryRS,DatThirdRS;三個DBGRID控件的名稱分別為:grdPrimaryRS,grdSecondaryRS,grdDatThirdRS。三個DATA控件Form上既沒有指定DatabaseName,也沒有指定RecordSource,只是在Form調(diào)用時才動態(tài)賦值。三個DBGRID控件倒是指定了所對應(yīng)的DATA控件。下面是Form_Load()函數(shù):
PrivateSubForm_Load()
datPrimaryRS.DatabaseName=App.path&“ HR.mdb”
datPrimaryRS.RecordSource=
"select*from[Employee]Orderby[職工ID]"
datSecondaryRS.DatabaseName=App.path&“ HR.mdb
datThirdRS.DatabaseName=App.path&“ HR.mdb
'創(chuàng)建主表網(wǎng)格記錄集
datPrimaryRS.Refresh
EndSub
這里只是創(chuàng)建和顯示了主表的數(shù)據(jù),那么兩個細表的數(shù)據(jù)如何創(chuàng)建和顯示呢?從主細表的概念我們知道,我們查看主表的任何一條記錄,細表必須同時顯示出對應(yīng)的多條記錄。因此我們必須對主表的任何一條記錄成為當(dāng)前記錄時觸發(fā)的事件編碼。而該事件就是Reposition。
PrivateSubdatPrimaryRS_Reposition()
Screen.MousePointer=vbDefault
OnErrorResumeNext
datSecondaryRS.Refresh
DatThirdRS.Refresh
'使網(wǎng)格與主表記錄集同步
datSecondaryRS.RecordSource="select[職工ID],
[起始日期],[終止日期],[所在單位及部門],[任職情況]
from[Vita]where[職工ID]="&datPrimaryRS.Recordset!
[職工ID]&"Orderby[起始日期]"
DatThirdRS.RecordSource="select[職工ID],[親人姓名],
[關(guān)系],[所在單位及部門],[任職情況]
from[Relative]where[職工ID]="&
datPrimaryRS.Recordset![職工ID]&""
datSecondaryRS.Refresh
DatThirdRS.Refresh
'為dynasets和快照顯示當(dāng)前記錄位置
datPrimaryRS.Caption="當(dāng)前記錄:"&
(datPrimaryRS.Recordset.AbsolutePosition+1)
EndSub
很顯然,如果有三個、四個…等多個細表也可以如法炮制。
至此,一個靈活的,表數(shù)不限的主細表連接就建立起來了。只要將三個DBGRID的AllowAddNew、AllowDelete和AllowUpdate三個屬性設(shè)置為TRUE,那么就可以對這些主細表進行各種數(shù)據(jù)庫表作了。
相關(guān)文章