MS Access 2016:如何在BeforeUpdate事件中添加两个独立校验条件
解决方法
调整逻辑执行顺序:确保父记录校验通过后,才执行重复日期校验。原代码中第一个条件触发后直接
Exit Sub,若第二个校验代码写在该语句之后,永远不会运行。需将重复校验放在父ID非空的执行分支中。修复日期格式拼接问题:Access对日期的识别依赖
mm/dd/yyyy格式(而非dd/mm/yyyy),否则会因地区设置差异导致日期解析错误,使DCount查询失效。排除当前记录(编辑场景):编辑现有记录时,DCount会把当前记录算入重复项,需添加条件排除自身主键(如果子表有主键字段,比如
DiscussedID)。
修正后的完整代码:
Private Sub Discussed_BeforeUpdate(Cancel As Integer) ' 校验1:父记录必须已创建 If IsNull(Me.Parent.ID) Then MsgBox "请先填写父记录的问题详情,再保存本条记录", vbOKOnly Cancel = True Exit Sub End If ' 校验2:同一Issue_ID下不能有重复日期 Dim strCriteria As String ' 转换为Access识别的日期格式 Dim formattedDate As String formattedDate = Format(Me.Discussed, "mm/dd/yyyy") ' 构建查询条件,若Issue_ID是文本类型,需改为:[Issue_ID]= '" & Me.Issue_ID & "'" strCriteria = "[Issue_ID]= " & Me.Issue_ID & " AND [Discussed]= #" & formattedDate & "#" ' 编辑记录时排除当前自身,避免误判重复 If Not Me.NewRecord Then strCriteria = strCriteria & " AND [DiscussedID] <> " & Me.DiscussedID End If ' 执行重复检查 If DCount("*", "Discussed", strCriteria) > 0 Then MsgBox "该日期已存在,请重新输入。", vbInformation, "日期重复!" Cancel = True Me.Discussed.Undo End If End Sub
- 关键说明:
- 父ID校验通过后才进入重复校验逻辑,避免因
Exit Sub跳过后续代码。 - 日期格式改为
mm/dd/yyyy,确保Access能正确解析查询条件中的日期。 - 添加
Not Me.NewRecord判断,编辑时排除当前记录,避免误判重复。 - 如果
Issue_ID是文本类型,需调整条件中的引号格式,否则会因语法错误导致DCount失效。
- 父ID校验通过后才进入重复校验逻辑,避免因
内容的提问来源于stack exchange,提问作者Paula Morrison
相关产品推荐
相关产品推荐

