确保存储在MS Access链接/关系表中的关系不允许在时间上重叠



我有一个MS Access 2016数据库,其中包含人员表和组织表(分别为PERS和ORG(以及关系表(PERS-ORG_RLTNP(,它存储有关人员和组织之间关系的数据,例如,显示特定人员何时是组织成员的关系。PERS和ORG表具有自动编号主键(PERS_ID和ORG_ID(,这些主键作为外键迁移到PERS-ORG_RLTNP中。PERS-ORG_RLTNP还有一个关系类型字段(PERS-ORG_RLTNP_Typ(,以及显示每个关系何时生效的Effective_From_Date和Effective_To_Date字段。

我希望数据库允许同一个人和组织之间存在多个相同类型的关系,但我不希望这些关系重叠。也就是说,我不希望数据库允许第二个关系(稍后开始的关系(的Effective_From_Date在第一个关系的Effective-From_Date和Effective_to_Date之间的时间段内。例如,如果Joe Smith是组织XYZ的成员,从1019年1月1日开始,到2019年6月15日结束,然后再次成为成员,我不希望数据库允许插入在1019年01月1日到2019年06月15日期间开始(具有Effective_From_Date(的第二段关系的记录。

如果有一种方法可以在MS Access中使用索引和验证规则来强制执行此约束,我该怎么做?

不幸的是,此类业务规则无法在表级别通过索引、规则或关系进行定义或管理。你可以开始采用商店程序,但最终呢?说数据库是否可以做到这一点?好吧,你的用户界面确实缺乏向用户反馈的能力。

因此,将此权限编码到您的数据输入表单中非常简单。通过这种方式,用户可以获得用户友好的提示和消息。

为了防止冲突,这里的逻辑很简单:

以下情况下发生碰撞:

请求开始日期<=结束日期和RequestEndDate>=开始日期

因此,上面的查询相当简单,但如果发生任何冲突以上将返回记录。。而且你根本不允许预订。在其他话虽如此,由于我们从不允许在发生碰撞的情况下预订,因此上述内容声明对我们有效。

dim strWhere                 as string 
dim dtRequeestStartDate      as date 
dim dtRequestEndDate         as date 
dtRequestStartDate = inputbox("Enter start Date") 
dtRequestEndDate = inputbox("Enter end date") 

strWhere="#" & format(dtRequestStartDate,"mm/­dd/yyyy") & "# <= EndDate" & _ 
" and #" & format(dtRequestEndDate,"mm/dd­/yyyy") & "#  >= StartDate" 

if dcount("*","tableBooking",strW­here) > 0 then 
msgbox "sorry, you cant book 
...bla bla bla.... 

以上只是一个例子,我相信你会构建一个很好的表单提示用户输入预订日期或在数据输入过程中获取此信息。

然而,这里好的是,上面概述的简单条件和逻辑确实返回了该日期范围内的任何冲突或任何重叠。这包括一端在内侧,或两端从外侧开始,或一端在起始/结束间隙之间。

最新更新